#pragma once
#include "common/entry_index.h"
#include "root.h"
#include <span>
#include <vector>
namespace whiteout::interfaces {
class WorkerPool;
}
namespace whiteout::storages::casc {
struct InstallTag {
std::string name;
i16 type = 0;
};
class InstallRoot final : public RootManifest {
public:
static std::unique_ptr<InstallRoot> parse(std::span<const u8> data,
interfaces::WorkerPool* pool = nullptr);
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;
}
const std::vector<InstallTag>& tags() const {
return m_tags;
}
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;
std::vector<InstallTag> m_tags;
EntryIndex<u64> m_byNameHash;
EntryIndex<std::string> m_byPath;
void buildIndices();
};
}