#pragma once
#include <whiteout/common_types.h>
#include <span>
#include <string>
#include <vector>
namespace whiteout::storages::mpq {
enum class CompressionFlag : u8 {
None = 0,
kHuffman = 0x01,
kZlib = 0x02,
kPKware = 0x08,
kBZip2 = 0x10,
kLZMA = 0x12,
kSparse = 0x20,
kAdpcmMono = 0x40,
kAdpcmStereo = 0x80,
};
inline CompressionFlag operator|(CompressionFlag a, CompressionFlag b) noexcept {
return static_cast<CompressionFlag>(static_cast<u8>(a) | static_cast<u8>(b));
}
inline CompressionFlag operator&(CompressionFlag a, CompressionFlag b) noexcept {
return static_cast<CompressionFlag>(static_cast<u8>(a) & static_cast<u8>(b));
}
inline CompressionFlag operator~(CompressionFlag a) noexcept {
return static_cast<CompressionFlag>(~static_cast<u8>(a));
}
inline CompressionFlag& operator|=(CompressionFlag& a, CompressionFlag b) noexcept {
a = a | b;
return a;
}
inline CompressionFlag& operator&=(CompressionFlag& a, CompressionFlag b) noexcept {
a = a & b;
return a;
}
inline bool hasFlag(CompressionFlag flags, CompressionFlag flag) noexcept {
return (flags & flag) != CompressionFlag::None;
}
[[nodiscard]] std::vector<u8> mpqDecompress(std::span<const u8> src, size_t uncompressedSize,
std::string* error = nullptr);
[[nodiscard]] std::vector<u8> mpqCompress(std::span<const u8> src, CompressionFlag compressionType,
std::string* error = nullptr);
}