199
72
bucket_array_type buckets;
73
simple_kv_persistent *data;
74
75 public:
76 simple_kv_runtime(simple_kv_persistent *data)
77 {
78
this->data = data;
79
80
for (std::size_t i = 0; i < data->values.size(); i++) {
81
auto volatile_key = std::string(data->keys[i].c_str(),
82
data->keys[i].size());
83
84
auto index = std::hash{}(volatile_key)%N;
85
buckets[index].emplace_back(
86
bucket_entry_type{volatile_key, i});
87
}
88
}
89
90
const Value &
91
get(const std::string &key) const
92
{
93
auto index = std::hash{}(key) % N;
94
95
for (const auto &e : buckets[index]) {
96
if (e.first == key)
97
return data->values[e.second];
98
}
99
100
throw std::out_of_range("no entry in simplekv");
101 }
102
103 void
104 put(const std::string &key, const Value &val)
105 {
106
auto index = std::hash{}(key) % N;
107
Chapter 11 Designing Data struCtures for persistent MeMory
72
bucket_array_type buckets;
73
simple_kv_persistent
74
75 public:
76 simple_kv_runtime(simple_kv_persistent
77 {
78
this->data = data;
79
80
for (std::size_t i = 0; i < data->values.size(); i++) {
81
auto volatile_key = std::string(data->keys[i].c_str(),
82
data->keys[i].size());
83
84
auto index = std::hash
85
buckets[index].emplace_back(
86
bucket_entry_type{volatile_key, i});
87
}
88
}
89
90
const Value &
91
get(const std::string &key) const
92
{
93
auto index = std::hash
94
95
for (const auto &e : buckets[index]) {
96
if (e.first == key)
97
return data->values[e.second];
98
}
99
100
throw std::out_of_range("no entry in simplekv");
101 }
102
103 void
104 put(const std::string &key, const Value &val)
105 {
106
auto index = std::hash
107
Chapter 11 Designing Data struCtures for persistent MeMory
