#pragma once
#include <whiteout/common_types.h>
#include <whiteout/compatibility.h>
#include <whiteout/sno/sno_types.h>
#include <string>
#include <unordered_map>
#include <vector>
namespace whiteout {
namespace sno {
struct TocEntry {
SnoGroup group;
i32 snoId;
std::string name;
};
enum class CoreTocFormat {
Unknown,
D3Legacy, D4Old, D4New, };
class CoreToc {
public:
CoreToc() = default;
bool parse(std::span<const u8> data);
CoreTocFormat format() const {
return m_format;
}
std::span<const TocEntry> entriesForGroup(SnoGroup group) const;
const TocEntry* findById(i32 snoId) const;
size_t size() const {
return m_all.size();
}
std::span<const TocEntry> entries() const {
return m_all;
}
const std::unordered_map<i32, u32>& formatHashes() const {
return m_formatHashes;
}
bool addEntry(const TocEntry& entry);
const TocEntry* findByName(SnoGroup group, const std::string& name) const;
i32 maxSnoId() const;
std::vector<u8> serializeD3Legacy() const;
std::vector<u8> serializeD4New() const;
private:
std::vector<TocEntry> m_all;
std::unordered_map<i32, std::pair<size_t, size_t>> m_groupIndex;
std::unordered_map<i32, size_t> m_idIndex;
std::unordered_map<i32, u32> m_formatHashes;
CoreTocFormat m_format = CoreTocFormat::Unknown;
bool parseD3Legacy(std::span<const u8> data);
bool parseD4(std::span<const u8> data, bool newFormat);
};
} }