/*============================================================================= Copyright (c) 2001-2003 Joel de Guzman 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_TUPLE10_HPP) #define FUSION_SEQUENCE_TUPLE10_HPP #include #include #include #include #include // for std::pair #include #include #include #include namespace boost { namespace fusion { namespace meta { template struct next; } struct tuple_tag; struct tuple0 : sequence_base { typedef mpl::void_ types; typedef tuple_tag tag; typedef mpl::int_<0> size; typedef tuple0 identity_type; tuple0() {} template tuple0(Iterator const& i) {} }; template struct tuple1 : sequence_base > { typedef mpl::vector1 types; typedef tuple_tag tag; typedef mpl::int_<1> size; typedef tuple1 identity_type; tuple1() : m0(T0()) {} template explicit tuple1(X const& x) : m0(construct(x, detail::disambiguate::call())) {} tuple1(typename detail::call_param::type _0) : m0(_0) {} template tuple1& operator=(tuple1 const& t) { m0 = t.m0; return *this; } T0 m0; private: template static T0 construct(Iterator const& i, detail::disambiguate_as_iterator) { return *i; } template static T0 construct(Tuple const& t, detail::disambiguate_as_tuple) { return t.m0; } template static T0 construct(X const& v, detail::disambiguate_as_data) { return v; } }; template struct tuple2; template struct tuple_data2 : sequence_base > { typedef mpl::vector2 types; typedef tuple_tag tag; typedef mpl::int_<2> size; typedef tuple_data2 identity_type; tuple_data2() : m0(T0()) , m1(T1()) {} tuple_data2( typename detail::call_param::type _0 , typename detail::call_param::type _1 ) : m0(_0) , m1(_1) {} template tuple_data2(detail::disambiguate_as_iterator, A0& _0, A1& _1) : m0(*_0) , m1(*_1) {} T0 m0; T1 m1; }; template struct tuple3; template struct tuple_data3 : sequence_base > { typedef mpl::vector3 types; typedef tuple_tag tag; typedef mpl::int_<3> size; typedef tuple_data3 identity_type; tuple_data3() : m0(T0()) , m1(T1()) , m2(T2()) {} tuple_data3( typename detail::call_param::type _0 , typename detail::call_param::type _1 , typename detail::call_param::type _2 ) : m0(_0) , m1(_1) , m2(_2) {} template tuple_data3(detail::disambiguate_as_iterator, A0& _0, A1& _1, A2& _2) : m0(*_0) , m1(*_1) , m2(*_2) {} T0 m0; T1 m1; T2 m2; }; template struct tuple2 : tuple_data2 { tuple2() : tuple_data2() {} tuple2( typename detail::call_param::type _0 , typename detail::call_param::type _1 ) : tuple_data2(_0, _1) {} template explicit tuple2(X const& x) : tuple_data2(construct(x, addressof(x))) {} template tuple2& operator=(tuple2 const& t) { this->m0 = t.m0; this->m1 = t.m1; return *this; } template tuple2& operator=(std::pair const& p) { this->m0 = p.first; this->m1 = p.second; return *this; } private: template static tuple_data2 construct(Iterator const& i, void const*) { typedef typename meta::next::type i1_type; i1_type i1(fusion::next(i)); return tuple_data2(detail::disambiguate_as_iterator(), i, i1); } template static tuple_data2 construct(Tuple const& t, sequence_root const*) { return tuple_data2(t.m0, t.m1); } template static tuple_data2 construct(std::pair const& p, std::pair const*) { return tuple_data2(p.first, p.second); } }; #if BOOST_WORKAROUND(__BORLANDC__, <= 0x551) namespace detail { template struct next_iter3 { typedef typename meta::next::type i1_type; typedef typename meta::next::type i2_type; }; } #endif template struct tuple3 : tuple_data3 { tuple3() : tuple_data3() {} tuple3( typename detail::call_param::type _0 , typename detail::call_param::type _1 , typename detail::call_param::type _2 ) : tuple_data3(_0, _1, _2) {} template explicit tuple3(X const& x) : tuple_data3(construct(x, &x)) {} template tuple3& operator=(tuple3 const& t) { this->m0 = t.m0; this->m1 = t.m1; this->m2 = t.m2; return *this; } private: template static tuple_data3 construct(Iterator const& i, void const*) { #if BOOST_WORKAROUND(__BORLANDC__, <= 0x551) typedef detail::next_iter3 next_iter; next_iter::i1_type i1(fusion::next(i)); next_iter::i2_type i2(fusion::next(i1)); #else typedef typename meta::next::type i1_type; typedef typename meta::next::type i2_type; i1_type i1(fusion::next(i)); i2_type i2(fusion::next(i1)); #endif return tuple_data3(detail::disambiguate_as_iterator(), i, i1, i2); } template static tuple_data3 construct(Tuple const& t, sequence_root const*) { return tuple_data3(t.m0, t.m1, t.m2); } }; }} #endif