1 2 #ifndef BOOST_MPL_INSERT_IMPL_HPP_INCLUDED 3 #define BOOST_MPL_INSERT_IMPL_HPP_INCLUDED 4 5 // Copyright Aleksey Gurtovoy 2000-2004 6 // 7 // Distributed under the Boost Software License, Version 1.0. 8 // (See accompanying file LICENSE_1_0.txt or copy at 9 // http://www.boost.org/LICENSE_1_0.txt) 10 // 11 // See http://www.boost.org/libs/mpl for documentation. 12 13 // $Id$ 14 // $Date$ 15 // $Revision$ 16 17 #include <boost/mpl/reverse_fold.hpp> 18 #include <boost/mpl/iterator_range.hpp> 19 #include <boost/mpl/clear.hpp> 20 #include <boost/mpl/push_front.hpp> 21 #include <boost/mpl/aux_/na_spec.hpp> 22 #include <boost/mpl/aux_/traits_lambda_spec.hpp> 23 #include <boost/type_traits/is_same.hpp> 24 25 namespace boost { namespace mpl { 26 27 // default implementation; conrete sequences might override it by 28 // specializing either the 'insert_impl' or the primary 'insert' template 29 30 template< typename Tag > 31 struct insert_impl 32 { 33 template< 34 typename Sequence 35 , typename Pos 36 , typename T 37 > 38 struct apply 39 { 40 typedef iterator_range< 41 typename begin<Sequence>::type 42 , Pos 43 > first_half_; 44 45 typedef iterator_range< 46 Pos 47 , typename end<Sequence>::type 48 > second_half_; 49 50 typedef typename reverse_fold< 51 second_half_ 52 , typename clear<Sequence>::type 53 , push_front<_,_> 54 >::type half_sequence_; 55 56 typedef typename reverse_fold< 57 first_half_ 58 , typename push_front<half_sequence_,T>::type 59 , push_front<_,_> 60 >::type type; 61 }; 62 }; 63 64 BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(3,insert_impl) 65 66 }} 67 68 #endif // BOOST_MPL_INSERT_IMPL_HPP_INCLUDED 69