bump variant version

This commit is contained in:
Dennis Luxen 2014-09-04 16:19:00 +02:00
parent e57d9f2e2e
commit 9ccd0f0282

View File

@ -4,7 +4,6 @@
#include <utility> #include <utility>
#include <typeinfo> #include <typeinfo>
#include <type_traits> #include <type_traits>
#include <algorithm> // std::move/swap
#include <stdexcept> // runtime_error #include <stdexcept> // runtime_error
#include <new> // operator new #include <new> // operator new
#include <cstddef> // size_t #include <cstddef> // size_t
@ -515,22 +514,13 @@ public:
VARIANT_INLINE variant(no_init) VARIANT_INLINE variant(no_init)
: type_index(detail::invalid_value) {} : type_index(detail::invalid_value) {}
// http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
template <typename T, class = typename std::enable_if< template <typename T, class = typename std::enable_if<
detail::is_valid_type<T, Types...>::value>::type> detail::is_valid_type<typename std::remove_reference<T>::type, Types...>::value>::type>
VARIANT_INLINE explicit variant(T const& val) noexcept
: type_index(detail::value_traits<T, Types...>::index)
{
constexpr std::size_t index = sizeof...(Types) - detail::value_traits<T, Types...>::index - 1;
using target_type = typename detail::select_type<index, Types...>::type;
new (&data) target_type(val);
}
template <typename T, class = typename std::enable_if<
detail::is_valid_type<T, Types...>::value>::type>
VARIANT_INLINE variant(T && val) noexcept VARIANT_INLINE variant(T && val) noexcept
: type_index(detail::value_traits<T, Types...>::index) : type_index(detail::value_traits<typename std::remove_reference<T>::type, Types...>::index)
{ {
constexpr std::size_t index = sizeof...(Types) - detail::value_traits<T, Types...>::index - 1; constexpr std::size_t index = sizeof...(Types) - detail::value_traits<typename std::remove_reference<T>::type, Types...>::index - 1;
using target_type = typename detail::select_type<index, Types...>::type; using target_type = typename detail::select_type<index, Types...>::type;
new (&data) target_type(std::forward<T>(val)); // nothrow new (&data) target_type(std::forward<T>(val)); // nothrow
} }
@ -721,11 +711,24 @@ auto VARIANT_INLINE static apply_visitor(F f, V & v0, V & v1) -> decltype(V::bin
return V::binary_visit(v0, v1, f); return V::binary_visit(v0, v1, f);
} }
// getter interface
template<typename ResultType, typename T>
ResultType & get(T & var)
{
return var.template get<ResultType>();
}
template<typename ResultType, typename T>
ResultType const& get(T const& var)
{
return var.template get<ResultType>();
}
// operator<< // operator<<
template <typename charT, typename traits, typename Variant> template <typename charT, typename traits, typename... Types>
VARIANT_INLINE std::basic_ostream<charT, traits>& VARIANT_INLINE std::basic_ostream<charT, traits>&
operator<< (std::basic_ostream<charT, traits>& out, Variant const& rhs) operator<< (std::basic_ostream<charT, traits>& out, variant<Types...> const& rhs)
{ {
detail::printer<std::basic_ostream<charT, traits>> visitor(out); detail::printer<std::basic_ostream<charT, traits>> visitor(out);
apply_visitor(visitor, rhs); apply_visitor(visitor, rhs);