Coverage Report

Created: 2025-06-13 06:29

/src/gdal/port/cpl_mem_cache.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * LRUCache11 - a templated C++11 based LRU cache class that allows
3
 * specification of
4
 * key, value and optionally the map container type (defaults to
5
 * std::unordered_map)
6
 * By using the std::map and a linked list of keys it allows O(1) insert, delete
7
 * and
8
 * refresh operations.
9
 *
10
 * This is a header-only library and all you need is the LRUCache11.hpp file
11
 *
12
 * Github: https://github.com/mohaps/lrucache11
13
 *
14
 * This is a follow-up to the LRUCache project -
15
 * https://github.com/mohaps/lrucache
16
 *
17
 * Copyright (c) 2012-22 SAURAV MOHAPATRA <mohaps@gmail.com>
18
 *
19
 * Permission to use, copy, modify, and distribute this software for any
20
 * purpose with or without fee is hereby granted, provided that the above
21
 * copyright notice and this permission notice appear in all copies.
22
 *
23
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
24
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
26
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
27
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
28
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30
 */
31
32
/*! @cond Doxygen_Suppress */
33
34
#pragma once
35
#include <algorithm>
36
#include <cstdint>
37
#include <list>
38
#include <mutex>
39
#include <stdexcept>
40
#include <thread>
41
#include <unordered_map>
42
43
namespace lru11
44
{
45
/*
46
 * a noop lockable concept that can be used in place of std::mutex
47
 */
48
class NullLock
49
{
50
  public:
51
    void lock()
52
32.1k
    {
53
32.1k
    }
54
55
    void unlock()
56
32.1k
    {
57
32.1k
    }
58
59
    bool try_lock()
60
0
    {
61
0
        return true;
62
0
    }
63
};
64
65
#if defined(__clang__)
66
#pragma clang diagnostic push
67
#pragma clang diagnostic ignored "-Wweak-vtables"
68
#endif
69
70
/**
71
 * error raised when a key not in cache is passed to get()
72
 */
73
class KeyNotFound : public std::invalid_argument
74
{
75
  public:
76
    KeyNotFound() : std::invalid_argument("key_not_found")
77
0
    {
78
0
    }
79
};
80
81
#if defined(__clang__)
82
#pragma clang diagnostic pop
83
#endif
84
85
template <typename K, typename V> struct KeyValuePair
86
{
87
  public:
88
    K key;
89
    V value;
90
91
0
    KeyValuePair(const K &k, const V &v) : key(k), value(v)
92
0
    {
93
0
    }
Unexecuted instantiation: lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >::KeyValuePair(GDALThreadSafeDataset const* const&, std::__1::shared_ptr<GDALDataset> const&)
Unexecuted instantiation: lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >::KeyValuePair(unsigned long const&, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > const&)
94
95
0
    KeyValuePair(const K &k, V &&v) : key(k), value(std::move(v))
96
0
    {
97
0
    }
Unexecuted instantiation: lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >::KeyValuePair(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >&&)
Unexecuted instantiation: lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >::KeyValuePair(OSRProjTLSCache::EPSGCacheKey const&, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>&&)
Unexecuted instantiation: lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >::KeyValuePair(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>&&)
Unexecuted instantiation: lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >::KeyValuePair(unsigned long long const&, cpl::NonCopyableVector<unsigned char>&&)
Unexecuted instantiation: lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >::KeyValuePair(int const&, std::__1::pair<unsigned long long, unsigned long long>&&)
98
99
  private:
100
    KeyValuePair(const KeyValuePair &) = delete;
101
    KeyValuePair &operator=(const KeyValuePair &) = delete;
102
};
103
104
/**
105
 *  The LRU Cache class templated by
106
 *    Key - key type
107
 *    Value - value type
108
 *    MapType - an associative container like std::unordered_map
109
 *    LockType - a lock type derived from the Lock class (default:
110
 *NullLock = no synchronization)
111
 *
112
 *  The default NullLock based template is not thread-safe, however passing
113
 *Lock=std::mutex will make it
114
 *  thread-safe
115
 */
116
template <class Key, class Value, class Lock = NullLock,
117
          class Map = std::unordered_map<
118
              Key, typename std::list<KeyValuePair<Key, Value>>::iterator>>
119
class Cache
120
{
121
  public:
122
    typedef KeyValuePair<Key, Value> node_type;
123
    typedef std::list<KeyValuePair<Key, Value>> list_type;
124
    typedef Map map_type;
125
    typedef Lock lock_type;
126
    using Guard = std::lock_guard<lock_type>;
127
128
    /**
129
     * the max size is the hard limit of keys and (maxSize + elasticity) is the
130
     * soft limit
131
     * the cache is allowed to grow till maxSize + elasticity and is pruned back
132
     * to maxSize keys
133
     * set maxSize = 0 for an unbounded cache (but in that case, you're better
134
     * off using a std::unordered_map directly anyway! :)
135
     */
136
    explicit Cache(size_t maxSize = 64, size_t elasticity = 10)
137
2.16k
        : maxSize_(maxSize), elasticity_(elasticity)
138
2.16k
    {
139
2.16k
    }
lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::Cache(unsigned long, unsigned long)
Line
Count
Source
137
2.15k
        : maxSize_(maxSize), elasticity_(elasticity)
138
2.15k
    {
139
2.15k
    }
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::Cache(unsigned long, unsigned long)
Unexecuted instantiation: lru11::Cache<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<OSRProjTLSCache::EPSGCacheKey, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, OSRProjTLSCache::EPSGCacheKeyHasher, std::__1::equal_to<OSRProjTLSCache::EPSGCacheKey>, std::__1::allocator<std::__1::pair<OSRProjTLSCache::EPSGCacheKey const, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::Cache(unsigned long, unsigned long)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::Cache(unsigned long, unsigned long)
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::Cache(unsigned long, unsigned long)
Unexecuted instantiation: lru11::Cache<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > >, lru11::NullLock, std::__1::unordered_map<unsigned long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*>, std::__1::hash<unsigned long>, std::__1::equal_to<unsigned long>, std::__1::allocator<std::__1::pair<unsigned long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*> > > > >::Cache(unsigned long, unsigned long)
lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::Cache(unsigned long, unsigned long)
Line
Count
Source
137
6
        : maxSize_(maxSize), elasticity_(elasticity)
138
6
    {
139
6
    }
Unexecuted instantiation: lru11::Cache<int, std::__1::pair<unsigned long long, unsigned long long>, lru11::NullLock, std::__1::unordered_map<int, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*>, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*> > > > >::Cache(unsigned long, unsigned long)
140
141
2.15k
    virtual ~Cache() = default;
lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::~Cache()
Line
Count
Source
141
2.15k
    virtual ~Cache() = default;
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::~Cache()
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::~Cache()
Unexecuted instantiation: lru11::Cache<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<OSRProjTLSCache::EPSGCacheKey, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, OSRProjTLSCache::EPSGCacheKeyHasher, std::__1::equal_to<OSRProjTLSCache::EPSGCacheKey>, std::__1::allocator<std::__1::pair<OSRProjTLSCache::EPSGCacheKey const, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::~Cache()
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::~Cache()
Unexecuted instantiation: lru11::Cache<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > >, lru11::NullLock, std::__1::unordered_map<unsigned long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*>, std::__1::hash<unsigned long>, std::__1::equal_to<unsigned long>, std::__1::allocator<std::__1::pair<unsigned long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*> > > > >::~Cache()
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::~Cache()
Unexecuted instantiation: lru11::Cache<int, std::__1::pair<unsigned long long, unsigned long long>, lru11::NullLock, std::__1::unordered_map<int, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*>, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*> > > > >::~Cache()
142
143
    size_t size() const
144
    {
145
        Guard g(lock_);
146
        return cache_.size();
147
    }
148
149
    bool empty() const
150
0
    {
151
0
        Guard g(lock_);
152
0
        return cache_.empty();
153
0
    }
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::empty() const
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::empty() const
154
155
    void clear()
156
4.31k
    {
157
4.31k
        Guard g(lock_);
158
4.31k
        cache_.clear();
159
4.31k
        keys_.clear();
160
4.31k
    }
lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::clear()
Line
Count
Source
156
4.31k
    {
157
4.31k
        Guard g(lock_);
158
4.31k
        cache_.clear();
159
4.31k
        keys_.clear();
160
4.31k
    }
Unexecuted instantiation: lru11::Cache<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<OSRProjTLSCache::EPSGCacheKey, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, OSRProjTLSCache::EPSGCacheKeyHasher, std::__1::equal_to<OSRProjTLSCache::EPSGCacheKey>, std::__1::allocator<std::__1::pair<OSRProjTLSCache::EPSGCacheKey const, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::clear()
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::clear()
161
162
    void insert(const Key &k, const Value &v)
163
0
    {
164
0
        Guard g(lock_);
165
0
        const auto iter = cache_.find(k);
166
0
        if (iter != cache_.end())
167
0
        {
168
0
            iter->second->value = v;
169
0
            keys_.splice(keys_.begin(), keys_, iter->second);
170
0
            return;
171
0
        }
172
173
0
        keys_.emplace_front(k, v);
174
0
        cache_[k] = keys_.begin();
175
0
        prune();
176
0
    }
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::insert(GDALThreadSafeDataset const* const&, std::__1::shared_ptr<GDALDataset> const&)
Unexecuted instantiation: lru11::Cache<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > >, lru11::NullLock, std::__1::unordered_map<unsigned long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*>, std::__1::hash<unsigned long>, std::__1::equal_to<unsigned long>, std::__1::allocator<std::__1::pair<unsigned long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*> > > > >::insert(unsigned long const&, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > const&)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::insert(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > const&)
177
178
    Value &insert(const Key &k, Value &&v)
179
0
    {
180
0
        Guard g(lock_);
181
0
        const auto iter = cache_.find(k);
182
0
        if (iter != cache_.end())
183
0
        {
184
0
            iter->second->value = std::move(v);
185
0
            keys_.splice(keys_.begin(), keys_, iter->second);
186
0
            return keys_.front().value;
187
0
        }
188
189
0
        keys_.emplace_front(k, std::move(v));
190
0
        cache_[k] = keys_.begin();
191
0
        prune();
192
0
        return keys_.front().value;
193
0
    }
Unexecuted instantiation: lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::insert(unsigned long long const&, cpl::NonCopyableVector<unsigned char>&&)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::insert(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >&&)
Unexecuted instantiation: lru11::Cache<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<OSRProjTLSCache::EPSGCacheKey, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, OSRProjTLSCache::EPSGCacheKeyHasher, std::__1::equal_to<OSRProjTLSCache::EPSGCacheKey>, std::__1::allocator<std::__1::pair<OSRProjTLSCache::EPSGCacheKey const, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::insert(OSRProjTLSCache::EPSGCacheKey const&, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>&&)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::insert(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>&&)
Unexecuted instantiation: lru11::Cache<int, std::__1::pair<unsigned long long, unsigned long long>, lru11::NullLock, std::__1::unordered_map<int, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*>, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*> > > > >::insert(int const&, std::__1::pair<unsigned long long, unsigned long long>&&)
194
195
    bool tryGet(const Key &kIn, Value &vOut)
196
0
    {
197
0
        Guard g(lock_);
198
0
        const auto iter = cache_.find(kIn);
199
0
        if (iter == cache_.end())
200
0
        {
201
0
            return false;
202
0
        }
203
0
        keys_.splice(keys_.begin(), keys_, iter->second);
204
0
        vOut = iter->second->value;
205
0
        return true;
206
0
    }
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::tryGet(GDALThreadSafeDataset const* const&, std::__1::shared_ptr<GDALDataset>&)
Unexecuted instantiation: lru11::Cache<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > >, lru11::NullLock, std::__1::unordered_map<unsigned long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*>, std::__1::hash<unsigned long>, std::__1::equal_to<unsigned long>, std::__1::allocator<std::__1::pair<unsigned long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*> > > > >::tryGet(unsigned long const&, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > >&)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::tryGet(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >&)
Unexecuted instantiation: lru11::Cache<int, std::__1::pair<unsigned long long, unsigned long long>, lru11::NullLock, std::__1::unordered_map<int, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*>, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*> > > > >::tryGet(int const&, std::__1::pair<unsigned long long, unsigned long long>&)
207
208
    /**
209
     *  The const reference returned here is only
210
     *    guaranteed to be valid till the next insert/delete
211
     */
212
    const Value &get(const Key &k)
213
    {
214
        Guard g(lock_);
215
        const auto iter = cache_.find(k);
216
        if (iter == cache_.end())
217
        {
218
            throw KeyNotFound();
219
        }
220
        keys_.splice(keys_.begin(), keys_, iter->second);
221
        return iter->second->value;
222
    }
223
224
    Value *getPtr(const Key &k)
225
2.50k
    {
226
2.50k
        Guard g(lock_);
227
2.50k
        const auto iter = cache_.find(k);
228
2.50k
        if (iter == cache_.end())
229
2.50k
        {
230
2.50k
            return nullptr;
231
2.50k
        }
232
0
        keys_.splice(keys_.begin(), keys_, iter->second);
233
0
        return &(iter->second->value);
234
2.50k
    }
lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::getPtr(unsigned long long const&)
Line
Count
Source
225
2.50k
    {
226
2.50k
        Guard g(lock_);
227
2.50k
        const auto iter = cache_.find(k);
228
2.50k
        if (iter == cache_.end())
229
2.50k
        {
230
2.50k
            return nullptr;
231
2.50k
        }
232
0
        keys_.splice(keys_.begin(), keys_, iter->second);
233
0
        return &(iter->second->value);
234
2.50k
    }
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::getPtr(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: lru11::Cache<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<OSRProjTLSCache::EPSGCacheKey, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, OSRProjTLSCache::EPSGCacheKeyHasher, std::__1::equal_to<OSRProjTLSCache::EPSGCacheKey>, std::__1::allocator<std::__1::pair<OSRProjTLSCache::EPSGCacheKey const, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::getPtr(OSRProjTLSCache::EPSGCacheKey const&)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::getPtr(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
235
236
    /**
237
     * returns a copy of the stored object (if found)
238
     */
239
    Value getCopy(const Key &k)
240
    {
241
        return get(k);
242
    }
243
244
    bool remove(const Key &k)
245
0
    {
246
0
        Guard g(lock_);
247
0
        auto iter = cache_.find(k);
248
0
        if (iter == cache_.end())
249
0
        {
250
0
            return false;
251
0
        }
252
0
        keys_.erase(iter->second);
253
0
        cache_.erase(iter);
254
0
        return true;
255
0
    }
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::remove(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::remove(GDALThreadSafeDataset const* const&)
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::remove(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
256
257
    bool contains(const Key &k)
258
25.3k
    {
259
25.3k
        Guard g(lock_);
260
25.3k
        return cache_.find(k) != cache_.end();
261
25.3k
    }
lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::contains(unsigned long long const&)
Line
Count
Source
258
25.3k
    {
259
25.3k
        Guard g(lock_);
260
25.3k
        return cache_.find(k) != cache_.end();
261
25.3k
    }
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::contains(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: lru11::Cache<int, std::__1::pair<unsigned long long, unsigned long long>, lru11::NullLock, std::__1::unordered_map<int, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*>, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*> > > > >::contains(int const&)
262
263
    bool getOldestEntry(Key &kOut, Value &vOut)
264
    {
265
        Guard g(lock_);
266
        if (keys_.empty())
267
        {
268
            return false;
269
        }
270
        kOut = keys_.back().key;
271
        vOut = keys_.back().value;
272
        return true;
273
    }
274
275
    bool removeAndRecycleOldestEntry(Value &vOut)
276
    {
277
        Guard g(lock_);
278
        if (keys_.empty())
279
        {
280
            return false;
281
        }
282
        vOut = std::move(keys_.back().value);
283
        cache_.erase(keys_.back().key);
284
        keys_.pop_back();
285
        return true;
286
    }
287
288
    size_t getMaxSize() const
289
    {
290
        return maxSize_;
291
    }
292
293
    size_t getElasticity() const
294
    {
295
        return elasticity_;
296
    }
297
298
    size_t getMaxAllowedSize() const
299
    {
300
        return maxSize_ + elasticity_;
301
    }
302
303
    template <typename F> void cwalk(F &f) const
304
0
    {
305
0
        Guard g(lock_);
306
0
        std::for_each(keys_.begin(), keys_.end(), f);
307
0
    }
Unexecuted instantiation: gdalthreadsafedataset.cpp:void lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::cwalk<GDALThreadLocalDatasetCache::~GDALThreadLocalDatasetCache()::$_0 const>(GDALThreadLocalDatasetCache::~GDALThreadLocalDatasetCache()::$_0 const&) const
Unexecuted instantiation: vrtmultidim.cpp:void lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::cwalk<VRTMDArraySourceFromArray::~VRTMDArraySourceFromArray()::$_0>(VRTMDArraySourceFromArray::~VRTMDArraySourceFromArray()::$_0&) const
308
309
    Cache(Cache &&other)
310
        : cache_(std::move(other.cache_)), keys_(std::move(other.keys_)),
311
          maxSize_(other.maxSize_), elasticity_(other.elasticity_)
312
    {
313
    }
314
315
  protected:
316
    size_t prune()
317
0
    {
318
0
        size_t maxAllowed = maxSize_ + elasticity_;
319
0
        if (maxSize_ == 0 || cache_.size() <= maxAllowed)
320
0
        { /* ERO: changed < to <= */
321
0
            return 0;
322
0
        }
323
0
        size_t count = 0;
324
0
        while (cache_.size() > maxSize_)
325
0
        {
326
0
            cache_.erase(keys_.back().key);
327
0
            keys_.pop_back();
328
0
            ++count;
329
0
        }
330
0
        return count;
331
0
    }
Unexecuted instantiation: lru11::Cache<unsigned long long, cpl::NonCopyableVector<unsigned char>, lru11::NullLock, std::__1::unordered_map<unsigned long long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*>, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long long, cpl::NonCopyableVector<unsigned char> >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<OGRProjCT, std::__1::default_delete<OGRProjCT> > >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<OSRProjTLSCache::EPSGCacheKey, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, OSRProjTLSCache::EPSGCacheKeyHasher, std::__1::equal_to<OSRProjTLSCache::EPSGCacheKey>, std::__1::allocator<std::__1::pair<OSRProjTLSCache::EPSGCacheKey const, std::__1::__list_iterator<lru11::KeyValuePair<OSRProjTLSCache::EPSGCacheKey, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter>, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::unique_ptr<PJconsts, OSRProjTLSCache::OSRPJDeleter> >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset>, lru11::NullLock, std::__1::unordered_map<GDALThreadSafeDataset const*, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*>, std::__1::hash<GDALThreadSafeDataset const*>, std::__1::equal_to<GDALThreadSafeDataset const*>, std::__1::allocator<std::__1::pair<GDALThreadSafeDataset const* const, std::__1::__list_iterator<lru11::KeyValuePair<GDALThreadSafeDataset const*, std::__1::shared_ptr<GDALDataset> >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > >, lru11::NullLock, std::__1::unordered_map<unsigned long, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*>, std::__1::hash<unsigned long>, std::__1::equal_to<unsigned long>, std::__1::allocator<std::__1::pair<unsigned long const, std::__1::__list_iterator<lru11::KeyValuePair<unsigned long, std::__1::shared_ptr<std::__1::vector<double, std::__1::allocator<double> > > >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > >, lru11::NullLock, std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::__list_iterator<lru11::KeyValuePair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::pair<std::__1::shared_ptr<VRTArrayDatasetWrapper>, std::__1::unordered_set<void const*, std::__1::hash<void const*>, std::__1::equal_to<void const*>, std::__1::allocator<void const*> > > >, void*> > > > >::prune()
Unexecuted instantiation: lru11::Cache<int, std::__1::pair<unsigned long long, unsigned long long>, lru11::NullLock, std::__1::unordered_map<int, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*>, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<int const, std::__1::__list_iterator<lru11::KeyValuePair<int, std::__1::pair<unsigned long long, unsigned long long> >, void*> > > > >::prune()
332
333
  private:
334
    // Disallow copying.
335
    Cache(const Cache &) = delete;
336
    Cache &operator=(const Cache &) = delete;
337
338
    mutable Lock lock_{};
339
    Map cache_{};
340
    list_type keys_{};
341
    size_t maxSize_;
342
    size_t elasticity_;
343
};
344
345
}  // namespace lru11
346
347
/*! @endcond */