138 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /////////////////////////////////////////////////////////////////////////////// | ||
|  | /// \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 |