123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- ///////////////////////////////////////////////////////////////////////////////
- /// \file utility.hpp
- /// Proto callables for things found in the std \<utility\> 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 <utility>
- #include <boost/type_traits/remove_const.hpp>
- #include <boost/type_traits/remove_reference.hpp>
- #include <boost/proto/proto_fwd.hpp>
- 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<typename Sig>
- struct result;
- template<typename This, typename First, typename Second>
- struct result<This(First, Second)>
- {
- typedef
- std::pair<
- typename remove_const<typename remove_reference<First>::type>::type
- , typename remove_const<typename remove_reference<Second>::type>::type
- >
- type;
- };
- template<typename First, typename Second>
- std::pair<First, Second> 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<typename Sig>
- struct result;
- template<typename This, typename Pair>
- struct result<This(Pair)>
- {
- typedef typename Pair::first_type type;
- };
- template<typename This, typename Pair>
- struct result<This(Pair &)>
- {
- typedef typename Pair::first_type &type;
- };
- template<typename This, typename Pair>
- struct result<This(Pair const &)>
- {
- typedef typename Pair::first_type const &type;
- };
- template<typename Pair>
- typename Pair::first_type &operator()(Pair &pair) const
- {
- return pair.first;
- }
- template<typename Pair>
- 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<typename Sig>
- struct result;
- template<typename This, typename Pair>
- struct result<This(Pair)>
- {
- typedef typename Pair::second_type type;
- };
- template<typename This, typename Pair>
- struct result<This(Pair &)>
- {
- typedef typename Pair::second_type &type;
- };
- template<typename This, typename Pair>
- struct result<This(Pair const &)>
- {
- typedef typename Pair::second_type const &type;
- };
- template<typename Pair>
- typename Pair::second_type &operator()(Pair &pair) const
- {
- return pair.second;
- }
- template<typename Pair>
- typename Pair::second_type const &operator()(Pair const &pair) const
- {
- return pair.second;
- }
- };
- }}}
- #endif
|