tuple10.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 302 行
HPP
302 行
/*============================================================================= 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 <boost/spirit/fusion/detail/config.hpp>#include <boost/spirit/fusion/sequence/detail/tuple10.hpp>#include <boost/spirit/fusion/sequence/detail/sequence_base.hpp>#include <boost/spirit/fusion/detail/access.hpp>#include <utility> // for std::pair#include <boost/mpl/int.hpp>#include <boost/mpl/vector/vector10.hpp>#include <boost/mpl/if.hpp>#include <boost/utility/addressof.hpp>namespace boost { namespace fusion{ namespace meta { template <typename Iterator> struct next; } struct tuple_tag; struct tuple0 : sequence_base<tuple0> { typedef mpl::void_ types; typedef tuple_tag tag; typedef mpl::int_<0> size; typedef tuple0 identity_type; tuple0() {} template <typename Iterator> tuple0(Iterator const& i) {} }; template <typename T0> struct tuple1 : sequence_base<tuple1<T0> > { typedef mpl::vector1<T0> types; typedef tuple_tag tag; typedef mpl::int_<1> size; typedef tuple1 identity_type; tuple1() : m0(T0()) {} template <typename X> explicit tuple1(X const& x) : m0(construct(x, detail::disambiguate<X, T0>::call())) {} tuple1(typename detail::call_param<T0>::type _0) : m0(_0) {} template <typename U0> tuple1& operator=(tuple1<U0> const& t) { m0 = t.m0; return *this; } T0 m0; private: template <typename Iterator> static T0 construct(Iterator const& i, detail::disambiguate_as_iterator) { return *i; } template <typename Tuple> static T0 construct(Tuple const& t, detail::disambiguate_as_tuple) { return t.m0; } template <typename X> static T0 construct(X const& v, detail::disambiguate_as_data) { return v; } }; template <typename T0, typename T1> struct tuple2; template <typename T0, typename T1> struct tuple_data2 : sequence_base<tuple2<T0, T1> > { typedef mpl::vector2<T0, T1> 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<T0>::type _0 , typename detail::call_param<T1>::type _1 ) : m0(_0) , m1(_1) {} template <typename A0, typename A1> tuple_data2(detail::disambiguate_as_iterator, A0& _0, A1& _1) : m0(*_0) , m1(*_1) {} T0 m0; T1 m1; }; template <typename T0, typename T1, typename T2> struct tuple3; template <typename T0, typename T1, typename T2> struct tuple_data3 : sequence_base<tuple3<T0, T1, T2> > { typedef mpl::vector3<T0, T1, T2> 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<T0>::type _0 , typename detail::call_param<T1>::type _1 , typename detail::call_param<T2>::type _2 ) : m0(_0) , m1(_1) , m2(_2) {} template <typename A0, typename A1, typename A2> 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 <typename T0, typename T1> struct tuple2 : tuple_data2<T0, T1> { tuple2() : tuple_data2<T0, T1>() {} tuple2( typename detail::call_param<T0>::type _0 , typename detail::call_param<T1>::type _1 ) : tuple_data2<T0, T1>(_0, _1) {} template <typename X> explicit tuple2(X const& x) : tuple_data2<T0, T1>(construct(x, addressof(x))) {} template <typename U0, typename U1> tuple2& operator=(tuple2<U0, U1> const& t) { this->m0 = t.m0; this->m1 = t.m1; return *this; } template <typename First, typename Second> tuple2& operator=(std::pair<First, Second> const& p) { this->m0 = p.first; this->m1 = p.second; return *this; } private: template <typename Iterator> static tuple_data2<T0, T1> construct(Iterator const& i, void const*) { typedef typename meta::next<Iterator>::type i1_type; i1_type i1(fusion::next(i)); return tuple_data2<T0, T1>(detail::disambiguate_as_iterator(), i, i1); } template <typename Tuple> static tuple_data2<T0, T1> construct(Tuple const& t, sequence_root const*) { return tuple_data2<T0, T1>(t.m0, t.m1); } template <typename U0, typename U1> static tuple_data2<T0, T1> construct(std::pair<U0, U1> const& p, std::pair<U0, U1> const*) { return tuple_data2<T0, T1>(p.first, p.second); } };#if BOOST_WORKAROUND(__BORLANDC__, <= 0x551) namespace detail { template <typename Iterator> struct next_iter3 { typedef typename meta::next<Iterator>::type i1_type; typedef typename meta::next<i1_type>::type i2_type; }; }#endif template <typename T0, typename T1, typename T2> struct tuple3 : tuple_data3<T0, T1, T2> { tuple3() : tuple_data3<T0, T1, T2>() {} tuple3( typename detail::call_param<T0>::type _0 , typename detail::call_param<T1>::type _1 , typename detail::call_param<T2>::type _2 ) : tuple_data3<T0, T1, T2>(_0, _1, _2) {} template <typename X> explicit tuple3(X const& x) : tuple_data3<T0, T1, T2>(construct(x, &x)) {} template <typename U0, typename U1, typename U2> tuple3& operator=(tuple3<U0, U1, U2> const& t) { this->m0 = t.m0; this->m1 = t.m1; this->m2 = t.m2; return *this; } private: template <typename Iterator> static tuple_data3<T0, T1, T2> construct(Iterator const& i, void const*) {#if BOOST_WORKAROUND(__BORLANDC__, <= 0x551) typedef detail::next_iter3<Iterator> next_iter; next_iter::i1_type i1(fusion::next(i)); next_iter::i2_type i2(fusion::next(i1));#else typedef typename meta::next<Iterator>::type i1_type; typedef typename meta::next<i1_type>::type i2_type; i1_type i1(fusion::next(i)); i2_type i2(fusion::next(i1));#endif return tuple_data3<T0, T1, T2>(detail::disambiguate_as_iterator(), i, i1, i2); } template <typename Tuple> static tuple_data3<T0, T1, T2> construct(Tuple const& t, sequence_root const*) { return tuple_data3<T0, T1, T2>(t.m0, t.m1, t.m2); } };}}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?