#ifndef MBGL_MAP_MAP_DATA #define MBGL_MAP_MAP_DATA #include #include #include #include #include #include #include #include #include #include namespace mbgl { class MapData { using Lock = std::lock_guard; public: inline MapData(MapMode mode_, const float pixelRatio_) : mode(mode_) , pixelRatio(pixelRatio_) , animationTime(Duration::zero()) , defaultFadeDuration(std::chrono::milliseconds(300)) , defaultTransitionDuration(Duration::zero()) , defaultTransitionDelay(Duration::zero()) { assert(pixelRatio > 0); } // Adds the class if it's not yet set. Returns true when it added the class, and false when it // was already present. bool addClass(const std::string& klass); // Removes the class if it's present. Returns true when it remvoed the class, and false when it // was not present. bool removeClass(const std::string& klass); // Returns true when class is present in the list of currently set classes. bool hasClass(const std::string& klass) const; // Changes the list of currently set classes to the new list. void setClasses(const std::vector& klasses); // Returns a list of all currently set classes. std::vector getClasses() const; inline bool getDebug() const { return debug; } inline bool toggleDebug() { return debug ^= 1u; } inline void setDebug(bool value) { debug = value; } inline bool getCollisionDebug() const { return collisionDebug; } inline bool toggleCollisionDebug() { return collisionDebug ^= 1u; } inline void setCollisionDebug(bool value) { collisionDebug = value; } inline TimePoint getAnimationTime() const { // We're casting the TimePoint to and from a Duration because libstdc++ // has a bug that doesn't allow TimePoints to be atomic. return TimePoint(animationTime); } inline void setAnimationTime(const TimePoint& timePoint) { animationTime = timePoint.time_since_epoch(); }; inline Duration getDefaultFadeDuration() const { return defaultFadeDuration; } inline void setDefaultFadeDuration(const Duration& duration) { defaultFadeDuration = duration; } inline Duration getDefaultTransitionDuration() const { return defaultTransitionDuration; } inline void setDefaultTransitionDuration(const Duration& duration) { defaultTransitionDuration = duration; } inline Duration getDefaultTransitionDelay() const { return defaultTransitionDelay; } inline void setDefaultTransitionDelay(const Duration& delay) { defaultTransitionDelay = delay; } inline bool getNeedsRepaint() const { return needsRepaint; } inline void setNeedsRepaint(const bool needsRepaint_) { needsRepaint = needsRepaint_; } util::exclusive getAnnotationManager() { return util::exclusive( &annotationManager, std::make_unique>(annotationManagerMutex)); } public: const MapMode mode; const float pixelRatio; private: mutable std::mutex annotationManagerMutex; AnnotationManager annotationManager; mutable std::mutex mtx; std::vector classes; std::atomic debug { false }; std::atomic collisionDebug { false }; std::atomic animationTime; std::atomic defaultFadeDuration; std::atomic defaultTransitionDuration; std::atomic defaultTransitionDelay; std::atomic needsRepaint; // TODO: make private public: std::mutex mutexPause; std::condition_variable condPaused; std::condition_variable condResume; }; } #endif