/*============================================================================= Copyright (c) 2003 Joel de Guzman Copyright (c) 2004 Peder Holt Use, modification and distribution is subject to 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) ==============================================================================*/ #if !defined(FUSION_SEQUENCE_AS_FUSION_SEQUENCE_HPP) #define FUSION_SEQUENCE_AS_FUSION_SEQUENCE_HPP #include #include #include #include #include #include namespace boost { namespace fusion { // Test T. If it is a fusion sequence, return a reference to it. // else, assume it is an mpl sequence. Fail if it is not. namespace fusion_sequence_detail { template static T const& convert_const(T const& x, mpl::true_) { return x; } template static type_sequence convert_const(T const& x, mpl::false_) { BOOST_STATIC_ASSERT(mpl::is_sequence::value); return type_sequence(); } template static T& convert(T& x, mpl::true_) { return x; } template static type_sequence convert(T& x, mpl::false_) { BOOST_STATIC_ASSERT(mpl::is_sequence::value); return type_sequence(); } } template struct as_fusion_sequence { typedef typename mpl::if_< fusion::is_sequence , T , type_sequence >::type type; static typename mpl::if_< fusion::is_sequence , T const& , type_sequence >::type convert_const(T const& x); static typename mpl::if_< fusion::is_sequence , T & , type_sequence >::type convert(T& x); }; template typename mpl::if_< fusion::is_sequence , T const& , type_sequence >::type as_fusion_sequence::convert_const(T const& x) { return fusion_sequence_detail::convert_const(x,fusion::is_sequence()); } template typename mpl::if_< fusion::is_sequence , T& , type_sequence >::type as_fusion_sequence::convert(T& x) { return fusion_sequence_detail::convert(x,fusion::is_sequence()); } }} #endif