mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-21 09:00:35 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user