//-----------------------------------------------------------------------------

// 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

