From 3cd1b8f07c3ce4820d2faefa5559324d9861ad92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Mon, 16 Jun 2014 17:00:25 +0200 Subject: [PATCH] template the parser --- include/llmr/style/style_parser.hpp | 19 ++-- src/style/style_parser.cpp | 130 +++++++++++----------------- 2 files changed, 59 insertions(+), 90 deletions(-) diff --git a/include/llmr/style/style_parser.hpp b/include/llmr/style/style_parser.hpp index 71a69530c..0d254f33e 100644 --- a/include/llmr/style/style_parser.hpp +++ b/include/llmr/style/style_parser.hpp @@ -41,21 +41,20 @@ private: PropertyFilterExpression parseFilterOrExpression(JSVal value); - bool parseBoolean(JSVal value); - std::string parseString(JSVal value); JSVal replaceConstant(JSVal value); - Color parseColor(JSVal value); Value parseValue(JSVal value); - FunctionProperty::fn parseFunctionType(JSVal type); - FunctionProperty parseFunction(JSVal value); + template + T parse(JSVal value); + + template + inline void parse(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { + if (value.HasMember(property_name)) { + klass.emplace(key, parse(value[property_name])); + } + } void parseTransition(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value); - void parseColor(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value); - void parseFunction(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value); - void parseString(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value); - void parseBoolean(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value); - void parseTranslateAnchor(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value); void parseFunctionArray(const char *property_name, const std::vector &keys, ClassProperties &klass, JSVal value); diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 803fe9968..1454a40e7 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -382,7 +382,7 @@ void StyleParser::parseConstants(JSVal value) { } } -TranslateAnchor parseTranslateAnchor(JSVal anchor) { +template<> TranslateAnchor StyleParser::parse(JSVal anchor) { if (anchor.IsString()) { std::string a { anchor.GetString(), anchor.GetStringLength() }; if (a == "viewport") { @@ -513,7 +513,7 @@ void StyleParser::parseClass(const std::string &name, JSVal value, ClassDescript } } -bool StyleParser::parseBoolean(JSVal value) { +template<> bool StyleParser::parse(JSVal value) { if (!value.IsBool()) { throw Style::exception("boolean value must be a boolean"); } @@ -521,7 +521,7 @@ bool StyleParser::parseBoolean(JSVal value) { return value.GetBool(); } -std::string StyleParser::parseString(JSVal value) { +template<> std::string StyleParser::parse(JSVal value) { if (!value.IsString()) { throw Style::exception("string value must be a string"); } @@ -541,25 +541,7 @@ JSVal StyleParser::replaceConstant(JSVal value) { return value; } -void StyleParser::parseFunctionArray(const char *property_name, const std::vector &keys, ClassProperties &klass, JSVal value) { - if (value.HasMember(property_name)) { - JSVal rvalue = replaceConstant(value[property_name]); - if (!rvalue.IsArray()) { - throw Style::exception("array value must be an array"); - } - - - if (rvalue.Size() != keys.size()) { - throw Style::exception("array value has unexpected number of elements"); - } - - for (uint16_t i = 0; i < keys.size(); i++) { - klass.emplace(keys[i], parseFunction(rvalue[(rapidjson::SizeType)i])); - } - } -} - -Color StyleParser::parseColor(JSVal value) { +template<> Color StyleParser::parse(JSVal value) { JSVal rvalue = replaceConstant(value); if (rvalue.IsArray()) { // [ r, g, b, a] array @@ -593,37 +575,7 @@ Color StyleParser::parseColor(JSVal value) { css_color.a}}; } -void StyleParser::parseColor(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { - if (value.HasMember(property_name)) { - klass.emplace(key, parseColor(value[property_name])); - } -} - -void StyleParser::parseFunction(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { - if (value.HasMember(property_name)) { - klass.emplace(key, parseFunction(value[property_name])); - } -} - -void StyleParser::parseString(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { - if (value.HasMember(property_name)) { - klass.emplace(key, parseString(value[property_name])); - } -} - -void StyleParser::parseBoolean(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { - if (value.HasMember(property_name)) { - klass.emplace(key, parseBoolean(value[property_name])); - } -} - -void StyleParser::parseTranslateAnchor(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { - if (value.HasMember(property_name)) { - klass.emplace(key, ::parseTranslateAnchor(value[property_name])); - } -} - -FunctionProperty::fn StyleParser::parseFunctionType(JSVal type) { +FunctionProperty::fn parseFunctionType(JSVal type) { if (type.IsString()) { std::string t { type.GetString(), type.GetStringLength() }; if (t == "constant") { @@ -646,7 +598,7 @@ FunctionProperty::fn StyleParser::parseFunctionType(JSVal type) { } } -FunctionProperty StyleParser::parseFunction(JSVal value) { +template<> FunctionProperty StyleParser::parse(JSVal value) { JSVal rvalue = replaceConstant(value); FunctionProperty property; @@ -693,6 +645,24 @@ FunctionProperty StyleParser::parseFunction(JSVal value) { return property; } +void StyleParser::parseFunctionArray(const char *property_name, const std::vector &keys, ClassProperties &klass, JSVal value) { + if (value.HasMember(property_name)) { + JSVal rvalue = replaceConstant(value[property_name]); + if (!rvalue.IsArray()) { + throw Style::exception("array value must be an array"); + } + + + if (rvalue.Size() != keys.size()) { + throw Style::exception("array value has unexpected number of elements"); + } + + for (uint16_t i = 0; i < keys.size(); i++) { + klass.emplace(keys[i], parse(rvalue[(rapidjson::SizeType)i])); + } + } +} + void StyleParser::parseTransition(const char *property_name, ClassPropertyKey key, ClassProperties &klass, JSVal value) { uint16_t duration = 0, delay = 0; if (value.HasMember(property_name)) { @@ -714,16 +684,16 @@ void StyleParser::parseTransition(const char *property_name, ClassPropertyKey ke void StyleParser::parseGenericClass(ClassProperties &klass, JSVal value) { using Key = ClassPropertyKey; - parseFunction("enabled", Key::Enabled, klass, value); + parse("enabled", Key::Enabled, klass, value); parseFunctionArray("translate", { Key::TranslateX, Key::TranslateY }, klass, value); parseTransition("transition-translate", Key::TranslateTransition, klass, value); - parseTranslateAnchor("translate-anchor", Key::TranslateAnchor, klass, value); - parseFunction("opacity", Key::Opacity, klass, value); + parse("translate-anchor", Key::TranslateAnchor, klass, value); + parse("opacity", Key::Opacity, klass, value); parseTransition("transition-opacity", Key::OpacityTransition, klass, value); - parseFunction("prerender", Key::Prerender, klass, value); - parseFunction("prerender-buffer", Key::PrerenderBuffer, klass, value); - parseFunction("prerender-size", Key::PrerenderSize, klass, value); - parseFunction("prerender-blur", Key::PrerenderBlur, klass, value); + parse("prerender", Key::Prerender, klass, value); + parse("prerender-buffer", Key::PrerenderBuffer, klass, value); + parse("prerender-size", Key::PrerenderSize, klass, value); + parse("prerender-blur", Key::PrerenderBlur, klass, value); } ClassProperties StyleParser::parseFillClass(JSVal value) { @@ -731,12 +701,12 @@ ClassProperties StyleParser::parseFillClass(JSVal value) { parseGenericClass(klass, value); using Key = ClassPropertyKey; - parseColor("color", Key::FillColor, klass, value); + parse("color", Key::FillColor, klass, value); parseTransition("transition-color", Key::FillColorTransition, klass, value); - parseColor("stroke", Key::FillStrokeColor, klass, value); + parse("stroke", Key::FillStrokeColor, klass, value); parseTransition("transition-stroke", Key::FillStrokeColorTransition, klass, value); - parseBoolean("antialias", Key::FillAntialias, klass, value); - parseString("image", Key::FillImage, klass, value); + parse("antialias", Key::FillAntialias, klass, value); + parse("image", Key::FillImage, klass, value); return klass; } @@ -746,9 +716,9 @@ ClassProperties StyleParser::parseLineClass(JSVal value) { parseGenericClass(klass, value); using Key = ClassPropertyKey; - parseColor("color", Key::LineColor, klass, value); + parse("color", Key::LineColor, klass, value); parseTransition("transition-color", Key::LineColorTransition, klass, value); - parseFunction("width", Key::LineWidth, klass, value); + parse("width", Key::LineWidth, klass, value); parseTransition("transition-width", Key::LineWidthTransition, klass, value); parseFunctionArray("dasharray", { Key::LineDashLand, Key::LineDashGap }, klass, value); parseTransition("transition-dasharray", Key::LineDashTransition, klass, value); @@ -761,13 +731,13 @@ ClassProperties StyleParser::parseIconClass(JSVal value) { parseGenericClass(klass, value); using Key = ClassPropertyKey; - parseColor("color", Key::IconColor, klass, value); + parse("color", Key::IconColor, klass, value); parseTransition("transition-color", Key::IconColorTransition, klass, value); - parseString("image", Key::IconImage, klass, value); - parseFunction("size", Key::IconSize, klass, value); - parseFunction("radius", Key::IconRadius, klass, value); + parse("image", Key::IconImage, klass, value); + parse("size", Key::IconSize, klass, value); + parse("radius", Key::IconRadius, klass, value); parseTransition("transition-radius", Key::IconRadiusTransition, klass, value); - parseFunction("blur", Key::IconBlur, klass, value); + parse("blur", Key::IconBlur, klass, value); parseTransition("transition-blur", Key::IconBlurTransition, klass, value); return klass; @@ -779,17 +749,17 @@ ClassProperties StyleParser::parseTextClass(JSVal value) { using Key = ClassPropertyKey; - parseColor("color", Key::TextColor, klass, value); + parse("color", Key::TextColor, klass, value); parseTransition("transition-color", Key::TextColorTransition, klass, value); - parseColor("stroke", Key::TextHaloColor, klass, value); + parse("stroke", Key::TextHaloColor, klass, value); parseTransition("transition-stroke", Key::TextHaloColorTransition, klass, value); - parseFunction("strokeWidth", Key::TextHaloRadius, klass, value); + parse("strokeWidth", Key::TextHaloRadius, klass, value); parseTransition("transition-strokeWidth", Key::TextHaloRadiusTransition, klass, value); - parseFunction("strokeBlur", Key::TextHaloBlur, klass, value); + parse("strokeBlur", Key::TextHaloBlur, klass, value); parseTransition("transition-strokeBlur", Key::TextHaloBlurTransition, klass, value); - parseFunction("size", Key::TextSize, klass, value); - parseFunction("rotate", Key::TextRotate, klass, value); - parseFunction("alwaysVisible", Key::TextAlwaysVisible, klass, value); + parse("size", Key::TextSize, klass, value); + parse("rotate", Key::TextRotate, klass, value); + parse("alwaysVisible", Key::TextAlwaysVisible, klass, value); return klass; } @@ -813,7 +783,7 @@ ClassProperties StyleParser::parseBackgroundClass(JSVal value) { parseGenericClass(klass, value); using Key = ClassPropertyKey; - parseColor("color", Key::BackgroundColor, klass, value); + parse("color", Key::BackgroundColor, klass, value); parseTransition("transition-color", Key::BackgroundColorTransition, klass, value); return klass;