xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
include
xrpl
basics
partitioned_unordered_map.h
1
#pragma once
2
3
#include <xrpl/beast/hash/uhash.h>
4
#include <xrpl/beast/utility/instrumentation.h>
5
6
#include <
cstddef
>
7
#include <
functional
>
8
#include <
iterator
>
9
#include <
memory
>
10
#include <
optional
>
11
#include <
string
>
12
#include <
thread
>
13
#include <
unordered_map
>
14
#include <
utility
>
15
#include <
vector
>
16
17
namespace
xrpl
{
18
19
template
<
typename
Key>
20
static
std::size_t
21
extract
(Key
const
& key)
22
{
23
return
key;
24
}
25
26
template
<>
27
inline
std::size_t
28
extract
(
std::string
const
& key)
29
{
30
return ::beast::Uhash<>{}(key);
31
}
32
33
template
<
34
typename
Key,
35
typename
Value,
36
typename
Hash,
37
typename
Pred =
std::equal_to<Key>
,
38
typename
Alloc =
std::allocator<std::pair<Key const, Value>
>>
39
class
PartitionedUnorderedMap
40
{
41
std::size_t
partitions_
;
42
43
public
:
44
using
key_type
= Key;
45
using
mapped_type
= Value;
46
using
value_type
=
std::pair<Key const, mapped_type>
;
47
using
size_type
=
std::size_t
;
48
using
difference_type
=
std::size_t
;
49
using
hasher
= Hash;
50
using
key_equal
= Pred;
51
using
allocator_type
= Alloc;
52
using
reference
=
value_type
&;
53
using
const_reference
=
value_type
const
&;
54
using
pointer
=
value_type
*;
55
using
const_pointer
=
value_type
const
*;
56
using
MapType
=
std::unordered_map<key_type, mapped_type, hasher, key_equal, allocator_type>
;
57
using
PartitionMapType
=
std::vector<MapType>
;
58
59
struct
Iterator
60
{
61
using
iterator_category
=
std::forward_iterator_tag
;
62
PartitionMapType
*
map
{
nullptr
};
63
PartitionMapType::iterator
ait
{};
64
MapType::iterator
mit
;
65
66
Iterator
() =
default
;
67
68
Iterator
(
PartitionMapType
* m) :
map
(m)
69
{
70
}
71
72
reference
73
operator*
()
const
74
{
75
return
*
mit
;
76
}
77
78
pointer
79
operator->
()
const
80
{
81
return
&(*mit);
82
}
83
84
void
85
inc
()
86
{
87
++
mit
;
88
while
(
mit
==
ait
->end())
89
{
90
++
ait
;
91
if
(
ait
==
map
->end())
92
return
;
93
mit
=
ait
->begin();
94
}
95
}
96
97
// ++it
98
Iterator
&
99
operator++
()
100
{
101
inc
();
102
return
*
this
;
103
}
104
105
// it++
106
Iterator
107
operator++
(
int
)
108
{
109
Iterator
tmp(*
this
);
110
inc
();
111
return
tmp;
112
}
113
114
friend
bool
115
operator==
(
Iterator
const
& lhs,
Iterator
const
& rhs)
116
{
117
return
lhs.
map
== rhs.
map
&& lhs.
ait
== rhs.
ait
&& lhs.
mit
== rhs.
mit
;
118
}
119
};
120
121
struct
ConstIterator
122
{
123
using
iterator_category
=
std::forward_iterator_tag
;
124
125
PartitionMapType
*
map
{
nullptr
};
126
PartitionMapType::iterator
ait
{};
127
MapType::iterator
mit
;
128
129
ConstIterator
() =
default
;
130
131
ConstIterator
(
PartitionMapType
* m) :
map
(m)
132
{
133
}
134
135
ConstIterator
(
Iterator
const
& orig) :
map
(orig.
map
),
ait
(orig.
ait
),
mit
(orig.
mit
)
136
{
137
}
138
139
const_reference
140
operator*
()
const
141
{
142
return
*
mit
;
143
}
144
145
const_pointer
146
operator->
()
const
147
{
148
return
&(*mit);
149
}
150
151
void
152
inc
()
153
{
154
++
mit
;
155
while
(
mit
==
ait
->end())
156
{
157
++
ait
;
158
if
(
ait
==
map
->end())
159
return
;
160
mit
=
ait
->begin();
161
}
162
}
163
164
// ++it
165
ConstIterator
&
166
operator++
()
167
{
168
inc
();
169
return
*
this
;
170
}
171
172
// it++
173
ConstIterator
174
operator++
(
int
)
175
{
176
ConstIterator
tmp(*
this
);
177
inc
();
178
return
tmp;
179
}
180
181
friend
bool
182
operator==
(
ConstIterator
const
& lhs,
ConstIterator
const
& rhs)
183
{
184
return
lhs.
map
== rhs.
map
&& lhs.
ait
== rhs.
ait
&& lhs.
mit
== rhs.
mit
;
185
}
186
};
187
188
private
:
189
std::size_t
190
partitioner
(Key
const
& key)
const
191
{
192
return
extract
(key) %
partitions_
;
193
}
194
195
template
<
class
T>
196
static
void
197
end
(T& it)
198
{
199
it.ait = it.map->end();
200
it.mit = it.map->back().end();
201
}
202
203
template
<
class
T>
204
static
void
205
begin
(T& it)
206
{
207
for
(it.ait = it.map->begin(); it.ait != it.map->end(); ++it.ait)
208
{
209
if
(it.ait->begin() == it.ait->end())
210
continue
;
211
it.mit = it.ait->begin();
212
return
;
213
}
214
end
(it);
215
}
216
217
public
:
218
PartitionedUnorderedMap
(
std::optional<std::size_t>
partitions
= std::nullopt)
219
// Set partitions to the number of hardware threads if the parameter
220
// is either empty or set to 0.
221
:
partitions_
(
222
partitions
&& (*
partitions
!= 0u) ? *
partitions
:
std
::thread::hardware_concurrency())
223
{
224
map_
.resize(
partitions_
);
225
XRPL_ASSERT(
226
partitions_
,
227
"xrpl::PartitionedUnorderedMap::PartitionedUnorderedMap : "
228
"nonzero partitions"
);
229
}
230
231
std::size_t
232
partitions
()
const
233
{
234
return
partitions_
;
235
}
236
237
PartitionMapType
&
238
map
()
239
{
240
return
map_
;
241
}
242
243
Iterator
244
begin
()
245
{
246
Iterator it(&
map_
);
247
begin
(it);
248
return
it;
249
}
250
251
ConstIterator
252
cbegin
()
const
253
{
254
ConstIterator it(&
map_
);
255
begin
(it);
256
return
it;
257
}
258
259
ConstIterator
260
begin
()
const
261
{
262
return
cbegin
();
263
}
264
265
Iterator
266
end
()
267
{
268
Iterator it(&
map_
);
269
end
(it);
270
return
it;
271
}
272
273
ConstIterator
274
cend
()
const
275
{
276
ConstIterator it(&
map_
);
277
end
(it);
278
return
it;
279
}
280
281
ConstIterator
282
end
()
const
283
{
284
return
cend
();
285
}
286
287
private
:
288
template
<
class
T>
289
void
290
find
(
key_type
const
& key, T& it)
const
291
{
292
it.ait = it.map->begin() +
partitioner
(key);
293
it.mit = it.ait->find(key);
294
if
(it.mit == it.ait->end())
295
end
(it);
296
}
297
298
public
:
299
Iterator
300
find
(
key_type
const
& key)
301
{
302
Iterator it(&
map_
);
303
find
(key, it);
304
return
it;
305
}
306
307
ConstIterator
308
find
(
key_type
const
& key)
const
309
{
310
ConstIterator it(&
map_
);
311
find
(key, it);
312
return
it;
313
}
314
315
template
<
class
T,
class
U>
316
std::pair<Iterator, bool>
317
emplace
(
std::piecewise_construct_t
const
&, T&& keyTuple, U&& valueTuple)
318
{
319
auto
const
& key = std::get<0>(keyTuple);
320
Iterator it(&
map_
);
321
it.ait = it.map->
begin
() +
partitioner
(key);
322
auto
[eit, inserted] = it.ait->emplace(
323
std::piecewise_construct
,
std::forward<T>
(keyTuple),
std::forward<U>
(valueTuple));
324
it.mit = eit;
325
return
{it, inserted};
326
}
327
328
template
<
class
T,
class
U>
329
std::pair<Iterator, bool>
330
emplace
(T&& key, U&& val)
331
{
332
Iterator it(&
map_
);
333
it.ait = it.map->
begin
() +
partitioner
(key);
334
auto
[eit, inserted] = it.ait->emplace(
std::forward<T>
(key),
std::forward<U>
(val));
335
it.mit = eit;
336
return
{it, inserted};
337
}
338
339
void
340
clear
()
341
{
342
for
(
auto
& p :
map_
)
343
p.clear();
344
}
345
346
Iterator
347
erase
(ConstIterator position)
348
{
349
Iterator it(&
map_
);
350
it.ait = position.ait;
351
it.mit = position.ait->erase(position.mit);
352
353
while
(it.mit == it.ait->end())
354
{
355
++it.ait;
356
if
(it.ait == it.map->
end
())
357
break
;
358
it.mit = it.ait->begin();
359
}
360
361
return
it;
362
}
363
364
std::size_t
365
size
()
const
366
{
367
std::size_t
ret = 0;
368
for
(
auto
& p :
map_
)
369
ret += p.size();
370
return
ret;
371
}
372
373
Value&
374
operator[]
(Key
const
& key)
375
{
376
return
map_
[
partitioner
(key)][key];
377
}
378
379
private
:
380
mutable
PartitionMapType
map_
{};
381
};
382
383
}
// namespace xrpl
std::allocator
std::string
std::vector::begin
T begin(T... args)
xrpl::PartitionedUnorderedMap< Key, Value, Hash, Pred, Allocator >::partitions_
std::size_t partitions_
Definition
partitioned_unordered_map.h:41
xrpl::PartitionedUnorderedMap::find
Iterator find(key_type const &key)
Definition
partitioned_unordered_map.h:300
xrpl::PartitionedUnorderedMap::pointer
value_type * pointer
Definition
partitioned_unordered_map.h:54
xrpl::PartitionedUnorderedMap::MapType
std::unordered_map< key_type, mapped_type, hasher, key_equal, allocator_type > MapType
Definition
partitioned_unordered_map.h:56
xrpl::PartitionedUnorderedMap::end
Iterator end()
Definition
partitioned_unordered_map.h:266
xrpl::PartitionedUnorderedMap::find
void find(key_type const &key, T &it) const
Definition
partitioned_unordered_map.h:290
xrpl::PartitionedUnorderedMap::begin
ConstIterator begin() const
Definition
partitioned_unordered_map.h:260
xrpl::PartitionedUnorderedMap::PartitionedUnorderedMap
PartitionedUnorderedMap(std::optional< std::size_t > partitions=std::nullopt)
Definition
partitioned_unordered_map.h:218
xrpl::PartitionedUnorderedMap::value_type
std::pair< Key const, mapped_type > value_type
Definition
partitioned_unordered_map.h:46
xrpl::PartitionedUnorderedMap::key_equal
Pred key_equal
Definition
partitioned_unordered_map.h:50
xrpl::PartitionedUnorderedMap::clear
void clear()
Definition
partitioned_unordered_map.h:340
xrpl::PartitionedUnorderedMap::cend
ConstIterator cend() const
Definition
partitioned_unordered_map.h:274
xrpl::PartitionedUnorderedMap::operator[]
Value & operator[](Key const &key)
Definition
partitioned_unordered_map.h:374
xrpl::PartitionedUnorderedMap::const_pointer
value_type const * const_pointer
Definition
partitioned_unordered_map.h:55
xrpl::PartitionedUnorderedMap::begin
static void begin(T &it)
Definition
partitioned_unordered_map.h:205
xrpl::PartitionedUnorderedMap< Key, Value, Hash, Pred, Allocator >::partitions
std::size_t partitions() const
Definition
partitioned_unordered_map.h:232
xrpl::PartitionedUnorderedMap< Key, Value, Hash, Pred, Allocator >::map_
PartitionMapType map_
Definition
partitioned_unordered_map.h:380
xrpl::PartitionedUnorderedMap::erase
Iterator erase(ConstIterator position)
Definition
partitioned_unordered_map.h:347
xrpl::PartitionedUnorderedMap::begin
Iterator begin()
Definition
partitioned_unordered_map.h:244
xrpl::PartitionedUnorderedMap::size
std::size_t size() const
Definition
partitioned_unordered_map.h:365
xrpl::PartitionedUnorderedMap::allocator_type
Alloc allocator_type
Definition
partitioned_unordered_map.h:51
xrpl::PartitionedUnorderedMap::cbegin
ConstIterator cbegin() const
Definition
partitioned_unordered_map.h:252
xrpl::PartitionedUnorderedMap::difference_type
std::size_t difference_type
Definition
partitioned_unordered_map.h:48
xrpl::PartitionedUnorderedMap::partitioner
std::size_t partitioner(Key const &key) const
Definition
partitioned_unordered_map.h:190
xrpl::PartitionedUnorderedMap::emplace
std::pair< Iterator, bool > emplace(std::piecewise_construct_t const &, T &&keyTuple, U &&valueTuple)
Definition
partitioned_unordered_map.h:317
xrpl::PartitionedUnorderedMap::end
ConstIterator end() const
Definition
partitioned_unordered_map.h:282
xrpl::PartitionedUnorderedMap::const_reference
value_type const & const_reference
Definition
partitioned_unordered_map.h:53
xrpl::PartitionedUnorderedMap::size_type
std::size_t size_type
Definition
partitioned_unordered_map.h:47
xrpl::PartitionedUnorderedMap::reference
value_type & reference
Definition
partitioned_unordered_map.h:52
xrpl::PartitionedUnorderedMap::hasher
Hash hasher
Definition
partitioned_unordered_map.h:49
xrpl::PartitionedUnorderedMap::emplace
std::pair< Iterator, bool > emplace(T &&key, U &&val)
Definition
partitioned_unordered_map.h:330
xrpl::PartitionedUnorderedMap::key_type
Key key_type
Definition
partitioned_unordered_map.h:44
xrpl::PartitionedUnorderedMap::find
ConstIterator find(key_type const &key) const
Definition
partitioned_unordered_map.h:308
xrpl::PartitionedUnorderedMap::mapped_type
Value mapped_type
Definition
partitioned_unordered_map.h:45
xrpl::PartitionedUnorderedMap::end
static void end(T &it)
Definition
partitioned_unordered_map.h:197
xrpl::PartitionedUnorderedMap::PartitionMapType
std::vector< MapType > PartitionMapType
Definition
partitioned_unordered_map.h:57
xrpl::PartitionedUnorderedMap::map
PartitionMapType & map()
Definition
partitioned_unordered_map.h:238
cstddef
std::vector::end
T end(T... args)
std::equal_to
std::forward
T forward(T... args)
functional
iterator
std::forward_iterator_tag
memory
std
STL namespace.
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::extract
std::size_t extract(UInt256 const &key)
Definition
base_uint.h:679
optional
std::pair
std::piecewise_construct
T piecewise_construct
std::piecewise_construct_t
std::size_t
string
xrpl::PartitionedUnorderedMap::ConstIterator
Definition
partitioned_unordered_map.h:122
xrpl::PartitionedUnorderedMap::ConstIterator::iterator_category
std::forward_iterator_tag iterator_category
Definition
partitioned_unordered_map.h:123
xrpl::PartitionedUnorderedMap::ConstIterator::ConstIterator
ConstIterator()=default
xrpl::PartitionedUnorderedMap::ConstIterator::operator++
ConstIterator & operator++()
Definition
partitioned_unordered_map.h:166
xrpl::PartitionedUnorderedMap::ConstIterator::operator==
friend bool operator==(ConstIterator const &lhs, ConstIterator const &rhs)
Definition
partitioned_unordered_map.h:182
xrpl::PartitionedUnorderedMap::ConstIterator::inc
void inc()
Definition
partitioned_unordered_map.h:152
xrpl::PartitionedUnorderedMap::ConstIterator::ConstIterator
ConstIterator(PartitionMapType *m)
Definition
partitioned_unordered_map.h:131
xrpl::PartitionedUnorderedMap::ConstIterator::ait
PartitionMapType::iterator ait
Definition
partitioned_unordered_map.h:126
xrpl::PartitionedUnorderedMap::ConstIterator::mit
MapType::iterator mit
Definition
partitioned_unordered_map.h:127
xrpl::PartitionedUnorderedMap::ConstIterator::map
PartitionMapType * map
Definition
partitioned_unordered_map.h:125
xrpl::PartitionedUnorderedMap::ConstIterator::operator*
const_reference operator*() const
Definition
partitioned_unordered_map.h:140
xrpl::PartitionedUnorderedMap::ConstIterator::operator->
const_pointer operator->() const
Definition
partitioned_unordered_map.h:146
xrpl::PartitionedUnorderedMap::ConstIterator::ConstIterator
ConstIterator(Iterator const &orig)
Definition
partitioned_unordered_map.h:135
xrpl::PartitionedUnorderedMap::ConstIterator::operator++
ConstIterator operator++(int)
Definition
partitioned_unordered_map.h:174
xrpl::PartitionedUnorderedMap::Iterator
Definition
partitioned_unordered_map.h:60
xrpl::PartitionedUnorderedMap::Iterator::operator*
reference operator*() const
Definition
partitioned_unordered_map.h:73
xrpl::PartitionedUnorderedMap::Iterator::iterator_category
std::forward_iterator_tag iterator_category
Definition
partitioned_unordered_map.h:61
xrpl::PartitionedUnorderedMap::Iterator::operator++
Iterator operator++(int)
Definition
partitioned_unordered_map.h:107
xrpl::PartitionedUnorderedMap::Iterator::ait
PartitionMapType::iterator ait
Definition
partitioned_unordered_map.h:63
xrpl::PartitionedUnorderedMap::Iterator::operator==
friend bool operator==(Iterator const &lhs, Iterator const &rhs)
Definition
partitioned_unordered_map.h:115
xrpl::PartitionedUnorderedMap::Iterator::map
PartitionMapType * map
Definition
partitioned_unordered_map.h:62
xrpl::PartitionedUnorderedMap::Iterator::Iterator
Iterator()=default
xrpl::PartitionedUnorderedMap::Iterator::operator->
pointer operator->() const
Definition
partitioned_unordered_map.h:79
xrpl::PartitionedUnorderedMap::Iterator::operator++
Iterator & operator++()
Definition
partitioned_unordered_map.h:99
xrpl::PartitionedUnorderedMap::Iterator::mit
MapType::iterator mit
Definition
partitioned_unordered_map.h:64
xrpl::PartitionedUnorderedMap::Iterator::inc
void inc()
Definition
partitioned_unordered_map.h:85
xrpl::PartitionedUnorderedMap::Iterator::Iterator
Iterator(PartitionMapType *m)
Definition
partitioned_unordered_map.h:68
thread
unordered_map
utility
vector
Generated by
1.17.0