variant - add get<T> overloads where T is stored as recursive_wrapper<T> and avoid directly dealing with recursive_wrapper<T>

This commit is contained in:
artemp 2015-03-04 10:16:32 +01:00
parent ec7f2f3f0c
commit 587437c368
2 changed files with 42 additions and 10 deletions

View file

@ -136,7 +136,7 @@ namespace boost { namespace spirit { namespace traits {
using type = mapnik::new_geometry::geometry_collection const&; using type = mapnik::new_geometry::geometry_collection const&;
static type pre(mapnik::new_geometry::geometry const& geom) static type pre(mapnik::new_geometry::geometry const& geom)
{ {
return mapnik::util::get<mapnik::util::recursive_wrapper<mapnik::new_geometry::geometry_collection>>(geom); return mapnik::util::get<mapnik::new_geometry::geometry_collection>(geom);
} }
}; };

View file

@ -2,7 +2,7 @@
* *
* This file is part of Mapnik (c++ mapping toolkit) * This file is part of Mapnik (c++ mapping toolkit)
* *
* Copyright (C) 2014 Artem Pavlenko * Copyright (C) 2015 Artem Pavlenko
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -631,7 +631,8 @@ public:
type_index = detail::direct_type<T, Types...>::index; type_index = detail::direct_type<T, Types...>::index;
} }
template<typename T> // get<T>()
template<typename T, typename std::enable_if<(detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
VARIANT_INLINE T& get() VARIANT_INLINE T& get()
{ {
if (type_index == detail::direct_type<T, Types...>::index) if (type_index == detail::direct_type<T, Types...>::index)
@ -640,11 +641,13 @@ public:
} }
else else
{ {
throw std::runtime_error("in get()"); throw std::runtime_error("in get<T>()");
} }
} }
template<typename T> template <typename T, typename std::enable_if<
(detail::direct_type<T, Types...>::index != detail::invalid_value)
>::type* = nullptr>
VARIANT_INLINE T const& get() const VARIANT_INLINE T const& get() const
{ {
if (type_index == detail::direct_type<T, Types...>::index) if (type_index == detail::direct_type<T, Types...>::index)
@ -653,7 +656,38 @@ public:
} }
else else
{ {
throw std::runtime_error("in get()"); throw std::runtime_error("in get<T>()");
}
}
// get<T>() - T stored as recursive_wrapper<T>
template <typename T, typename std::enable_if<
(detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)
>::type* = nullptr>
VARIANT_INLINE T& get()
{
if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
{
return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get();
}
else
{
throw std::runtime_error("in get<T>()");
}
}
template <typename T,typename std::enable_if<
(detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)
>::type* = nullptr>
VARIANT_INLINE T const& get() const
{
if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
{
return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)).get();
}
else
{
throw std::runtime_error("in get<T>()");
} }
} }
@ -783,8 +817,6 @@ ResultType const& get(T const& var)
return var.template get<ResultType>(); return var.template get<ResultType>();
} }
}} }}
#endif // MAPNIK_UTIL_VARIANT_HPP #endif // MAPNIK_UTIL_VARIANT_HPP