Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Copyright (c) 2005 Eric Niebler Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(FUSION_CONS_07172005_0843) Chris@16: #define FUSION_CONS_07172005_0843 Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@101: #include Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: struct void_; Chris@16: struct cons_tag; Chris@16: struct forward_traversal_tag; Chris@16: struct fusion_sequence_tag; Chris@16: Chris@16: template Chris@16: struct cons : sequence_base > Chris@16: { Chris@16: typedef mpl::int_ size; Chris@16: typedef cons_tag fusion_tag; Chris@16: typedef fusion_sequence_tag tag; // this gets picked up by MPL Chris@16: typedef mpl::false_ is_view; Chris@16: typedef forward_traversal_tag category; Chris@16: typedef Car car_type; Chris@16: typedef Cdr cdr_type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons() Chris@16: : car(), cdr() {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: explicit cons(typename detail::call_param::type in_car) Chris@16: : car(in_car), cdr() {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons( Chris@16: typename detail::call_param::type in_car Chris@16: , typename detail::call_param::type in_cdr) Chris@16: : car(in_car), cdr(in_cdr) {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons(cons const& rhs) Chris@16: : car(rhs.car), cdr(rhs.cdr) {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons(cons const& rhs) Chris@16: : car(rhs.car), cdr(rhs.cdr) {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons( Chris@16: Sequence const& seq Chris@101: , typename boost::enable_if< Chris@101: mpl::and_< Chris@101: traits::is_sequence Chris@101: , mpl::not_ > > // use copy to car instead Chris@16: >::type* /*dummy*/ = 0 Chris@16: ) Chris@16: : car(*fusion::begin(seq)) Chris@16: , cdr(fusion::next(fusion::begin(seq)), mpl::true_()) {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons(Iterator const& iter, mpl::true_ /*this_is_an_iterator*/) Chris@16: : car(*iter) Chris@16: , cdr(fusion::next(iter), mpl::true_()) {} Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons& operator=(cons const& rhs) Chris@16: { Chris@16: car = rhs.car; Chris@16: cdr = rhs.cdr; Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: cons& operator=(cons const& rhs) Chris@16: { Chris@16: car = rhs.car; Chris@16: cdr = rhs.cdr; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: typename boost::enable_if< Chris@101: mpl::and_< Chris@101: traits::is_sequence Chris@101: , mpl::not_ > > Chris@101: , cons&>::type Chris@16: operator=(Sequence const& seq) Chris@16: { Chris@16: typedef typename result_of::begin::type Iterator; Chris@16: Iterator iter = fusion::begin(seq); Chris@16: this->assign_from_iter(iter); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: void assign_from_iter(Iterator const& iter) Chris@16: { Chris@16: car = *iter; Chris@16: cdr.assign_from_iter(fusion::next(iter)); Chris@16: } Chris@16: Chris@16: car_type car; Chris@16: cdr_type cdr; Chris@16: }; Chris@16: }} Chris@16: Chris@16: #endif Chris@16: