834 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			834 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*=============================================================================
 | 
						|
    Copyright (c) 2004 Angus Leeming
 | 
						|
    Copyright (c) 2004 Joel de Guzman
 | 
						|
 | 
						|
    Distributed under 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)
 | 
						|
==============================================================================*/
 | 
						|
#ifndef BOOST_PHOENIX_STL_CONTAINER_CONTAINER_HPP
 | 
						|
#define BOOST_PHOENIX_STL_CONTAINER_CONTAINER_HPP
 | 
						|
 | 
						|
#include <boost/phoenix/core/limits.hpp>
 | 
						|
#include <boost/mpl/and.hpp>
 | 
						|
#include <boost/mpl/not.hpp>
 | 
						|
#include <boost/mpl/or.hpp>
 | 
						|
#include <boost/mpl/void.hpp>
 | 
						|
#include <boost/phoenix/stl/container/detail/container.hpp>
 | 
						|
#include <boost/phoenix/function/adapt_callable.hpp>
 | 
						|
#include <boost/type_traits/is_const.hpp>
 | 
						|
 | 
						|
namespace boost { namespace phoenix
 | 
						|
{
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//  STL container member functions
 | 
						|
//
 | 
						|
//      Lazy functions for STL container member functions
 | 
						|
//
 | 
						|
//      These functions provide a mechanism for the lazy evaluation of the
 | 
						|
//      public member functions of the STL containers. For an overview of
 | 
						|
//      what is meant by 'lazy evaluation', see the comments in operators.hpp
 | 
						|
//      and functions.hpp.
 | 
						|
//
 | 
						|
//      Lazy functions are provided for all of the member functions of the
 | 
						|
//      following containers:
 | 
						|
//
 | 
						|
//      deque - list - map - multimap - vector.
 | 
						|
//
 | 
						|
//      Indeed, should *your* class have member functions with the same names
 | 
						|
//      and signatures as those listed below, then it will automatically be
 | 
						|
//      supported. To summarize, lazy functions are provided for member
 | 
						|
//      functions:
 | 
						|
//
 | 
						|
//          assign - at - back - begin - capacity - clear - empty - end -
 | 
						|
//          erase - front - get_allocator - insert - key_comp - max_size -
 | 
						|
//          pop_back - pop_front - push_back - push_front - rbegin - rend -
 | 
						|
//          reserve - resize . size - splice - value_comp.
 | 
						|
//
 | 
						|
//      The lazy functions' names are the same as the corresponding member
 | 
						|
//      function. Sample usage:
 | 
						|
//
 | 
						|
//      "Normal" version                 "Lazy" version
 | 
						|
//      ----------------                 --------------
 | 
						|
//      my_vector.at(5)                  phoenix::at(arg1, 5)
 | 
						|
//      my_list.size()                   phoenix::size(arg1)
 | 
						|
//      my_vector1.swap(my_vector2)      phoenix::swap(arg1, arg2)
 | 
						|
//
 | 
						|
//      Notice that member functions with names that clash with a
 | 
						|
//      function in stl algorithms are absent. This will be provided
 | 
						|
//      in Phoenix's algorithm module.
 | 
						|
//
 | 
						|
//      No support is provided here for lazy versions of operator+=,
 | 
						|
//      operator[] etc. Such operators are not specific to STL containers and
 | 
						|
//      lazy versions can therefore be found in operators.hpp.
 | 
						|
//
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
//  Lazy member function implementaions.
 | 
						|
//
 | 
						|
//      The structs below provide the guts of the implementation. Thereafter,
 | 
						|
//      the corresponding lazy function itself is simply:
 | 
						|
//
 | 
						|
//          function<stl::assign> const assign = stl::assign();
 | 
						|
//
 | 
						|
//      The structs provide a nested "result" class template whose
 | 
						|
//      "type" typedef enables the lazy function to ascertain the type
 | 
						|
//      to be returned when it is invoked.
 | 
						|
//
 | 
						|
//      They also provide operator() member functions with signatures
 | 
						|
//      corresponding to those of the underlying member function of
 | 
						|
//      the STL container.
 | 
						|
//
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
    namespace stl
 | 
						|
    {
 | 
						|
        struct assign
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <
 | 
						|
                typename This
 | 
						|
              , typename C
 | 
						|
              , typename Arg1
 | 
						|
            >
 | 
						|
            struct result<This(C&, Arg1&)>
 | 
						|
            {
 | 
						|
                typedef typename add_reference<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <
 | 
						|
                typename This
 | 
						|
              , typename C
 | 
						|
              , typename Arg1
 | 
						|
              , typename Arg2
 | 
						|
            >
 | 
						|
            struct result<This(C&, Arg1, Arg2)>
 | 
						|
            {
 | 
						|
                typedef typename add_reference<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <
 | 
						|
                typename This
 | 
						|
              , typename C
 | 
						|
              , typename Arg1
 | 
						|
              , typename Arg2
 | 
						|
              , typename Arg3
 | 
						|
            >
 | 
						|
            struct result<This(C&, Arg1, Arg2, Arg3)>
 | 
						|
            {
 | 
						|
                typedef typename add_reference<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C, typename Arg1>
 | 
						|
            C& operator()(C& c, Arg1 const & arg1) const
 | 
						|
            {
 | 
						|
                c.assign(arg1);
 | 
						|
                return c;
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename C, typename Arg1, typename Arg2>
 | 
						|
            C& operator()(C& c, Arg1 arg1, Arg2 arg2) const
 | 
						|
            {
 | 
						|
                c.assign(arg1, arg2);
 | 
						|
                return c;
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename C, typename Arg1, typename Arg2, typename Arg3>
 | 
						|
            C& operator()(
 | 
						|
                C& c
 | 
						|
              , Arg1 arg1
 | 
						|
              , Arg2 arg2
 | 
						|
              , Arg3 const & arg3
 | 
						|
            ) const
 | 
						|
            {
 | 
						|
                return c.assign(arg1, arg2, arg3);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct at_impl
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C, typename Index>
 | 
						|
            struct result<This(C&, Index)>
 | 
						|
            {
 | 
						|
                //typedef typename const_qualified_reference_of<C>::type type;
 | 
						|
                typedef typename C::value_type & type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C, typename Index>
 | 
						|
            typename result<at_impl(C&, Index const&)>::type
 | 
						|
            operator()(C& c, Index const &i) const
 | 
						|
            {
 | 
						|
                return c.at(i);
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename This, typename C, typename Index>
 | 
						|
            struct result<This(C const&, Index)>
 | 
						|
            {
 | 
						|
                typedef typename C::value_type const & type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C, typename Index>
 | 
						|
            typename result<at_impl(C const&, Index const&)>::type
 | 
						|
            operator()(C const& c, Index const &i) const
 | 
						|
            {
 | 
						|
                return c.at(i);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct back
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef
 | 
						|
                    typename const_qualified_reference_of<C>::type
 | 
						|
                type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<back(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.back();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct begin
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename const_qualified_iterator_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<begin(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.begin();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct capacity
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename size_type_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<capacity(C&)>::type
 | 
						|
            operator()(C const& c) const
 | 
						|
            {
 | 
						|
                return c.capacity();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct clear
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            void operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.clear();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct empty
 | 
						|
        {
 | 
						|
            typedef bool result_type;
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            bool operator()(C const& c) const
 | 
						|
            {
 | 
						|
                return c.empty();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct end
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename const_qualified_iterator_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<end(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.end();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        namespace result_of
 | 
						|
        {
 | 
						|
            template <typename C, typename Arg1, typename Arg2 = mpl::void_>
 | 
						|
            struct erase
 | 
						|
            {
 | 
						|
                //  BOOST_MSVC #if branch here in map_erase_result non-
 | 
						|
                //  standard behavior. The return type should be void but
 | 
						|
                //  VC7.1 prefers to return iterator_of<C>. As a result,
 | 
						|
                //  VC7.1 complains of error C2562:
 | 
						|
                //  boost::phoenix::stl::erase::operator() 'void' function
 | 
						|
                //  returning a value. Oh well... :*
 | 
						|
 | 
						|
                typedef
 | 
						|
                    boost::mpl::eval_if_c<
 | 
						|
                        boost::is_same<
 | 
						|
                            typename remove_reference<Arg1>::type
 | 
						|
                          , typename iterator_of<C>::type
 | 
						|
                        >::value
 | 
						|
#if defined(BOOST_MSVC)// && (BOOST_MSVC <= 1500)
 | 
						|
                      , iterator_of<C>
 | 
						|
#else
 | 
						|
                      , boost::mpl::identity<void>
 | 
						|
#endif
 | 
						|
                      , size_type_of<C>
 | 
						|
                    >
 | 
						|
                map_erase_result;
 | 
						|
 | 
						|
                typedef typename
 | 
						|
                    boost::mpl::eval_if_c<
 | 
						|
                        has_mapped_type<C>::value
 | 
						|
                      , map_erase_result
 | 
						|
                      , iterator_of<C>
 | 
						|
                    >::type
 | 
						|
                type;
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
        struct erase
 | 
						|
        {
 | 
						|
            //  This mouthful can differentiate between the generic erase
 | 
						|
            //  functions (Container == std::deque, std::list, std::vector) and
 | 
						|
            //  that specific to the two map-types, std::map and std::multimap.
 | 
						|
            //
 | 
						|
            //  where C is a std::deque, std::list, std::vector:
 | 
						|
            //
 | 
						|
            //      1) iterator C::erase(iterator where);
 | 
						|
            //      2) iterator C::erase(iterator first, iterator last);
 | 
						|
            //
 | 
						|
            //  where M is a std::map or std::multimap:
 | 
						|
            //
 | 
						|
            //      3) size_type M::erase(const Key& keyval);
 | 
						|
            //      4) void M::erase(iterator where);
 | 
						|
            //      5) void M::erase(iterator first, iterator last);
 | 
						|
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C, typename Arg1>
 | 
						|
            struct result<This(C&, Arg1)>
 | 
						|
                : result_of::erase<C, Arg1>
 | 
						|
            {};
 | 
						|
 | 
						|
            template <typename This, typename C, typename Arg1, typename Arg2>
 | 
						|
            struct result<This(C&, Arg1, Arg2)>
 | 
						|
                : result_of::erase<C, Arg1, Arg2>
 | 
						|
            {};
 | 
						|
 | 
						|
            template <typename C, typename Arg1>
 | 
						|
            typename result_of::erase<C, Arg1>::type
 | 
						|
            operator()(C& c, Arg1 arg1) const
 | 
						|
            {
 | 
						|
                typedef typename result_of::erase<C, Arg1>::type result_type;
 | 
						|
                return static_cast<result_type>(c.erase(arg1));
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename C, typename Arg1, typename Arg2>
 | 
						|
            typename result_of::erase<C, Arg1, Arg2>::type
 | 
						|
            operator()(C& c, Arg1 arg1, Arg2 arg2) const
 | 
						|
            {
 | 
						|
                typedef typename result_of::erase<C, Arg1, Arg2>::type result_type;
 | 
						|
                return static_cast<result_type>(c.erase(arg1, arg2));
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct front
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename const_qualified_reference_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<front(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.front();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct get_allocator
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename allocator_type_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<get_allocator(C const&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.get_allocator();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        namespace result_of
 | 
						|
        {
 | 
						|
            template <
 | 
						|
                typename C
 | 
						|
              , typename Arg1
 | 
						|
              , typename Arg2 = mpl::void_
 | 
						|
              , typename Arg3 = mpl::void_
 | 
						|
            >
 | 
						|
            class insert
 | 
						|
            {
 | 
						|
                struct pair_iterator_bool
 | 
						|
                {
 | 
						|
                    typedef typename std::pair<typename C::iterator, bool> type;
 | 
						|
                };
 | 
						|
 | 
						|
                typedef
 | 
						|
                    boost::mpl::eval_if<
 | 
						|
                        map_insert_returns_pair<typename remove_const<C>::type>
 | 
						|
                      , pair_iterator_bool
 | 
						|
                      , iterator_of<C>
 | 
						|
                    >
 | 
						|
                choice_1;
 | 
						|
 | 
						|
                typedef
 | 
						|
                    boost::mpl::eval_if_c<
 | 
						|
                        boost::mpl::and_<
 | 
						|
                            boost::is_same<Arg3, mpl::void_>
 | 
						|
                          , boost::mpl::not_<boost::is_same<Arg1, Arg2> >
 | 
						|
                        >::value
 | 
						|
                      , iterator_of<C>
 | 
						|
                      , boost::mpl::identity<void>
 | 
						|
                    >
 | 
						|
                choice_2;
 | 
						|
 | 
						|
            public:
 | 
						|
 | 
						|
                typedef typename
 | 
						|
                    boost::mpl::eval_if_c<
 | 
						|
                        boost::is_same<Arg2, mpl::void_>::value
 | 
						|
                      , choice_1
 | 
						|
                      , choice_2
 | 
						|
                    >::type
 | 
						|
                type;
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
        struct insert
 | 
						|
        {
 | 
						|
            //  This mouthful can differentiate between the generic insert
 | 
						|
            //  functions (Container == deque, list, vector) and those
 | 
						|
            //  specific to the two map-types, std::map and std::multimap.
 | 
						|
            //
 | 
						|
            //  where C is a std::deque, std::list, std::vector:
 | 
						|
            //
 | 
						|
            //      1) iterator C::insert(iterator where, value_type value);
 | 
						|
            //      2) void C::insert(
 | 
						|
            //          iterator where, size_type count, value_type value);
 | 
						|
            //      3) template <typename Iter>
 | 
						|
            //         void C::insert(iterator where, Iter first, Iter last);
 | 
						|
            //
 | 
						|
            //  where M is a std::map and MM is a std::multimap:
 | 
						|
            //
 | 
						|
            //      4) pair<iterator, bool> M::insert(value_type const&);
 | 
						|
            //      5) iterator MM::insert(value_type const&);
 | 
						|
            //
 | 
						|
            //  where M is a std::map or std::multimap:
 | 
						|
            //
 | 
						|
            //      6) template <typename Iter>
 | 
						|
            //         void M::insert(Iter first, Iter last);
 | 
						|
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <
 | 
						|
                typename This
 | 
						|
              , typename C
 | 
						|
              , typename Arg1
 | 
						|
            >
 | 
						|
            struct result<This(C &, Arg1)>
 | 
						|
                : result_of::insert<C, Arg1>
 | 
						|
            {};
 | 
						|
 | 
						|
            template <
 | 
						|
                typename This
 | 
						|
              , typename C
 | 
						|
              , typename Arg1
 | 
						|
              , typename Arg2
 | 
						|
            >
 | 
						|
            struct result<This(C &, Arg1, Arg2)>
 | 
						|
                : result_of::insert<C, Arg1, Arg2>
 | 
						|
            {};
 | 
						|
 | 
						|
            template <
 | 
						|
                typename This
 | 
						|
              , typename C
 | 
						|
              , typename Arg1
 | 
						|
              , typename Arg2
 | 
						|
              , typename Arg3
 | 
						|
            >
 | 
						|
            struct result<This(C &, Arg1, Arg2, Arg3)>
 | 
						|
                : result_of::insert<C, Arg1, Arg2, Arg3>
 | 
						|
            {};
 | 
						|
 | 
						|
            template <typename C, typename Arg1>
 | 
						|
            typename result<insert(C&, Arg1)>::type
 | 
						|
            operator()(C& c, Arg1 arg1) const
 | 
						|
            {
 | 
						|
                return c.insert(arg1);
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename C, typename Arg1, typename Arg2>
 | 
						|
            typename result<insert(C&, Arg1, Arg2)>::type
 | 
						|
            operator()(C& c, Arg1 arg1, Arg2 arg2) const
 | 
						|
            {
 | 
						|
                typedef typename result<insert(C&, Arg1, Arg2)>::type result_type;
 | 
						|
                return static_cast<result_type>(c.insert(arg1, arg2));
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename C, typename Arg1, typename Arg2, typename Arg3>
 | 
						|
            typename result<insert(C&, Arg1, Arg2, Arg3)>::type
 | 
						|
            operator()(C& c, Arg1 arg1, Arg2 arg2, Arg3 arg3) const
 | 
						|
            {
 | 
						|
                typedef typename result<insert(C&, Arg1, Arg2, Arg3)>::type result_type;
 | 
						|
                return static_cast<result_type>(c.insert(arg1, arg2, arg3));
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        namespace result_of
 | 
						|
        {
 | 
						|
            template <typename C>
 | 
						|
            struct key_comp
 | 
						|
            {
 | 
						|
                typedef typename key_compare_of<C>::type type;
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
        struct key_comp
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
                : result_of::key_comp<C>
 | 
						|
            {};
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result_of::key_comp<C>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.key_comp();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct max_size
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename size_type_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<max_size(C const&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.max_size();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct pop_back
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            void operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.pop_back();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct pop_front
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            void operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.pop_front();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct push_back
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C, typename Arg>
 | 
						|
            void operator()(C& c, Arg const& data) const
 | 
						|
            {
 | 
						|
                return c.push_back(data);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct push_front
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C, typename Arg>
 | 
						|
            void operator()(C& c, Arg const& data) const
 | 
						|
            {
 | 
						|
                return c.push_front(data);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct rbegin
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename
 | 
						|
                    const_qualified_reverse_iterator_of<C>::type
 | 
						|
                type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<rbegin(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.rbegin();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct rend
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename
 | 
						|
                    const_qualified_reverse_iterator_of<C>::type
 | 
						|
                type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<rend(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.rend();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct reserve
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C, typename Arg>
 | 
						|
            void operator()(C& c, Arg const& count) const
 | 
						|
            {
 | 
						|
                c.reserve(count);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct resize
 | 
						|
        {
 | 
						|
            typedef void result_type;
 | 
						|
 | 
						|
            template <typename C, typename Arg1>
 | 
						|
            void operator()(C& c, Arg1 const& arg1) const
 | 
						|
            {
 | 
						|
                c.resize(arg1);
 | 
						|
            }
 | 
						|
 | 
						|
            template <typename C, typename Arg1, typename Arg2>
 | 
						|
            void operator()(C& c, Arg1 const& arg1, Arg2 const& arg2) const
 | 
						|
            {
 | 
						|
                c.resize(arg1, arg2);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        struct size
 | 
						|
        {
 | 
						|
            template <typename Sig>
 | 
						|
            struct result;
 | 
						|
 | 
						|
            template <typename This, typename C>
 | 
						|
            struct result<This(C&)>
 | 
						|
            {
 | 
						|
                typedef typename size_type_of<C>::type type;
 | 
						|
            };
 | 
						|
 | 
						|
            template <typename C>
 | 
						|
            typename result<size(C&)>::type
 | 
						|
            operator()(C& c) const
 | 
						|
            {
 | 
						|
                return c.size();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
    struct splice
 | 
						|
    {
 | 
						|
        typedef void result_type;
 | 
						|
 | 
						|
        template <typename C, typename Arg1, typename Arg2>
 | 
						|
        void operator()(C& c, Arg1 arg1, Arg2 &arg2) const
 | 
						|
        {
 | 
						|
            c.splice(arg1, arg2);
 | 
						|
        }
 | 
						|
 | 
						|
        template <
 | 
						|
            typename C
 | 
						|
          , typename Arg1
 | 
						|
          , typename Arg2
 | 
						|
          , typename Arg3
 | 
						|
        >
 | 
						|
        void operator()(
 | 
						|
            C& c
 | 
						|
          , Arg1 arg1
 | 
						|
          , Arg2 & arg2
 | 
						|
          , Arg3 arg3
 | 
						|
        ) const
 | 
						|
        {
 | 
						|
            c.splice(arg1, arg2, arg3);
 | 
						|
        }
 | 
						|
 | 
						|
        template <
 | 
						|
            typename C
 | 
						|
          , typename Arg1
 | 
						|
          , typename Arg2
 | 
						|
          , typename Arg3
 | 
						|
          , typename Arg4
 | 
						|
        >
 | 
						|
        void operator()(
 | 
						|
            C c
 | 
						|
          , Arg1 arg1
 | 
						|
          , Arg2 & arg2
 | 
						|
          , Arg3 arg3
 | 
						|
          , Arg4 arg4
 | 
						|
        ) const
 | 
						|
        {
 | 
						|
            c.splice(arg1, arg2, arg3, arg4);
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    namespace result_of
 | 
						|
    {
 | 
						|
        template <typename C>
 | 
						|
        struct value_comp
 | 
						|
        {
 | 
						|
            typedef typename value_compare_of<C>::type type;
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    struct value_comp
 | 
						|
    {
 | 
						|
        template <typename Sig>
 | 
						|
        struct result;
 | 
						|
 | 
						|
        template <typename This, typename C>
 | 
						|
        struct result<This(C&)>
 | 
						|
            : result_of::value_comp<C>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename C>
 | 
						|
        typename result_of::value_comp<C>::type
 | 
						|
        operator()(C& c) const
 | 
						|
        {
 | 
						|
            return c.value_comp();
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
} // namespace stl
 | 
						|
 | 
						|
    ///////////////////////////////////////////////////////////////////////////////
 | 
						|
    //
 | 
						|
    //  The lazy functions themselves.
 | 
						|
    //
 | 
						|
    ///////////////////////////////////////////////////////////////////////////////
 | 
						|
    namespace adl_barrier
 | 
						|
    {
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(assign, boost::phoenix::stl::assign, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(assign, boost::phoenix::stl::assign, 3)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(assign, boost::phoenix::stl::assign, 4)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(at, ::boost::phoenix::stl::at_impl, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(back, stl::back, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(begin, stl::begin, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(capacity, stl::capacity, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(clear, stl::clear, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(empty, stl::empty, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(end, stl::end, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(erase, stl::erase, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(erase, stl::erase, 3)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(front, stl::front, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(get_allocator, stl::get_allocator, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(insert, stl::insert, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(insert, stl::insert, 3)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(insert, stl::insert, 4)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(key_comp, stl::key_comp, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(max_size, stl::max_size, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(pop_back, stl::pop_back, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(pop_front, stl::pop_front, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(push_back, stl::push_back, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(push_front, stl::push_front, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(rbegin, stl::rbegin, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(rend, stl::rend, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(reserve, stl::reserve, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(resize, stl::resize, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(resize, stl::resize, 3)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(size, stl::size, 1)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(splice, stl::splice, 2)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(splice, stl::splice, 3)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(splice, stl::splice, 4)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(splice, stl::splice, 5)
 | 
						|
        BOOST_PHOENIX_ADAPT_CALLABLE(value_comp, stl::value_comp, 1)
 | 
						|
    }
 | 
						|
 | 
						|
    using namespace phoenix::adl_barrier;
 | 
						|
}} // namespace boost::phoenix
 | 
						|
 | 
						|
#endif // BOOST_PHOENIX_STL_CONTAINERS_HPP
 |