summaryrefslogtreecommitdiff
path: root/boost/fusion/support/pair.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/support/pair.hpp')
-rw-r--r--boost/fusion/support/pair.hpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/boost/fusion/support/pair.hpp b/boost/fusion/support/pair.hpp
new file mode 100644
index 0000000000..11ad1ffe7e
--- /dev/null
+++ b/boost/fusion/support/pair.hpp
@@ -0,0 +1,114 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 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 <iosfwd>
+
+#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 First, typename Second>
+ inline std::ostream&
+ operator<<(std::ostream& os, pair<First, Second> const& p)
+ {
+ os << p.second;
+ return os;
+ }
+
+ template <typename First, typename Second>
+ inline std::istream&
+ operator>>(std::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