/////////////////////////////////////////////////////////////////////////////// /// \file utility.hpp /// Proto callables for things found in the std \ header // // Copyright 2010 Eric Niebler. 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_PROTO_FUNCTIONAL_STD_UTILITY_HPP_EAN_11_27_2010 #define BOOST_PROTO_FUNCTIONAL_STD_UTILITY_HPP_EAN_11_27_2010 #include #include #include #include namespace boost { namespace proto { namespace functional { /// \brief A PolymorphicFunctionObject type that invokes the /// \c std::make_pair() algorithm on its arguments. /// /// A PolymorphicFunctionObject type that invokes the /// \c std::make_pair() algorithm on its arguments. struct make_pair { BOOST_PROTO_CALLABLE() template struct result; template struct result { typedef std::pair< typename remove_const::type>::type , typename remove_const::type>::type > type; }; template std::pair operator()(First const &first, Second const &second) const { return std::make_pair(first, second); } }; /// \brief A PolymorphicFunctionObject type that returns /// the first element of a std::pair. /// /// A PolymorphicFunctionObject type that returns /// the first element of a std::pair.. struct first { BOOST_PROTO_CALLABLE() template struct result; template struct result { typedef typename Pair::first_type type; }; template struct result { typedef typename Pair::first_type &type; }; template struct result { typedef typename Pair::first_type const &type; }; template typename Pair::first_type &operator()(Pair &pair) const { return pair.first; } template typename Pair::first_type const &operator()(Pair const &pair) const { return pair.first; } }; /// \brief A PolymorphicFunctionObject type that returns /// the second element of a std::pair. /// /// A PolymorphicFunctionObject type that returns /// the second element of a std::pair.. struct second { BOOST_PROTO_CALLABLE() template struct result; template struct result { typedef typename Pair::second_type type; }; template struct result { typedef typename Pair::second_type &type; }; template struct result { typedef typename Pair::second_type const &type; }; template typename Pair::second_type &operator()(Pair &pair) const { return pair.second; } template typename Pair::second_type const &operator()(Pair const &pair) const { return pair.second; } }; }}} #endif