Bitcoin Core 28.99.0
P2P Digital Currency
indirectmap.h
Go to the documentation of this file.
1// Copyright (c) 2016-2020 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.
4
5#ifndef BITCOIN_INDIRECTMAP_H
6#define BITCOIN_INDIRECTMAP_H
7
8#include <map>
9
10template <class T>
11struct DereferencingComparator { bool operator()(const T a, const T b) const { return *a < *b; } };
12
13/* Map whose keys are pointers, but are compared by their dereferenced values.
14 *
15 * Differs from a plain std::map<const K*, T, DereferencingComparator<K*> > in
16 * that methods that take a key for comparison take a K rather than taking a K*
17 * (taking a K* would be confusing, since it's the value rather than the address
18 * of the object for comparison that matters due to the dereferencing comparator).
19 *
20 * Objects pointed to by keys must not be modified in any way that changes the
21 * result of DereferencingComparator.
22 */
23template <class K, class T>
25private:
26 typedef std::map<const K*, T, DereferencingComparator<const K*> > base;
28public:
29 typedef typename base::iterator iterator;
30 typedef typename base::const_iterator const_iterator;
31 typedef typename base::size_type size_type;
32 typedef typename base::value_type value_type;
33
34 // passthrough (pointer interface)
35 std::pair<iterator, bool> insert(const value_type& value) { return m.insert(value); }
36
37 // pass address (value interface)
38 iterator find(const K& key) { return m.find(&key); }
39 const_iterator find(const K& key) const { return m.find(&key); }
40 iterator lower_bound(const K& key) { return m.lower_bound(&key); }
41 const_iterator lower_bound(const K& key) const { return m.lower_bound(&key); }
42 size_type erase(const K& key) { return m.erase(&key); }
43 size_type count(const K& key) const { return m.count(&key); }
44
45 // passthrough
46 bool empty() const { return m.empty(); }
47 size_type size() const { return m.size(); }
48 size_type max_size() const { return m.max_size(); }
49 void clear() { m.clear(); }
50 iterator begin() { return m.begin(); }
51 iterator end() { return m.end(); }
52 const_iterator begin() const { return m.begin(); }
53 const_iterator end() const { return m.end(); }
54 const_iterator cbegin() const { return m.cbegin(); }
55 const_iterator cend() const { return m.cend(); }
56};
57
58#endif // BITCOIN_INDIRECTMAP_H
iterator lower_bound(const K &key)
Definition: indirectmap.h:40
const_iterator cbegin() const
Definition: indirectmap.h:54
base::const_iterator const_iterator
Definition: indirectmap.h:30
bool empty() const
Definition: indirectmap.h:46
iterator begin()
Definition: indirectmap.h:50
size_type size() const
Definition: indirectmap.h:47
base::iterator iterator
Definition: indirectmap.h:29
iterator find(const K &key)
Definition: indirectmap.h:38
const_iterator cend() const
Definition: indirectmap.h:55
std::map< const K *, T, DereferencingComparator< const K * > > base
Definition: indirectmap.h:26
const_iterator lower_bound(const K &key) const
Definition: indirectmap.h:41
size_type max_size() const
Definition: indirectmap.h:48
size_type erase(const K &key)
Definition: indirectmap.h:42
base::value_type value_type
Definition: indirectmap.h:32
const_iterator end() const
Definition: indirectmap.h:53
std::pair< iterator, bool > insert(const value_type &value)
Definition: indirectmap.h:35
iterator end()
Definition: indirectmap.h:51
base::size_type size_type
Definition: indirectmap.h:31
size_type count(const K &key) const
Definition: indirectmap.h:43
void clear()
Definition: indirectmap.h:49
const_iterator find(const K &key) const
Definition: indirectmap.h:39
const_iterator begin() const
Definition: indirectmap.h:52
bool operator()(const T a, const T b) const
Definition: indirectmap.h:11