Branch data Line data Source code
# 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 : : # 10 : : template <class T> # 11 : 130261705 : struct 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 : : */ # 23 : : template <class K, class T> # 24 : : class indirectmap { # 25 : : private: # 26 : : typedef std::map<const K*, T, DereferencingComparator<const K*> > base; # 27 : : base m; # 28 : : public: # 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 : 93109 : std::pair<iterator, bool> insert(const value_type& value) { return m.insert(value); } # 36 : : # 37 : : // pass address (value interface) # 38 : 222172 : iterator find(const K& key) { return m.find(&key); } # 39 : 7611561 : const_iterator find(const K& key) const { return m.find(&key); } # 40 : 293 : iterator lower_bound(const K& key) { return m.lower_bound(&key); } # 41 : 5226130 : const_iterator lower_bound(const K& key) const { return m.lower_bound(&key); } # 42 : 81808 : size_type erase(const K& key) { return m.erase(&key); } # 43 : 4989 : size_type count(const K& key) const { return m.count(&key); } # 44 : : # 45 : : // passthrough # 46 : : bool empty() const { return m.empty(); } # 47 : 353859 : size_type size() const { return m.size(); } # 48 : : size_type max_size() const { return m.max_size(); } # 49 : 5632 : void clear() { m.clear(); } # 50 : : iterator begin() { return m.begin(); } # 51 : 227198 : iterator end() { return m.end(); } # 52 : : const_iterator begin() const { return m.begin(); } # 53 : 12867121 : const_iterator end() const { return m.end(); } # 54 : 86276 : const_iterator cbegin() const { return m.cbegin(); } # 55 : 7630169 : const_iterator cend() const { return m.cend(); } # 56 : : }; # 57 : : # 58 : : #endif // BITCOIN_INDIRECTMAP_H