834 lines
26 KiB
C++
834 lines
26 KiB
C++
|
/*=============================================================================
|
||
|
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
|