diff --git a/src/mbgl/tile/file_based_tile_source.hpp b/src/mbgl/tile/file_based_tile_source.hpp index ee0646961..77028e780 100644 --- a/src/mbgl/tile/file_based_tile_source.hpp +++ b/src/mbgl/tile/file_based_tile_source.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include namespace mbgl { @@ -8,10 +9,10 @@ class FileSource; class AsyncRequest; class Response; -template -class FileBasedTileSource : public T { +template +class FileBasedTileSource : public TileSource { public: - FileBasedTileSource(typename T::data_type&, const Resource&, FileSource&); + FileBasedTileSource(T&, const Resource&, FileSource&); virtual ~FileBasedTileSource() = default; protected: @@ -24,6 +25,7 @@ private: void loadRequired(); private: + T& tileData; Resource resource; FileSource& fileSource; std::unique_ptr request; diff --git a/src/mbgl/tile/file_based_tile_source_impl.hpp b/src/mbgl/tile/file_based_tile_source_impl.hpp index b8a69e3f6..2d10b6458 100644 --- a/src/mbgl/tile/file_based_tile_source_impl.hpp +++ b/src/mbgl/tile/file_based_tile_source_impl.hpp @@ -7,11 +7,11 @@ namespace mbgl { -template -FileBasedTileSource::FileBasedTileSource(typename T::data_type& tileData_, - const Resource& resource_, - FileSource& fileSource_) - : T(tileData_), resource(resource_), fileSource(fileSource_) { +template +FileBasedTileSource::FileBasedTileSource(T& tileData_, + const Resource& resource_, + FileSource& fileSource_) + : tileData(tileData_), resource(resource_), fileSource(fileSource_) { assert(!request); if (fileSource.supportsOptionalRequests()) { // When supported, the first request is always optional, even if the TileSource @@ -23,7 +23,7 @@ FileBasedTileSource::FileBasedTileSource(typename T::data_type& tileData_, } else { // When the FileSource doesn't support optional requests, we do nothing until the // data is definitely required. - if (T::isRequired()) { + if (isRequired()) { loadRequired(); } else { // We're using this field to check whether the pending request is optional or required. @@ -32,15 +32,15 @@ FileBasedTileSource::FileBasedTileSource(typename T::data_type& tileData_, } } -template -void FileBasedTileSource::loadOptional() { +template +void FileBasedTileSource::loadOptional() { assert(!request); resource.necessity = Resource::Optional; request = fileSource.request(resource, [this](Response res) { request.reset(); - T::tileData.setTriedOptional(); + tileData.setTriedOptional(); if (res.error && res.error->reason == Response::Error::Reason::NotFound) { // When the optional request could not be satisfied, don't treat it as an error. @@ -51,31 +51,31 @@ void FileBasedTileSource::loadOptional() { loadedData(res); } - if (T::isRequired()) { + if (isRequired()) { loadRequired(); } }); } -template -void FileBasedTileSource::makeRequired() { +template +void FileBasedTileSource::makeRequired() { if (!request) { loadRequired(); } } -template -void FileBasedTileSource::makeOptional() { +template +void FileBasedTileSource::makeOptional() { if (resource.necessity == Resource::Required && request) { // Abort a potential HTTP request. request.reset(); } } -template -void FileBasedTileSource::loadedData(const Response& res) { +template +void FileBasedTileSource::loadedData(const Response& res) { if (res.error && res.error->reason != Response::Error::Reason::NotFound) { - T::tileData.setError(std::make_exception_ptr(std::runtime_error(res.error->message))); + tileData.setError(std::make_exception_ptr(std::runtime_error(res.error->message))); } else if (res.notModified) { resource.priorExpires = res.expires; // Do not notify the TileData object; when we get this message, it already has the current @@ -84,13 +84,13 @@ void FileBasedTileSource::loadedData(const Response& res) { resource.priorModified = res.modified; resource.priorExpires = res.expires; resource.priorEtag = res.etag; - T::tileData.setData(res.noContent ? nullptr : I::parseData(res.data), res.modified, + tileData.setData(res.noContent ? nullptr : T::parseData(res.data), res.modified, res.expires); } } -template -void FileBasedTileSource::loadRequired() { +template +void FileBasedTileSource::loadRequired() { assert(!request); resource.necessity = Resource::Required; diff --git a/src/mbgl/tile/raster_tile_data.cpp b/src/mbgl/tile/raster_tile_data.cpp index ac6299e22..f28da3d3d 100644 --- a/src/mbgl/tile/raster_tile_data.cpp +++ b/src/mbgl/tile/raster_tile_data.cpp @@ -23,7 +23,7 @@ RasterTileData::RasterTileData(const OverscaledTileID& id_, const auto resource = Resource::tile( tileset.tiles.at(0), parameters.pixelRatio, id_.canonical.x, id_.canonical.y, id_.canonical.z); - tileSource = std::make_unique>( + tileSource = std::make_unique>( *this, resource, parameters.fileSource); } diff --git a/src/mbgl/tile/tile_source.hpp b/src/mbgl/tile/tile_source.hpp index 8ecc9c3fa..b21da0bcd 100644 --- a/src/mbgl/tile/tile_source.hpp +++ b/src/mbgl/tile/tile_source.hpp @@ -57,38 +57,4 @@ protected: Necessity necessity; }; -class GeometryTileData; -class RasterTileData; - -class GeometryTileSource : public TileSource { -public: - using data_type = GeometryTileData; - -protected: - GeometryTileSource(data_type& tileData_) - : tileData(tileData_) { - } - -public: - virtual ~GeometryTileSource() = default; - -protected: - data_type& tileData; -}; - -class RasterTileSource : public TileSource { -public: - using data_type = RasterTileData; - -protected: - RasterTileSource(data_type& tileData_) - : tileData(tileData_){}; - -public: - virtual ~RasterTileSource() = default; - -protected: - data_type& tileData; -}; - } // namespace mbgl diff --git a/src/mbgl/tile/vector_tile_data.cpp b/src/mbgl/tile/vector_tile_data.cpp index b9cdbc3a9..dc5c536e6 100644 --- a/src/mbgl/tile/vector_tile_data.cpp +++ b/src/mbgl/tile/vector_tile_data.cpp @@ -18,7 +18,7 @@ VectorTileData::VectorTileData(const OverscaledTileID& overscaledTileID, const auto resource = Resource::tile( tileset.tiles.at(0), parameters.pixelRatio, overscaledTileID.canonical.x, overscaledTileID.canonical.y, overscaledTileID.canonical.z); - tileSource = std::make_unique>( + tileSource = std::make_unique>( *this, resource, parameters.fileSource); }