Coverage Report

Created: 2024-08-21 05:08

/workdir/bitcoin/src/indirectmap.h
Line
Count
Source (jump to first uncovered line)
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
0
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
0
    std::pair<iterator, bool> insert(const value_type& value) { return m.insert(value); }
36
37
    // pass address (value interface)
38
0
    iterator find(const K& key)                     { return m.find(&key); }
39
0
    const_iterator find(const K& key) const         { return m.find(&key); }
40
0
    iterator lower_bound(const K& key)              { return m.lower_bound(&key); }
41
0
    const_iterator lower_bound(const K& key) const  { return m.lower_bound(&key); }
42
0
    size_type erase(const K& key)                   { return m.erase(&key); }
43
0
    size_type count(const K& key) const             { return m.count(&key); }
44
45
    // passthrough
46
    bool empty() const              { return m.empty(); }
47
0
    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
0
    iterator end()                  { return m.end(); }
52
    const_iterator begin() const    { return m.begin(); }
53
0
    const_iterator end() const      { return m.end(); }
54
0
    const_iterator cbegin() const   { return m.cbegin(); }
55
0
    const_iterator cend() const     { return m.cend(); }
56
};
57
58
#endif // BITCOIN_INDIRECTMAP_H