1 #include <mbgl/tile/tile_cache.hpp>
2 #include <mbgl/tile/tile.hpp>
3 
4 #include <cassert>
5 
6 namespace mbgl {
7 
setSize(size_t size_)8 void TileCache::setSize(size_t size_) {
9     size = size_;
10 
11     while (orderedKeys.size() > size) {
12         auto key = orderedKeys.front();
13         orderedKeys.pop_front();
14         tiles.erase(key);
15     }
16 
17     assert(orderedKeys.size() <= size);
18 }
19 
add(const OverscaledTileID & key,std::unique_ptr<Tile> tile)20 void TileCache::add(const OverscaledTileID& key, std::unique_ptr<Tile> tile) {
21     if (!tile->isRenderable() || !size) {
22         return;
23     }
24 
25     // insert new or query existing tile
26     if (tiles.emplace(key, std::move(tile)).second) {
27         // remove existing tile key
28         orderedKeys.remove(key);
29     }
30 
31     // (re-)insert tile key as newest
32     orderedKeys.push_back(key);
33 
34     // purge oldest key/tile if necessary
35     if (orderedKeys.size() > size) {
36         pop(orderedKeys.front());
37     }
38 
39     assert(orderedKeys.size() <= size);
40 }
41 
get(const OverscaledTileID & key)42 Tile* TileCache::get(const OverscaledTileID& key) {
43     auto it = tiles.find(key);
44     if (it != tiles.end()) {
45         return it->second.get();
46     } else {
47         return nullptr;
48     }
49 }
50 
pop(const OverscaledTileID & key)51 std::unique_ptr<Tile> TileCache::pop(const OverscaledTileID& key) {
52 
53     std::unique_ptr<Tile> tile;
54 
55     auto it = tiles.find(key);
56     if (it != tiles.end()) {
57         tile = std::move(it->second);
58         tiles.erase(it);
59         orderedKeys.remove(key);
60         assert(tile->isRenderable());
61     }
62 
63     return tile;
64 }
65 
has(const OverscaledTileID & key)66 bool TileCache::has(const OverscaledTileID& key) {
67     return tiles.find(key) != tiles.end();
68 }
69 
clear()70 void TileCache::clear() {
71     orderedKeys.clear();
72     tiles.clear();
73 }
74 
75 } // namespace mbgl
76