23void adjustAncestorCounts(QHash<TileMath::TileKey, int>& counts,
const TileMath::TileKey& key,
int delta)
26 const int shift = key.
zoom - zoom;
28 const int count = counts.value(ancestor, 0) + delta;
30 counts.insert(ancestor, count);
32 counts.remove(ancestor);
44 const bool replacing = _tiles.contains(key);
45 if (!replacing && (_tiles.count() >=
kMaxTiles)) {
48 *evictedKey = evicted;
51 _tiles.insert(key, std::move(grid));
52 _lastUsed.insert(key, ++_useTick);
54 adjustAncestorCounts(_descendantCounts, key, +1);
65 qint64 lruTick = std::numeric_limits<qint64>::max();
66 for (
auto it = _lastUsed.cbegin(); it != _lastUsed.cend(); ++it) {
67 if ((it.value() < lruTick) && !_pinnedKeys.contains(it.key())) {
73 qCDebug(GeoMapElevationTilePyramidVerboseLog)
74 <<
"all resident tiles pinned, growing past cap, tileCount" << _tiles.count();
78 qCDebug(GeoMapElevationTilePyramidVerboseLog)
79 <<
"evicting least-recently-used tile" << lruKey <<
"tileCount" << _tiles.count();
80 _tiles.remove(lruKey);
81 _lastUsed.remove(lruKey);
82 adjustAncestorCounts(_descendantCounts, lruKey, -1);
94 const int shift = key.
zoom - zoom;
96 const auto it = _tiles.constFind(candidate);
97 if (it == _tiles.cend()) {
100 _lastUsed.insert(candidate, ++_useTick);
101 const double scale = 1.0 / (1LL << shift);
102 return View{&it.value(), candidate,
103 QRectF((key.
x - (qint64(candidate.x) << shift)) * scale,
104 (key.
y - (qint64(candidate.y) << shift)) * scale, scale, scale)};
#define QGC_LOGGING_CATEGORY(name, categoryStr)
View bestTileFor(const TileMath::TileKey &key) const
bool insertTile(const TileMath::TileKey &key, Grid grid, TileMath::TileKey *evictedKey=nullptr)
static constexpr int kMaxTiles
bool isValidKey(const TileKey &key)
True if zoom is within [kMinZoom, kMaxZoom] and x/y address a tile at that zoom.
Decoded elevation samples for one tile, row-major from the NW corner.