1 #pragma once
2 
3 #include <mbgl/tile/tile_id.hpp>
4 #include <mbgl/util/geometry.hpp>
5 #include <mbgl/util/constants.hpp>
6 #include <mbgl/util/optional.hpp>
7 
8 #include <map>
9 #include <set>
10 #include <vector>
11 #include <string>
12 #include <memory>
13 #include <unordered_set>
14 
15 namespace mbgl {
16 
17 class SymbolInstance;
18 class RenderSymbolLayer;
19 class SymbolBucket;
20 
21 class IndexedSymbolInstance {
22 public:
IndexedSymbolInstance(uint32_t crossTileID_,Point<int64_t> coord_)23     IndexedSymbolInstance(uint32_t crossTileID_, Point<int64_t> coord_)
24         : crossTileID(crossTileID_), coord(coord_)
25     {}
26 
27     uint32_t crossTileID;
28     Point<int64_t> coord;
29 };
30 
31 class TileLayerIndex {
32 public:
33     TileLayerIndex(OverscaledTileID coord, std::vector<SymbolInstance>&, uint32_t bucketInstanceId);
34 
35     Point<int64_t> getScaledCoordinates(SymbolInstance&, const OverscaledTileID&);
36     void findMatches(std::vector<SymbolInstance>&, const OverscaledTileID&, std::set<uint32_t>&);
37 
38     OverscaledTileID coord;
39     uint32_t bucketInstanceId;
40     std::map<std::u16string,std::vector<IndexedSymbolInstance>> indexedSymbolInstances;
41 };
42 
43 class CrossTileSymbolLayerIndex {
44 public:
45     CrossTileSymbolLayerIndex();
46     bool addBucket(const OverscaledTileID&, SymbolBucket&, uint32_t& maxCrossTileID);
47     bool removeStaleBuckets(const std::unordered_set<uint32_t>& currentIDs);
48     void handleWrapJump(float newLng);
49 private:
50     void removeBucketCrossTileIDs(uint8_t zoom, const TileLayerIndex& removedBucket);
51 
52     std::map<uint8_t, std::map<OverscaledTileID,TileLayerIndex>> indexes;
53     std::map<uint8_t, std::set<uint32_t>> usedCrossTileIDs;
54     float lng = 0;
55 };
56 
57 class CrossTileSymbolIndex {
58 public:
59     CrossTileSymbolIndex();
60 
61     bool addLayer(RenderSymbolLayer&, float lng);
62     void pruneUnusedLayers(const std::set<std::string>&);
63 
64     void reset();
65 private:
66     std::map<std::string, CrossTileSymbolLayerIndex> layerIndexes;
67     uint32_t maxCrossTileID = 0;
68     uint32_t maxBucketInstanceId = 0;
69 };
70 
71 } // namespace mbgl
72