summaryrefslogtreecommitdiff
path: root/src/mbgl/tile/tile_cache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/tile/tile_cache.cpp')
-rw-r--r--src/mbgl/tile/tile_cache.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/mbgl/tile/tile_cache.cpp b/src/mbgl/tile/tile_cache.cpp
new file mode 100644
index 0000000000..423b355827
--- /dev/null
+++ b/src/mbgl/tile/tile_cache.cpp
@@ -0,0 +1,65 @@
+#include <mbgl/tile/tile_cache.hpp>
+#include <mbgl/tile/tile_data.hpp>
+
+#include <cassert>
+
+namespace mbgl {
+
+void TileCache::setSize(size_t size_) {
+ size = size_;
+
+ while (orderedKeys.size() > size) {
+ auto key = orderedKeys.front();
+ orderedKeys.pop_front();
+ tiles.erase(key);
+ }
+
+ assert(orderedKeys.size() <= size);
+
+ tiles.reserve(size);
+}
+
+void TileCache::add(uint64_t key, std::shared_ptr<TileData> data) {
+
+ // insert new or query existing data
+ if (tiles.emplace(key, data).second) {
+ // remove existing data key
+ orderedKeys.remove(key);
+ }
+
+ // (re-)insert data key as newest
+ orderedKeys.push_back(key);
+
+ // purge oldest key/data if necessary
+ if (orderedKeys.size() > size) {
+ get(orderedKeys.front());
+ }
+
+ assert(orderedKeys.size() <= size);
+};
+
+std::shared_ptr<TileData> TileCache::get(uint64_t key) {
+
+ std::shared_ptr<TileData> data;
+
+ auto it = tiles.find(key);
+ if (it != tiles.end()) {
+ data = it->second;
+ tiles.erase(it);
+ orderedKeys.remove(key);
+ assert(data->isReady());
+ }
+
+ return data;
+};
+
+bool TileCache::has(uint64_t key) {
+ return tiles.find(key) != tiles.end();
+}
+
+void TileCache::clear() {
+ orderedKeys.clear();
+ tiles.clear();
+}
+
+} // namespace mbgl