1 // Copyright (c) 2016 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef BITCOIN_INDIRECTMAP_H
6 #define BITCOIN_INDIRECTMAP_H
9 struct DereferencingComparator
{ bool operator()(const T a
, const T b
) const { return *a
< *b
; } };
11 /* Map whose keys are pointers, but are compared by their dereferenced values.
13 * Differs from a plain std::map<const K*, T, DereferencingComparator<K*> > in
14 * that methods that take a key for comparison take a K rather than taking a K*
15 * (taking a K* would be confusing, since it's the value rather than the address
16 * of the object for comparison that matters due to the dereferencing comparator).
18 * Objects pointed to by keys must not be modified in any way that changes the
19 * result of DereferencingComparator.
21 template <class K
, class T
>
24 typedef std::map
<const K
*, T
, DereferencingComparator
<const K
*> > base
;
27 typedef typename
base::iterator iterator
;
28 typedef typename
base::const_iterator const_iterator
;
29 typedef typename
base::size_type size_type
;
30 typedef typename
base::value_type value_type
;
32 // passthrough (pointer interface)
33 std::pair
<iterator
, bool> insert(const value_type
& value
) { return m
.insert(value
); }
35 // pass address (value interface)
36 iterator
find(const K
& key
) { return m
.find(&key
); }
37 const_iterator
find(const K
& key
) const { return m
.find(&key
); }
38 iterator
lower_bound(const K
& key
) { return m
.lower_bound(&key
); }
39 const_iterator
lower_bound(const K
& key
) const { return m
.lower_bound(&key
); }
40 size_type
erase(const K
& key
) { return m
.erase(&key
); }
41 size_type
count(const K
& key
) const { return m
.count(&key
); }
44 bool empty() const { return m
.empty(); }
45 size_type
size() const { return m
.size(); }
46 size_type
max_size() const { return m
.max_size(); }
47 void clear() { m
.clear(); }
48 iterator
begin() { return m
.begin(); }
49 iterator
end() { return m
.end(); }
50 const_iterator
begin() const { return m
.begin(); }
51 const_iterator
end() const { return m
.end(); }
52 const_iterator
cbegin() const { return m
.cbegin(); }
53 const_iterator
cend() const { return m
.cend(); }
56 #endif // BITCOIN_INDIRECTMAP_H