Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman 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_ERASE_07232005_0534) Chris@16: #define FUSION_ERASE_07232005_0534 Chris@16: 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@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: namespace result_of Chris@16: { Chris@16: template Chris@16: struct compute_erase_last // put this in detail!!! Chris@16: { Chris@16: typedef typename result_of::end::type seq_last_type; Chris@16: typedef typename convert_iterator::type first_type; Chris@16: typedef typename Chris@16: mpl::if_< Chris@16: result_of::equal_to Chris@16: , first_type Chris@16: , typename result_of::next::type Chris@16: >::type Chris@16: type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static type Chris@16: call(First const& first, mpl::false_) Chris@16: { Chris@16: return fusion::next(convert_iterator::call(first)); Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static type Chris@16: call(First const& first, mpl::true_) Chris@16: { Chris@16: return convert_iterator::call(first); Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static type Chris@16: call(First const& first) Chris@16: { Chris@16: return call(first, result_of::equal_to()); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct use_default; Chris@101: Chris@16: template Chris@16: struct fusion_default_help Chris@16: : mpl::if_< Chris@16: is_same Chris@16: , Default Chris@16: , T Chris@16: > Chris@16: { Chris@16: }; Chris@101: Chris@16: template < Chris@16: typename Sequence Chris@16: , typename First Chris@16: , typename Last = use_default> Chris@16: struct erase Chris@16: { Chris@16: typedef typename result_of::begin::type seq_first_type; Chris@16: typedef typename result_of::end::type seq_last_type; Chris@16: BOOST_STATIC_ASSERT((!result_of::equal_to::value)); Chris@16: Chris@16: typedef First FirstType; Chris@16: typedef typename Chris@16: fusion_default_help< Chris@16: Last Chris@16: , typename compute_erase_last::type Chris@16: >::type Chris@16: LastType; Chris@101: Chris@16: typedef typename convert_iterator::type first_type; Chris@16: typedef typename convert_iterator::type last_type; Chris@16: typedef iterator_range left_type; Chris@16: typedef iterator_range right_type; Chris@16: typedef joint_view type; Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: inline typename Chris@16: lazy_enable_if< Chris@16: traits::is_sequence Chris@16: , typename result_of::erase Chris@16: >::type Chris@16: erase(Sequence const& seq, First const& first) Chris@16: { Chris@16: typedef result_of::erase result_of; Chris@16: typedef typename result_of::left_type left_type; Chris@16: typedef typename result_of::right_type right_type; Chris@16: typedef typename result_of::type result_type; Chris@16: Chris@16: left_type left( Chris@16: fusion::begin(seq) Chris@16: , convert_iterator::call(first)); Chris@16: right_type right( Chris@16: fusion::result_of::compute_erase_last::call(first) Chris@16: , fusion::end(seq)); Chris@16: return result_type(left, right); Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: inline typename result_of::erase::type Chris@16: erase(Sequence const& seq, First const& first, Last const& last) Chris@16: { Chris@16: typedef result_of::erase result_of; Chris@16: typedef typename result_of::left_type left_type; Chris@16: typedef typename result_of::right_type right_type; Chris@16: typedef typename result_of::type result_type; Chris@16: Chris@16: left_type left(fusion::begin(seq), first); Chris@16: right_type right(last, fusion::end(seq)); Chris@16: return result_type(left, right); Chris@16: } Chris@16: }} Chris@16: Chris@16: #endif Chris@16: