//----------------------------------------------------------------------------- | |
// boost variant/detail/over_sequence.hpp header file | |
// See http://www.boost.org for updates, documentation, and revision history. | |
//----------------------------------------------------------------------------- | |
// | |
// Copyright (c) 2003 | |
// Eric Friedman | |
// | |
// Portions Copyright (C) 2002 David Abrahams | |
// | |
// Distributed under the Boost Software License, Version 1.0. (See | |
// accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP | |
#define BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP | |
#include "boost/mpl/aux_/config/ctps.hpp" | |
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) | |
# include "boost/mpl/eval_if.hpp" | |
# include "boost/mpl/bool.hpp" | |
# include "boost/mpl/identity.hpp" | |
# include "boost/type.hpp" | |
#endif | |
namespace boost { | |
namespace detail { namespace variant { | |
/////////////////////////////////////////////////////////////////////////////// | |
// (detail) class over_sequence | |
// | |
// Wrapper used to indicate bounded types for variant are from type sequence. | |
// | |
template <typename Types> | |
struct over_sequence | |
{ | |
typedef Types type; | |
}; | |
/////////////////////////////////////////////////////////////////////////////// | |
// (detail) metafunction is_over_sequence (modeled on code by David Abrahams) | |
// | |
// Indicates whether the specified type is of form over_sequence<...> or not. | |
// | |
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) | |
template <typename T> | |
struct is_over_sequence | |
: mpl::false_ | |
{ | |
}; | |
template <typename Types> | |
struct is_over_sequence< over_sequence<Types> > | |
: mpl::true_ | |
{ | |
}; | |
#else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) | |
typedef char (&yes_over_sequence_t)[1]; | |
typedef char (&no_over_sequence_t)[2]; | |
no_over_sequence_t is_over_sequence_test(...); | |
template<typename T> | |
yes_over_sequence_t is_over_sequence_test( | |
type< ::boost::detail::variant::over_sequence<T> > | |
); | |
template<typename T> | |
struct is_over_sequence_impl | |
{ | |
BOOST_STATIC_CONSTANT(bool, value = ( | |
sizeof(is_over_sequence_test(type<T>())) | |
== sizeof(yes_over_sequence_t) | |
)); | |
}; | |
template <typename T> | |
struct is_over_sequence | |
: mpl::bool_< | |
::boost::detail::variant::is_over_sequence_impl<T>::value | |
> | |
{ | |
}; | |
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround | |
}} // namespace detail::variant | |
} // namespace boost | |
#endif // BOOST_VARIANT_DETAIL_OVER_SEQUENCE_HPP |