//----------------------------------------------------------------------------- | |
// boost variant/detail/make_variant_list.hpp header file | |
// See http://www.boost.org for updates, documentation, and revision history. | |
//----------------------------------------------------------------------------- | |
// | |
// Copyright (c) 2002-2003 | |
// Eric Friedman, Itay Maman | |
// | |
// 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_MAKE_VARIANT_LIST_HPP | |
#define BOOST_VARIANT_DETAIL_MAKE_VARIANT_LIST_HPP | |
#include "boost/variant/variant_fwd.hpp" | |
#include "boost/mpl/list.hpp" | |
#include "boost/preprocessor/cat.hpp" | |
#include "boost/preprocessor/enum.hpp" | |
namespace boost { | |
namespace detail { namespace variant { | |
/////////////////////////////////////////////////////////////////////////////// | |
// (detail) metafunction make_variant_list | |
// | |
// Provides a MPL-compatible sequence with the specified non-void types | |
// as arguments. | |
// | |
// Rationale: see class template convert_void (variant_fwd.hpp) and using- | |
// declaration workaround (below). | |
// | |
template < BOOST_VARIANT_ENUM_PARAMS(typename T) > | |
struct make_variant_list | |
{ | |
public: // metafunction result | |
// [Define a macro to convert any void(NN) tags to mpl::void...] | |
# define BOOST_VARIANT_AUX_CONVERT_VOID(z, N,_) \ | |
typename convert_void< BOOST_PP_CAT(T,N) >::type | |
// [...so that the specified types can be passed to mpl::list...] | |
typedef typename mpl::list< | |
BOOST_PP_ENUM( | |
BOOST_VARIANT_LIMIT_TYPES | |
, BOOST_VARIANT_AUX_CONVERT_VOID | |
, _ | |
) | |
>::type type; | |
// [...and, finally, the conversion macro can be undefined:] | |
# undef BOOST_VARIANT_AUX_CONVERT_VOID | |
}; | |
}} // namespace detail::variant | |
} // namespace boost | |
#endif // BOOST_VARIANT_DETAIL_MAKE_VARIANT_LIST_HPP |