summaryrefslogtreecommitdiff
path: root/boost/hana/ext/std/pair.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hana/ext/std/pair.hpp')
-rw-r--r--boost/hana/ext/std/pair.hpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/boost/hana/ext/std/pair.hpp b/boost/hana/ext/std/pair.hpp
new file mode 100644
index 0000000000..fc60218e85
--- /dev/null
+++ b/boost/hana/ext/std/pair.hpp
@@ -0,0 +1,91 @@
+/*!
+@file
+Adapts `std::pair` for use with Hana.
+
+@copyright Louis Dionne 2013-2016
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_HANA_EXT_STD_PAIR_HPP
+#define BOOST_HANA_EXT_STD_PAIR_HPP
+
+#include <boost/hana/config.hpp>
+#include <boost/hana/fwd/core/make.hpp>
+#include <boost/hana/fwd/core/tag_of.hpp>
+#include <boost/hana/fwd/first.hpp>
+#include <boost/hana/fwd/second.hpp>
+
+#include <utility>
+
+
+#ifdef BOOST_HANA_DOXYGEN_INVOKED
+namespace std {
+ //! @ingroup group-ext-std
+ //! Adaptation of `std::pair` for Hana.
+ //!
+ //!
+ //! Modeled concepts
+ //! ----------------
+ //! A `std::pair` models exactly the same concepts as a `hana::pair`.
+ //! Please refer to the documentation of `hana::pair` for details.
+ //!
+ //! @include example/ext/std/pair.cpp
+ template <typename First, typename Second>
+ struct pair { };
+}
+#endif
+
+
+BOOST_HANA_NAMESPACE_BEGIN
+ namespace ext { namespace std { struct pair_tag; }}
+
+ template <typename First, typename Second>
+ struct tag_of<std::pair<First, Second>> {
+ using type = ext::std::pair_tag;
+ };
+
+ //////////////////////////////////////////////////////////////////////////
+ // Product
+ //////////////////////////////////////////////////////////////////////////
+ template <>
+ struct make_impl<ext::std::pair_tag> {
+ template <typename X, typename Y>
+ static constexpr decltype(auto) apply(X&& x, Y&& y) {
+ return std::make_pair(static_cast<X&&>(x),
+ static_cast<Y&&>(y));
+ }
+ };
+
+ template <>
+ struct first_impl<ext::std::pair_tag> {
+ template <typename T, typename U>
+ static constexpr T const& apply(std::pair<T, U> const& p)
+ { return p.first; }
+
+ template <typename T, typename U>
+ static constexpr T& apply(std::pair<T, U>& p)
+ { return p.first; }
+
+ template <typename T, typename U>
+ static constexpr T&& apply(std::pair<T, U>&& p)
+ { return static_cast<T&&>(p.first); }
+ };
+
+ template <>
+ struct second_impl<ext::std::pair_tag> {
+ template <typename T, typename U>
+ static constexpr U const& apply(std::pair<T, U> const& p)
+ { return p.second; }
+
+ template <typename T, typename U>
+ static constexpr U& apply(std::pair<T, U>& p)
+ { return p.second; }
+
+ template <typename T, typename U>
+ static constexpr U&& apply(std::pair<T, U>&& p)
+ { return static_cast<U&&>(p.second); }
+ };
+BOOST_HANA_NAMESPACE_END
+
+#endif // !BOOST_HANA_EXT_STD_PAIR_HPP