Merge #12062: Increment MIT Licence copyright header year on files modified in 2017
[bitcoinplatinum.git] / src / indirectmap.h
blob76da4a6bd5575af785318e9135c2079820c5ac2c
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
8 template <class T>
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>
22 class indirectmap {
23 private:
24 typedef std::map<const K*, T, DereferencingComparator<const K*> > base;
25 base m;
26 public:
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); }
43 // passthrough
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