diff options
Diffstat (limited to 'boost/hana/ext/std/pair.hpp')
-rw-r--r-- | boost/hana/ext/std/pair.hpp | 91 |
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 |