#ifndef MBGL_STYLE_STYLE_PARSER #define MBGL_STYLE_STYLE_PARSER #include #include #include #include #include #include #include #include #include #include namespace mbgl { enum class ClassID : uint32_t; class StyleLayer; class StyleLayerGroup; class StyleParser { public: using JSVal = const rapidjson::Value&; StyleParser(); void parse(JSVal document); std::shared_ptr getLayers() { return root; } std::string getSprite() const { return sprite; } std::string getGlyphURL() const { return glyph_url; } private: void parseConstants(JSVal value); JSVal replaceConstant(JSVal value); void parseSources(JSVal value); std::unique_ptr createLayers(JSVal value); std::shared_ptr createLayer(JSVal value); void parseLayers(); void parseLayer(std::pair> &pair); void parseStyles(JSVal value, std::map &styles); void parseStyle(JSVal, ClassProperties &properties); std::unique_ptr parseRasterize(JSVal value); void parseReference(JSVal value, std::shared_ptr &layer); void parseBucket(JSVal value, std::shared_ptr &layer); void parseRender(JSVal value, std::shared_ptr &layer); void parseSprite(JSVal value); void parseGlyphURL(JSVal value); // Parses optional properties into a render bucket. template bool parseRenderProperty(JSVal value, T &target, const char *name); template bool parseRenderProperty(JSVal value, T &target, const char *name, Parser &parser); // Parses optional properties into style class properties. template bool parseOptionalProperty(const char *property_name, PropertyKey key, ClassProperties &klass, JSVal value); template bool parseOptionalProperty(const char *property_name, const std::vector &keys, ClassProperties &klass, JSVal value); template bool parseOptionalProperty(const char *property_name, T &target, JSVal value); template bool setProperty(JSVal value, const char *property_name, PropertyKey key, ClassProperties &klass); template bool setProperty(JSVal value, const char *property_name, T &target); template std::tuple parseProperty(JSVal value, const char *property_name); template bool parseFunction(PropertyKey key, ClassProperties &klass, JSVal value); template std::tuple> parseFunction(JSVal value); template T parseFunctionArgument(JSVal value); FilterExpression parseFilter(JSVal, FilterExpression::Operator op); FilterExpression parseFilter(JSVal); Value parseValue(JSVal value); std::vector parseValues(JSVal values); private: std::unordered_map constants; std::unordered_map> sources; // This stores the root layer. std::shared_ptr root; // This maps ids to Layer objects, with all items being at the root level. std::unordered_map>> layers; // Store a stack of layers we're parsing right now. This is to prevent reference cycles. std::forward_list stack; // Base URL of the sprite image. std::string sprite; // URL template for glyph PBFs. std::string glyph_url; }; } #endif