#pragma once
#include "BuildSettings.h"
#include "../common/misc_util.h"
#include "../common/FileReader.h"
#include "Sndfile.h"
#include "SampleIO.h"
OPENMPT_NAMESPACE_BEGIN
constexpr uint32 MagicLE(const char(&id)[5])
{
return static_cast<uint32>((static_cast<uint8>(id[3]) << 24) | (static_cast<uint8>(id[2]) << 16) | (static_cast<uint8>(id[1]) << 8) | static_cast<uint8>(id[0]));
}
constexpr uint16 MagicLE(const char(&id)[3])
{
return static_cast<uint16>((static_cast<uint8>(id[1]) << 8) | static_cast<uint8>(id[0]));
}
constexpr uint32 MagicBE(const char(&id)[5])
{
return static_cast<uint32>((static_cast<uint8>(id[0]) << 24) | (static_cast<uint8>(id[1]) << 16) | (static_cast<uint8>(id[2]) << 8) | static_cast<uint8>(id[3]));
}
constexpr uint16 MagicBE(const char(&id)[3])
{
return static_cast<uint16>((static_cast<uint8>(id[0]) << 8) | static_cast<uint8>(id[1]));
}
template<typename T, size_t arraySize>
bool ReadOrderFromArray(ModSequence &order, const T(&orders)[arraySize], size_t howMany = arraySize, uint16 stopIndex = uint16_max, uint16 ignoreIndex = uint16_max)
{
STATIC_ASSERT(mpt::is_binary_safe<T>::value);
LimitMax(howMany, arraySize);
LimitMax(howMany, MAX_ORDERS);
ORDERINDEX readEntries = static_cast<ORDERINDEX>(howMany);
order.resize(readEntries);
for(int i = 0; i < readEntries; i++)
{
PATTERNINDEX pat = static_cast<PATTERNINDEX>(orders[i]);
if(pat == stopIndex) pat = order.GetInvalidPatIndex();
else if(pat == ignoreIndex) pat = order.GetIgnoreIndex();
order.at(i) = pat;
}
return true;
}
template<typename T>
bool ReadOrderFromFile(ModSequence &order, FileReader &file, size_t howMany, uint16 stopIndex = uint16_max, uint16 ignoreIndex = uint16_max)
{
STATIC_ASSERT(mpt::is_binary_safe<T>::value);
if(!file.CanRead(howMany * sizeof(T)))
return false;
LimitMax(howMany, MAX_ORDERS);
ORDERINDEX readEntries = static_cast<ORDERINDEX>(howMany);
order.resize(readEntries);
T patF;
for(auto &pat : order)
{
file.ReadStruct(patF);
pat = static_cast<PATTERNINDEX>(patF);
if(pat == stopIndex) pat = order.GetInvalidPatIndex();
else if(pat == ignoreIndex) pat = order.GetIgnoreIndex();
}
return true;
}
OPENMPT_NAMESPACE_END