Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Copyright (c) 2006 Tobias Schwinger Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(FUSION_PAIR_07222005_1203) Chris@16: #define FUSION_PAIR_07222005_1203 Chris@16: Chris@101: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: Chris@16: #if defined (BOOST_MSVC) Chris@16: # pragma warning(push) Chris@16: # pragma warning (disable: 4512) // assignment operator could not be generated. Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: // A half runtime pair where the first type does not have data Chris@16: template Chris@16: struct pair Chris@16: { Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair() Chris@16: : second() {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair(pair const& rhs) Chris@16: : second(rhs.second) {} Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair(pair&& rhs) Chris@101: : second(BOOST_FUSION_FWD_ELEM(Second, rhs.second)) {} Chris@16: #endif Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair(typename detail::call_param::type val) Chris@16: : second(val) {} Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair(Second2&& val Chris@101: , typename boost::disable_if >::type* /* dummy */ = 0 Chris@16: , typename boost::enable_if >::type* /*dummy*/ = 0 Chris@101: ) : second(BOOST_FUSION_FWD_ELEM(Second, val)) {} Chris@16: #endif Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair(pair const& rhs) Chris@16: : second(rhs.second) {} Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair& operator=(pair const& rhs) Chris@16: { Chris@16: second = rhs.second; Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair& operator=(pair const& rhs) Chris@16: { Chris@16: second = rhs.second; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: pair& operator=(pair&& rhs) Chris@16: { Chris@101: second = BOOST_FUSION_FWD_ELEM(Second, rhs.second); Chris@16: return *this; Chris@16: } Chris@16: #endif Chris@16: Chris@16: typedef First first_type; Chris@16: typedef Second second_type; Chris@16: Second second; Chris@16: }; Chris@16: Chris@16: namespace result_of Chris@16: { Chris@16: template Chris@16: struct make_pair Chris@16: { Chris@16: typedef fusion::pair::type> type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct first Chris@16: { Chris@16: typedef typename Pair::first_type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct second Chris@16: { Chris@16: typedef typename Pair::second_type type; Chris@16: }; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline typename result_of::make_pair::type Chris@16: make_pair(Second const& val) Chris@16: { Chris@16: return pair::type>(val); Chris@16: } Chris@16: Chris@16: template Chris@16: inline std::ostream& Chris@16: operator<<(std::ostream& os, pair const& p) Chris@16: { Chris@16: os << p.second; Chris@16: return os; Chris@16: } Chris@16: Chris@16: template Chris@16: inline std::istream& Chris@16: operator>>(std::istream& is, pair& p) Chris@16: { Chris@16: is >> p.second; Chris@16: return is; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: operator==(pair const& l, pair const& r) Chris@16: { Chris@16: return l.second == r.second; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: operator!=(pair const& l, pair const& r) Chris@16: { Chris@16: return l.second != r.second; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: operator<(pair const& l, pair const& r) Chris@16: { Chris@16: return l.second < r.second; Chris@16: } Chris@16: }} Chris@16: Chris@16: #if defined (BOOST_MSVC) Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif