| /*============================================================================= |
| Copyright (c) 2005 Joel de Guzman |
| Copyright (c) 2006 Tobias Schwinger |
| |
| 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) |
| ==============================================================================*/ |
| #if !defined(FUSION_PAIR_07222005_1203) |
| #define FUSION_PAIR_07222005_1203 |
| |
| #include <boost/fusion/support/detail/access.hpp> |
| #include <boost/fusion/support/detail/as_fusion_element.hpp> |
| #include <boost/config.hpp> |
| |
| #if defined (BOOST_MSVC) |
| # pragma warning(push) |
| # pragma warning (disable: 4512) // assignment operator could not be generated. |
| #endif |
| |
| namespace boost { namespace fusion |
| { |
| // A half runtime pair where the first type does not have data |
| template <typename First, typename Second> |
| struct pair |
| { |
| pair() |
| : second() {} |
| |
| pair(typename detail::call_param<Second>::type val) |
| : second(val) {} |
| |
| template <typename Second2> |
| pair(pair<First, Second2> const& rhs) |
| : second(rhs.second) {} |
| |
| template <typename Second2> |
| pair& operator=(pair<First, Second2> const& rhs) |
| { |
| second = rhs.second; |
| return *this; |
| } |
| |
| typedef First first_type; |
| typedef Second second_type; |
| Second second; |
| }; |
| |
| namespace result_of |
| { |
| template<typename First, typename Second> |
| struct make_pair |
| { |
| typedef fusion::pair<First, |
| typename detail::as_fusion_element<Second>::type> type; |
| }; |
| |
| template<class Pair> |
| struct first |
| { |
| typedef typename Pair::first_type type; |
| }; |
| |
| template<class Pair> |
| struct second |
| { |
| typedef typename Pair::second_type type; |
| }; |
| } |
| |
| template <typename First, typename Second> |
| inline typename result_of::make_pair<First,Second>::type |
| make_pair(Second const& val) |
| { |
| return pair<First, typename detail::as_fusion_element<Second>::type>(val); |
| } |
| |
| template <typename OStream, typename First, typename Second> |
| inline OStream& |
| operator<<(OStream& os, pair<First, Second> const& p) |
| { |
| os << p.second; |
| return os; |
| } |
| |
| template <typename IStream, typename First, typename Second> |
| inline IStream& |
| operator>>(IStream& is, pair<First, Second>& p) |
| { |
| is >> p.second; |
| return is; |
| } |
| |
| template <typename First, typename SecondL, typename SecondR> |
| inline bool |
| operator==(pair<First, SecondL> const& l, pair<First, SecondR> const& r) |
| { |
| return l.second == r.second; |
| } |
| |
| template <typename First, typename SecondL, typename SecondR> |
| inline bool |
| operator!=(pair<First, SecondL> const& l, pair<First, SecondR> const& r) |
| { |
| return l.second != r.second; |
| } |
| }} |
| |
| #if defined (BOOST_MSVC) |
| # pragma warning(pop) |
| #endif |
| |
| #endif |