From 71ed184bc424e597ddd2d238409c28752c32541a Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Tue, 23 Jun 2015 19:48:24 +0300 Subject: [PATCH] Improve readibility for style parser results Introduces StyleParser::Result being a std::tuple, where StyleParser::Status is a boolean enumerator which improves readibility. --- src/mbgl/style/style_parser.cpp | 180 ++++++++++++++++---------------- src/mbgl/style/style_parser.hpp | 20 ++-- 2 files changed, 104 insertions(+), 96 deletions(-) diff --git a/src/mbgl/style/style_parser.cpp b/src/mbgl/style/style_parser.cpp index bcaa6a1e3..7c6a0916e 100644 --- a/src/mbgl/style/style_parser.cpp +++ b/src/mbgl/style/style_parser.cpp @@ -260,10 +260,10 @@ Color parseColor(JSVal value) { css_color.a}}; } -std::tuple> StyleParser::parseFloatArray(JSVal value) { +StyleParser::Result> StyleParser::parseFloatArray(JSVal value) { if (!value.IsArray()) { Log::Warning(Event::ParseStyle, "dasharray value must be an array of numbers"); - return std::tuple> { false, std::vector() }; + return Result> { StyleParserFailure, std::vector() }; } std::vector vec; @@ -271,72 +271,72 @@ std::tuple> StyleParser::parseFloatArray(JSVal value) { JSVal part = replaceConstant(value[i]); if (!part.IsNumber()) { Log::Warning(Event::ParseStyle, "dasharray value must be an array of numbers"); - return std::tuple> { false, std::vector() }; + return Result> { StyleParserFailure, std::vector() }; } vec.push_back(part.GetDouble()); } - return std::tuple> { true, vec }; + return Result> { StyleParserSuccess, vec }; } template <> -std::tuple> StyleParser::parseProperty(JSVal value, const char*) { +StyleParser::Result> StyleParser::parseProperty(JSVal value, const char*) { if (value.IsArray() && value.Size() == 2 && value[rapidjson::SizeType(0)].IsNumber() && value[rapidjson::SizeType(1)].IsNumber()) { float first = value[rapidjson::SizeType(0)].GetDouble(); float second = value[rapidjson::SizeType(1)].GetDouble(); - return std::tuple> { true, {{ first, second }} }; + return Result> { StyleParserSuccess, {{ first, second }} }; } else { Log::Warning(Event::ParseStyle, "value must be array of two numbers"); - return std::tuple> { false, {{ 0.0f, 0.0f }} }; + return Result> { StyleParserFailure, {{ 0.0f, 0.0f }} }; } } template <> -std::tuple StyleParser::parseProperty(JSVal value, const char* property_name) { +StyleParser::Result StyleParser::parseProperty(JSVal value, const char* property_name) { JSVal rvalue = replaceConstant(value); if (rvalue.IsNumber()) { - return std::tuple { true, rvalue.GetDouble() }; + return Result { StyleParserSuccess, rvalue.GetDouble() }; } else { Log::Warning(Event::ParseStyle, "value of '%s' must be a number, or a number function", property_name); - return std::tuple { false, 0.0f }; + return Result { StyleParserFailure, 0.0f }; } } template <> -std::tuple StyleParser::parseProperty(JSVal value, const char*) { +StyleParser::Result StyleParser::parseProperty(JSVal value, const char*) { JSVal rvalue = replaceConstant(value); - return std::tuple { true, parseColor(rvalue) }; + return Result { StyleParserSuccess, parseColor(rvalue) }; } template <> -std::tuple>> StyleParser::parseProperty(JSVal value, const char*) { +StyleParser::Result>> StyleParser::parseProperty(JSVal value, const char*) { Faded> parsed; JSVal rvalue = replaceConstant(value); parsed.to = std::get<1>(parseFloatArray(rvalue)); - return std::tuple>> { true, parsed }; + return Result>> { StyleParserSuccess, parsed }; } template <> -std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { JSVal rvalue = replaceConstant(value); Faded parsed; if (rvalue.IsString()) { parsed.to = { value.GetString(), value.GetStringLength() }; - return std::tuple> { true, parsed }; + return Result> { StyleParserSuccess, parsed }; } else { Log::Warning(Event::ParseStyle, "value of '%s' must be a string, or a string function", property_name); - return std::tuple> { false, parsed }; + return Result> { StyleParserFailure, parsed }; } } template -std::tuple>> StyleParser::parseStops(JSVal value_stops, const char *property_name) { +StyleParser::Result>> StyleParser::parseStops(JSVal value_stops, const char *property_name) { if (!value_stops.IsArray()) { Log::Warning(Event::ParseStyle, "stops function must specify a stops array"); - return std::tuple>> { false, {}}; + return Result>> { StyleParserFailure, {}}; } std::vector> stops; @@ -346,33 +346,33 @@ std::tuple>> StyleParser::parseStops(JSVal if (stop.IsArray()) { if (stop.Size() != 2) { Log::Warning(Event::ParseStyle, "stop must have zoom level and value specification"); - return std::tuple>> { false, {}}; + return Result>> { StyleParserFailure, {}}; } JSVal z = stop[rapidjson::SizeType(0)]; if (!z.IsNumber()) { Log::Warning(Event::ParseStyle, "zoom level in stop must be a number"); - return std::tuple>> { false, {}}; + return Result>> { StyleParserFailure, {}}; } stops.emplace_back(z.GetDouble(), std::get<1>(parseProperty(replaceConstant(stop[rapidjson::SizeType(1)]), property_name))); } else { Log::Warning(Event::ParseStyle, "function argument must be a numeric value"); - return std::tuple>> { false, {}}; + return Result>> { StyleParserFailure, {}}; } } - return std::tuple>>(true, stops); + return Result>>(StyleParserSuccess, stops); } template -std::tuple> StyleParser::parseFunction(JSVal value, const char *property_name) { +StyleParser::Result> StyleParser::parseFunction(JSVal value, const char *property_name) { if (!value.IsObject()) { return parseProperty(value, property_name); } if (!value.HasMember("stops")) { Log::Warning(Event::ParseStyle, "function must specify a function type"); - return std::tuple> { false, ConstantFunction(T()) }; + return Result> { StyleParserFailure, ConstantFunction(T()) }; } float base = 1.0f; @@ -389,26 +389,26 @@ std::tuple> StyleParser::parseFunction(JSVal value, const char auto stops = parseStops(value["stops"], property_name); if (!std::get<0>(stops)) { - return std::tuple> { false, ConstantFunction(T()) }; + return Result> { StyleParserFailure, ConstantFunction(T()) }; } - return std::tuple> { true, StopsFunction(std::get<1>(stops), base) }; + return Result> { StyleParserSuccess, StopsFunction(std::get<1>(stops), base) }; } template -std::tuple> StyleParser::parsePiecewiseConstantFunction(JSVal value, Duration duration) { +StyleParser::Result> StyleParser::parsePiecewiseConstantFunction(JSVal value, Duration duration) { if (!value.HasMember("stops")) { Log::Warning(Event::ParseStyle, "function must specify a function type"); - return std::tuple> { false, {} }; + return Result> { StyleParserFailure, {} }; } auto stops = parseStops(value["stops"], ""); if (!std::get<0>(stops)) { - return std::tuple> { false, {} }; + return Result> { StyleParserFailure, {} }; } - return std::tuple> { true, { std::get<1>(stops), duration } }; + return Result> { StyleParserSuccess, { std::get<1>(stops), duration } }; } template @@ -472,112 +472,112 @@ std::string normalizeFontStack(const std::string &name) { return algo::join(parts, ", "); } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, std::string() }; + return Result { StyleParserFailure, std::string() }; } if (std::string { "text-font" } == property_name) { - return std::tuple { - true, normalizeFontStack({ value.GetString(), value.GetStringLength() }) + return Result { + StyleParserSuccess, normalizeFontStack({ value.GetString(), value.GetStringLength() }) }; } else { - return std::tuple { true, { value.GetString(), value.GetStringLength() } }; + return Result { StyleParserSuccess, { value.GetString(), value.GetStringLength() } }; } } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsBool()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a boolean", property_name); - return std::tuple { false, true }; + return Result { StyleParserFailure, true }; } - return std::tuple { true, value.GetBool() }; + return Result { StyleParserSuccess, value.GetBool() }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, TranslateAnchorType::Map }; + return Result { StyleParserFailure, TranslateAnchorType::Map }; } - return std::tuple { true, TranslateAnchorTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, TranslateAnchorTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, RotateAnchorType::Map }; + return Result { StyleParserFailure, RotateAnchorType::Map }; } - return std::tuple { true, RotateAnchorTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, RotateAnchorTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, CapType::Butt }; + return Result { StyleParserFailure, CapType::Butt }; } - return std::tuple { true, CapTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, CapTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, JoinType::Miter }; + return Result { StyleParserFailure, JoinType::Miter }; } - return std::tuple { true, JoinTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, JoinTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, PlacementType::Point }; + return Result { StyleParserFailure, PlacementType::Point }; } - return std::tuple { true, PlacementTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, PlacementTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, TextAnchorType::Center }; + return Result { StyleParserFailure, TextAnchorType::Center }; } - return std::tuple { true, TextAnchorTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, TextAnchorTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, TextJustifyType::Center }; + return Result { StyleParserFailure, TextJustifyType::Center }; } - return std::tuple { true, TextJustifyTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, TextJustifyTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, TextTransformType::None }; + return Result { StyleParserFailure, TextTransformType::None }; } - return std::tuple { true, TextTransformTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, TextTransformTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char *property_name) { if (!value.IsString()) { Log::Warning(Event::ParseStyle, "value of '%s' must be a string", property_name); - return std::tuple { false, RotationAlignmentType::Map }; + return Result { StyleParserFailure, RotationAlignmentType::Map }; } - return std::tuple { true, RotationAlignmentTypeClass({ value.GetString(), value.GetStringLength() }) }; + return Result { StyleParserSuccess, RotationAlignmentTypeClass({ value.GetString(), value.GetStringLength() }) }; } -template<> std::tuple StyleParser::parseProperty(JSVal value, const char */*property_name*/) { +template<> StyleParser::Result StyleParser::parseProperty(JSVal value, const char */*property_name*/) { PropertyTransition transition; if (value.IsObject()) { if (value.HasMember("duration") && value["duration"].IsNumber()) { @@ -589,70 +589,70 @@ template<> std::tuple StyleParser::parseProperty(JSVal } if (transition.duration == Duration::zero() && transition.delay == Duration::zero()) { - return std::tuple { false, std::move(transition) }; + return Result { StyleParserFailure, std::move(transition) }; } - return std::tuple { true, std::move(transition) }; + return Result { StyleParserSuccess, std::move(transition) }; } -template<> std::tuple>> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result>> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction>(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple> StyleParser::parseProperty(JSVal value, const char *property_name) { +template<> StyleParser::Result> StyleParser::parseProperty(JSVal value, const char *property_name) { return parseFunction(value, property_name); } -template<> std::tuple>>> StyleParser::parseProperty(JSVal value, const char *property_name, JSVal transition) { +template<> StyleParser::Result>>> StyleParser::parseProperty(JSVal value, const char *property_name, JSVal transition) { Duration duration = std::chrono::milliseconds(300); if (transition.HasMember("duration")) { duration = std::chrono::milliseconds(transition["duration"].GetUint()); @@ -662,16 +662,16 @@ template<> std::tuple>> return parsePiecewiseConstantFunction>>(value, duration); } else if (value.IsArray()) { Faded> parsed; - std::tuple> floatarray = parseFloatArray(value); + Result> floatarray = parseFloatArray(value); parsed.to = std::get<1>(floatarray); - return std::tuple>>> { std::get<0>(floatarray), { parsed, duration } }; + return Result>>> { std::get<0>(floatarray), { parsed, duration } }; } else { Log::Warning(Event::ParseStyle, "value of '%s' must be an array of numbers, or a number array function", property_name); - return std::tuple>>> { false, {} }; + return Result>>> { StyleParserFailure, {} }; } } -template<> std::tuple>> StyleParser::parseProperty(JSVal value, const char *property_name, JSVal transition) { +template<> StyleParser::Result>> StyleParser::parseProperty(JSVal value, const char *property_name, JSVal transition) { Duration duration = std::chrono::milliseconds(300); if (transition.HasMember("duration")) { @@ -683,10 +683,10 @@ template<> std::tuple>> Style } else if (value.IsString()) { Faded parsed; parsed.to = { value.GetString(), value.GetStringLength() }; - return std::tuple>> { true, { parsed, duration } }; + return Result>> { StyleParserSuccess, { parsed, duration } }; } else { Log::Warning(Event::ParseStyle, "value of '%s' must be string or a string function", property_name); - return std::tuple>> { false, {} }; + return Result>> { StyleParserFailure, {} }; } } diff --git a/src/mbgl/style/style_parser.hpp b/src/mbgl/style/style_parser.hpp index 6f970d21e..2d212928c 100644 --- a/src/mbgl/style/style_parser.hpp +++ b/src/mbgl/style/style_parser.hpp @@ -23,6 +23,14 @@ class StyleParser { public: using JSVal = const rapidjson::Value&; + enum Status : bool { + StyleParserFailure = 0, + StyleParserSuccess + }; + + template + using Result = std::pair; + StyleParser(); void parse(JSVal document); @@ -77,18 +85,18 @@ private: bool setProperty(JSVal value, const char *property_name, PropertyKey key, ClassProperties &klass, JSVal transition); template - std::tuple parseProperty(JSVal value, const char *property_name); + Result parseProperty(JSVal value, const char *property_name); template - std::tuple parseProperty(JSVal value, const char *property_name, JSVal transition); + Result parseProperty(JSVal value, const char *property_name, JSVal transition); template - std::tuple> parseFunction(JSVal value, const char *); + Result> parseFunction(JSVal value, const char *); template - std::tuple> parsePiecewiseConstantFunction(JSVal value, Duration duration); + Result> parsePiecewiseConstantFunction(JSVal value, Duration duration); template - std::tuple>> parseStops(JSVal value, const char *property_name); + Result>> parseStops(JSVal value, const char *property_name); - std::tuple> parseFloatArray(JSVal value); + Result> parseFloatArray(JSVal value); FilterExpression parseFilter(JSVal);