parser: disk_hash type

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
Reviewed-by: Nadav Har'El <nyh@cloudius-systems.com>
This commit is contained in:
Glauber Costa
2015-02-19 14:33:15 -05:00
parent 110facf479
commit cc4f8f09e5
2 changed files with 34 additions and 0 deletions

View File

@@ -178,6 +178,34 @@ future<> parse(file_input_stream& in, disk_array<Size, Members>& arr) {
});
}
template <typename Size, typename Key, typename Value>
future<> parse(file_input_stream& in, Size& len, std::unordered_map<Key, Value>& map) {
auto count = make_lw_shared<Size>();
auto eos = [len, count] { return len == *count; };
return do_until(eos, [len, count, &in, &map] {
struct kv {
Key key;
Value value;
};
++*count;
auto el = std::make_unique<kv>();
auto f = parse(in, el->key, el->value);
return f.then([el = std::move(el), &map] {
map.emplace(el->key, el->value);
});
});
}
template <typename Size, typename Key, typename Value>
future<> parse(file_input_stream& in, disk_hash<Size, Key, Value>& h) {
auto w = std::make_unique<Size>();
auto f = parse(in, *w);
return f.then([&in, &h, w = std::move(w)] {
return parse(in, *w, h.map);
});
}
const bool sstable::has_component(component_type f) {
return _components.count(f);
}

View File

@@ -1,5 +1,7 @@
#pragma once
#include "core/enum.hh"
namespace sstables {
// Some in-disk structures have an associated integer (of varying sizes) that
@@ -22,4 +24,8 @@ struct disk_array {
std::vector<Members> elements;
};
template <typename Size, typename Key, typename Value>
struct disk_hash {
std::unordered_map<Key, Value, std::hash<Key>> map;
};
}