#pragma once
#include "../root.h"
#include <unordered_map>
#include <vector>
namespace whiteout::storages::casc {
template <typename Key>
class EntryIndex {
public:
void reserve(size_t n) {
m_map.reserve(n);
}
void clear() {
m_map.clear();
}
void emplace(const Key& key, size_t index) {
m_map.emplace(key, index);
}
void emplace(Key&& key, size_t index) {
m_map.emplace(std::move(key), index);
}
std::vector<const RootEntry*> findAll(const std::vector<RootEntry>& entries,
const Key& key) const {
std::vector<const RootEntry*> results;
auto range = m_map.equal_range(key);
for (auto it = range.first; it != range.second; ++it)
results.push_back(&entries[it->second]);
return results;
}
bool contains(const Key& key) const {
return m_map.find(key) != m_map.end();
}
bool empty() const {
return m_map.empty();
}
size_t size() const {
return m_map.size();
}
private:
std::unordered_multimap<Key, size_t> m_map;
};
}