/*! \file */ #ifndef _TILE_DATA_H #define _TILE_DATA_H #include #include #include #include #include "output_object.h" typedef std::vector::const_iterator OutputObjectsConstIt; typedef std::pair OutputObjectsConstItPair; typedef std::map, TileCoordinatesCompare> TileIndex; typedef std::set TileCoordinatesSet; class TileDataSource { protected: std::mutex mutex; TileIndex tileIndex; std::deque objects; unsigned int baseZoom; public: TileDataSource(unsigned int baseZoom) : baseZoom(baseZoom) { } ///This must be thread safe! void MergeTileCoordsAtZoom(uint zoom, TileCoordinatesSet &dstCoords) { MergeTileCoordsAtZoom(zoom, baseZoom, tileIndex, dstCoords); } ///This must be thread safe! void MergeSingleTileDataAtZoom(TileCoordinates dstIndex, uint zoom, std::vector &dstTile) { MergeSingleTileDataAtZoom(dstIndex, zoom, baseZoom, tileIndex, dstTile); } OutputObjectRef CreateObject(OutputObject const &oo) { std::lock_guard lock(mutex); objects.push_back(oo); return &objects.back(); } void AddObject(TileCoordinates const &index, OutputObjectRef const &oo) { std::lock_guard lock(mutex); tileIndex[index].push_back(oo); } private: static void MergeTileCoordsAtZoom(uint zoom, uint baseZoom, const TileIndex &srcTiles, TileCoordinatesSet &dstCoords); static void MergeSingleTileDataAtZoom(TileCoordinates dstIndex, uint zoom, uint baseZoom, const TileIndex &srcTiles, std::vector &dstTile); }; TileCoordinatesSet GetTileCoordinates(std::vector const &sources, unsigned int zoom); std::vector GetTileData(std::vector const &sources, TileCoordinates coordinates, unsigned int zoom); OutputObjectsConstItPair GetObjectsAtSubLayer(std::vector const &data, uint_least8_t layerNum); #endif //_TILE_DATA_H