diff --git a/bindings/python/mapnik_value_converter.hpp b/bindings/python/mapnik_value_converter.hpp index 5d989c0a5..42b9ba4bc 100644 --- a/bindings/python/mapnik_value_converter.hpp +++ b/bindings/python/mapnik_value_converter.hpp @@ -71,7 +71,7 @@ namespace boost { namespace python { { static PyObject* convert(mapnik::value const& v) { - return mapnik::util::apply_visitor(value_converter(),v.base()); + return mapnik::util::apply_visitor(value_converter(),v); } }; diff --git a/include/mapnik/feature_kv_iterator.hpp b/include/mapnik/feature_kv_iterator.hpp index 892a0c2da..060b6fc78 100644 --- a/include/mapnik/feature_kv_iterator.hpp +++ b/include/mapnik/feature_kv_iterator.hpp @@ -70,7 +70,7 @@ struct value_not_null { bool operator() (feature_kv_iterator::value_type const& kv) const { - return !util::apply_visitor(mapnik::detail::is_null_visitor(), std::get<1>(kv).base()); + return !util::apply_visitor(mapnik::detail::is_null_visitor(), std::get<1>(kv)); } }; diff --git a/include/mapnik/json/feature_generator_grammar.hpp b/include/mapnik/json/feature_generator_grammar.hpp index 5cb957978..d909f6a84 100644 --- a/include/mapnik/json/feature_generator_grammar.hpp +++ b/include/mapnik/json/feature_generator_grammar.hpp @@ -126,15 +126,6 @@ struct utf8 } }; -struct value_base -{ - using result_type = mapnik::value_base const&; - mapnik::value_base const& operator() (mapnik::value const& val) const - { - return val.base(); - } -}; - template struct escaped_string : karma::grammar @@ -150,7 +141,7 @@ struct extract_string result_type operator() (mapnik::value const& val) const { - bool need_quotes = val.base().is(); + bool need_quotes = val.is(); return std::make_tuple(val.to_string(), need_quotes); } }; @@ -173,7 +164,6 @@ struct feature_generator_grammar: karma::rule ustring; typename karma::int_generator int__; boost::phoenix::function id_; - boost::phoenix::function value_base_; boost::phoenix::function extract_string_; boost::phoenix::function utf8_; std::string quote_; diff --git a/include/mapnik/json/feature_generator_grammar_impl.hpp b/include/mapnik/json/feature_generator_grammar_impl.hpp index b420d74da..1d1d3c907 100644 --- a/include/mapnik/json/feature_generator_grammar_impl.hpp +++ b/include/mapnik/json/feature_generator_grammar_impl.hpp @@ -89,7 +89,7 @@ feature_generator_grammar::feature_generator_grammar() pair = lit('"') << kstring[_1 = boost::phoenix::at_c<0>(_val)] << lit('"') << lit(':') - << value[_1 = extract_string_(value_base_(at_c<1>(_val)))] + << value[_1 = extract_string_(at_c<1>(_val))] ; value = eps(at_c<1>(_val)) << escaped_string_(quote_.c_str())[_1 = at_c<0>(_val)] diff --git a/include/mapnik/json/feature_grammar.hpp b/include/mapnik/json/feature_grammar.hpp index a6a047dc0..a2d603664 100644 --- a/include/mapnik/json/feature_grammar.hpp +++ b/include/mapnik/json/feature_grammar.hpp @@ -70,7 +70,7 @@ struct put_property explicit put_property(mapnik::transcoder const& tr) : tr_(tr) {} template - result_type operator() (T0 & feature, T1 const& key, T2 const& val) const + result_type operator() (T0 & feature, T1 const& key, T2 && val) const { feature.put_new(key, mapnik::util::apply_visitor(attribute_value_visitor(tr_),val)); } @@ -104,7 +104,7 @@ struct feature_grammar : qi::rule properties; qi::rule, void(FeatureType &),space_type> attributes; - qi::rule(), space_type> attribute_value; + qi::rule(), space_type> attribute_value; phoenix::function put_property_; phoenix::function extract_geometry_; diff --git a/include/mapnik/json/generic_json.hpp b/include/mapnik/json/generic_json.hpp index d0533a379..1e696eb8f 100644 --- a/include/mapnik/json/generic_json.hpp +++ b/include/mapnik/json/generic_json.hpp @@ -41,8 +41,10 @@ struct generic_json qi::int_parser int__; qi::rule string_; qi::rule key_value; - qi::rule(),space_type> number; qi::rule object; qi::rule array; diff --git a/include/mapnik/json/topojson_grammar.hpp b/include/mapnik/json/topojson_grammar.hpp index 1b5533611..d02289b4c 100644 --- a/include/mapnik/json/topojson_grammar.hpp +++ b/include/mapnik/json/topojson_grammar.hpp @@ -56,6 +56,21 @@ struct where_message } }; +namespace detail { + +template +struct value_converter +{ + using result_type = T; + template + result_type operator() (T1 const& val) const + { + return static_cast(val); + } +}; + +} + template struct topojson_grammar : qi::grammar @@ -69,9 +84,7 @@ private: qi::int_parser int__; qi::rule string_; qi::rule key_value; - qi::rule()> number; + qi::rule number; qi::rule object; qi::rule array; qi::rule pairs; @@ -102,7 +115,9 @@ private: qi::rule attribute_value; // id qi::rule id; - + // conversions + boost::phoenix::function > integer_converter; + boost::phoenix::function > double_converter; // error boost::phoenix::function where_message_; }; diff --git a/include/mapnik/json/topojson_grammar_impl.hpp b/include/mapnik/json/topojson_grammar_impl.hpp index d52641e57..34fa8a636 100644 --- a/include/mapnik/json/topojson_grammar_impl.hpp +++ b/include/mapnik/json/topojson_grammar_impl.hpp @@ -49,7 +49,7 @@ topojson_grammar::topojson_grammar() using qi::fail; using qi::on_error; using phoenix::push_back; - + using phoenix::construct; // generic json types value = object | array | string_ | number ; @@ -68,11 +68,11 @@ topojson_grammar::topojson_grammar() >> lit(']') ; - number %= strict_double - | int__ + number = strict_double[_val = double_converter(_1)] + | int__[_val = integer_converter(_1)] | lit("true")[_val = true] | lit("false")[_val = false] - | lit("null") + | lit("null")[_val = construct()] ; unesc_char.add diff --git a/include/mapnik/json/topology.hpp b/include/mapnik/json/topology.hpp index e7605a302..fda5c4962 100644 --- a/include/mapnik/json/topology.hpp +++ b/include/mapnik/json/topology.hpp @@ -43,7 +43,7 @@ struct coordinate double y; }; -using value = mapnik::util::variant; +using value = mapnik::util::variant; using property = std::tuple; using properties = std::vector; diff --git a/include/mapnik/value.hpp b/include/mapnik/value.hpp index 3df89f45c..dc64ab609 100644 --- a/include/mapnik/value.hpp +++ b/include/mapnik/value.hpp @@ -799,9 +799,8 @@ struct to_expression_string : public util::static_visitor namespace value_adl_barrier { -class value +class value : public value_base { - value_base base_; friend const value operator+(value const&,value const&); friend const value operator-(value const&,value const&); friend const value operator*(value const&,value const&); @@ -810,64 +809,55 @@ class value public: value () noexcept //-- comment out for VC++11 - : base_(value_null()) {} + : value_base(value_null()) {} + + value (value const& other) = default; + + value( value && other) noexcept = default; template value ( T const& val) - : base_(typename detail::mapnik_value_type::type(val)) {} + : value_base(typename detail::mapnik_value_type::type(val)) {} - value (value const& other) - : base_(other.base_) {} + template + value ( T && val) + : value_base(std::move(typename detail::mapnik_value_type::type(val))) {} - value & operator=( value const& other) - { - if (this == &other) - return *this; - base_ = other.base_; - return *this; - } - - value( value && other) noexcept - : base_(std::move(other.base_)) {} + value & operator=( value const& other) = default; bool operator==(value const& other) const { - return util::apply_visitor(impl::equals(),base_,other.base_); + return util::apply_visitor(impl::equals(),*this,other); } bool operator!=(value const& other) const { - return util::apply_visitor(impl::not_equals(),base_,other.base_); + return util::apply_visitor(impl::not_equals(),*this,other); } bool operator>(value const& other) const { - return util::apply_visitor(impl::greater_than(),base_,other.base_); + return util::apply_visitor(impl::greater_than(),*this,other); } bool operator>=(value const& other) const { - return util::apply_visitor(impl::greater_or_equal(),base_,other.base_); + return util::apply_visitor(impl::greater_or_equal(),*this,other); } bool operator<(value const& other) const { - return util::apply_visitor(impl::less_than(),base_,other.base_); + return util::apply_visitor(impl::less_than(),*this,other); } bool operator<=(value const& other) const { - return util::apply_visitor(impl::less_or_equal(),base_,other.base_); + return util::apply_visitor(impl::less_or_equal(),*this,other); } value operator- () const { - return util::apply_visitor(impl::negate(), base_); - } - - value_base const& base() const - { - return base_; + return util::apply_visitor(impl::negate(), *this); } bool is_null() const; @@ -875,68 +865,67 @@ public: template T convert() const { - return util::apply_visitor(impl::convert(),base_); + return util::apply_visitor(impl::convert(),*this); } value_bool to_bool() const { - return util::apply_visitor(impl::convert(),base_); + return util::apply_visitor(impl::convert(),*this); } std::string to_expression_string(char quote = '\'') const { - return util::apply_visitor(impl::to_expression_string(quote),base_); + return util::apply_visitor(impl::to_expression_string(quote),*this); } std::string to_string() const { - return util::apply_visitor(impl::convert(),base_); + return util::apply_visitor(impl::convert(),*this); } value_unicode_string to_unicode() const { - return util::apply_visitor(impl::to_unicode(),base_); + return util::apply_visitor(impl::to_unicode(),*this); } value_double to_double() const { - return util::apply_visitor(impl::convert(),base_); + return util::apply_visitor(impl::convert(),*this); } value_integer to_int() const { - return util::apply_visitor(impl::convert(),base_); + return util::apply_visitor(impl::convert(),*this); } }; inline const value operator+(value const& p1,value const& p2) { - - return value(util::apply_visitor(impl::add(),p1.base_, p2.base_)); + return value(util::apply_visitor(impl::add(),p1, p2)); } inline const value operator-(value const& p1,value const& p2) { - return value(util::apply_visitor(impl::sub(),p1.base_, p2.base_)); + return value(util::apply_visitor(impl::sub(),p1, p2)); } inline const value operator*(value const& p1,value const& p2) { - return value(util::apply_visitor(impl::mult(),p1.base_, p2.base_)); + return value(util::apply_visitor(impl::mult(),p1, p2)); } inline const value operator/(value const& p1,value const& p2) { - return value(util::apply_visitor(impl::div(),p1.base_, p2.base_)); + return value(util::apply_visitor(impl::div(),p1, p2)); } inline const value operator%(value const& p1,value const& p2) { - return value(util::apply_visitor(impl::mod(),p1.base_, p2.base_)); + return value(util::apply_visitor(impl::mod(),p1, p2)); } template @@ -948,12 +937,6 @@ operator << (std::basic_ostream& out, return out; } -// hash function -inline std::size_t hash_value(value const& val) -{ - return hash_value(val.base()); -} - } // namespace value_adl_barrier using value_adl_barrier::value; @@ -984,7 +967,7 @@ struct is_null_visitor : public util::static_visitor inline bool value::is_null() const { - return util::apply_visitor(mapnik::detail::is_null_visitor(), base_); + return util::apply_visitor(mapnik::detail::is_null_visitor(), *this); } } // namespace mapnik diff --git a/include/mapnik/value_types.hpp b/include/mapnik/value_types.hpp index ecba8ef71..4288c389f 100644 --- a/include/mapnik/value_types.hpp +++ b/include/mapnik/value_types.hpp @@ -199,7 +199,7 @@ struct mapnik_value_type:: template struct mapnik_value_type::value>::type> { - using type = mapnik::value_unicode_string; + using type = mapnik::value_unicode_string const&; }; } // namespace detail diff --git a/plugins/input/geojson/geojson_datasource.cpp b/plugins/input/geojson/geojson_datasource.cpp index 34aeb01ca..60751edc9 100644 --- a/plugins/input/geojson/geojson_datasource.cpp +++ b/plugins/input/geojson/geojson_datasource.cpp @@ -177,7 +177,7 @@ void geojson_datasource::parse_geojson(T const& buffer) { desc_.add_descriptor(mapnik::attribute_descriptor(std::get<0>(kv), mapnik::util::apply_visitor(attr_value_converter(), - std::get<1>(kv).base()))); + std::get<1>(kv)))); } } else