#pragma once #include #include #include #include #include #include #include #include namespace mbgl { class FileSource; namespace style { class VectorSource; class RasterSource; class RasterDEMSource; class GeoJSONSource; class SourceObserver; struct LayerTypeInfo; /** * The runtime representation of a [source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) from the Mapbox Style * Specification. * * `Source` is an abstract base class; concrete derived classes are provided for each source type. `Source` contains * functionality that is common to all layer types: * * * Runtime type information: type predicates and casting * * Accessors for properties common to all source types: ID, etc. * * Cloning and copying * * All other functionality lives in the derived classes. To instantiate a source, create an instance of the desired * type, passing the ID: * * auto vectorSource = std::make_unique("my-vector-source"); */ class Source : public mbgl::util::noncopyable { public: virtual ~Source(); // Check whether this source is of the given subtype. template bool is() const; // Dynamically cast this source to the given subtype. template T* as() { return is() ? reinterpret_cast(this) : nullptr; } template const T* as() const { return is() ? reinterpret_cast(this) : nullptr; } SourceType getType() const; std::string getID() const; optional getAttribution() const; // Private implementation class Impl; Immutable baseImpl; Source(Immutable); void setObserver(SourceObserver*); SourceObserver* observer = nullptr; virtual void loadDescription(FileSource&) = 0; void setPrefetchZoomDelta(optional delta) noexcept; optional getPrefetchZoomDelta() const noexcept; // Sets a limit for how much a parent tile can be overscaled. // // When a set of tiles for a current zoom level is being rendered and some of the // ideal tiles that cover the screen are not yet loaded, parent tile could be // used instead. This might introduce unwanted rendering side-effects, especially // for raster tiles that are overscaled multiple times. // // For example, an overscale factor of 3 would mean that on zoom level 3, the // minimum zoom level of a parent tile that could be used in place of an ideal // tile during rendering would be zoom 0. By default, no limit is set, so any // parent tile may be used. void setMaxOverscaleFactorForParentTiles(optional overscaleFactor) noexcept; optional getMaxOverscaleFactorForParentTiles() const noexcept; void dumpDebugLogs() const; virtual bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const = 0; bool loaded = false; // For use in SDK bindings, which store a reference to a platform-native peer // object here, so that separately-obtained references to this object share // identical platform-native peers. mapbox::base::TypeWrapper peer; virtual mapbox::base::WeakPtr makeWeakPtr() = 0; protected: virtual Mutable createMutable() const noexcept = 0; }; } // namespace style } // namespace mbgl