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_)8void 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)20void 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)42Tile* 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)51std::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)66bool TileCache::has(const OverscaledTileID& key) { 67 return tiles.find(key) != tiles.end(); 68 } 69 clear()70void TileCache::clear() { 71 orderedKeys.clear(); 72 tiles.clear(); 73 } 74 75 } // namespace mbgl 76