#pragma once
#include "common/entry_index.h"
#include "root.h"
#include <span>
#include <vector>
namespace whiteout::interfaces {
class WorkerPool;
}
namespace whiteout::storages::casc {
class S1Root final : public RootManifest {
public:
static std::unique_ptr<S1Root> parse(std::span<const u8> data,
interfaces::WorkerPool* pool = nullptr);
static bool looksLikeS1Root(std::span<const u8> data);
std::vector<const RootEntry*> findByPath(const std::string& path) const override;
std::vector<const RootEntry*> findByFileDataId(
u32 fileDataId, FileIdHint hint = FileIdHint::None) const override;
bool hasFileDataId(u32, FileIdHint = FileIdHint::None) const override {
return false;
}
RootFormat format() const override {
return RootFormat::Agent;
}
protected:
const std::vector<RootEntry>& entries() const override {
return m_entries;
}
std::vector<RootEntry>& mutableEntries() override {
return m_entries;
}
private:
std::vector<RootEntry> m_entries;
EntryIndex<u64> m_byNameHash;
EntryIndex<std::string> m_byPath;
void buildIndices();
};
}