| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | /*!@fileForward declares `boost::hana::pair`.@copyright Louis Dionne 2013-2017Distributed 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_FWD_PAIR_HPP#define BOOST_HANA_FWD_PAIR_HPP#include <boost/hana/config.hpp>#include <boost/hana/fwd/core/make.hpp>BOOST_HANA_NAMESPACE_BEGIN    //! @ingroup group-datatypes    //! Generic container for two elements.    //!    //! `hana::pair` is conceptually the same as `std::pair`. However,    //! `hana::pair` automatically compresses the storage of empty types,    //! and as a result it does not have the `.first` and `.second` members.    //! Instead, one must use the `hana::first` and `hana::second` free    //! functions to access the elements of a pair.    //!    //! @note    //! When you use a container, remember not to make assumptions about its    //! representation, unless the documentation gives you those guarantees.    //! More details [in the tutorial](@ref tutorial-containers-types).    //!    //!    //! Modeled concepts    //! ----------------    //! 1. `Comparable`\n    //! Two pairs `(x, y)` and `(x', y')` are equal if and only if both    //! `x == x'` and `y == y'`.    //! @include example/pair/comparable.cpp    //!    //! 2. `Orderable`\n    //! Pairs are ordered as-if they were 2-element tuples, using a    //! lexicographical ordering.    //! @include example/pair/orderable.cpp    //!    //! 3. `Foldable`\n    //! Folding a pair is equivalent to folding a 2-element tuple. In other    //! words:    //! @code    //!     fold_left(make_pair(x, y), s, f) == f(f(s, x), y)    //!     fold_right(make_pair(x, y), s, f) == f(x, f(y, s))    //! @endcode    //! Example:    //! @include example/pair/foldable.cpp    //!    //! 4. `Product`\n    //! The model of `Product` is the simplest one possible; the first element    //! of a pair `(x, y)` is `x`, and its second element is `y`.    //! @include example/pair/product.cpp#ifdef BOOST_HANA_DOXYGEN_INVOKED    template <typename First, typename Second>    struct pair {        //! Default constructs the `pair`. Only exists when both elements        //! of the pair are default constructible.        constexpr pair();        //! Initialize each element of the pair with the corresponding element.        //! Only exists when both elements of the pair are copy-constructible.        constexpr pair(First const& first, Second const& second);        //! Initialize both elements of the pair by perfect-forwarding the        //! corresponding argument. Only exists when both arguments are        //! implicitly-convertible to the corresponding element of the pair.        template <typename T, typename U>        constexpr pair(T&& t, U&& u);        //! Copy-initialize a pair from another pair. Only exists when both        //! elements of the source pair are implicitly convertible to the        //! corresponding element of the constructed pair.        template <typename T, typename U>        constexpr pair(pair<T, U> const& other);        //! Move-initialize a pair from another pair. Only exists when both        //! elements of the source pair are implicitly convertible to the        //! corresponding element of the constructed pair.        template <typename T, typename U>        constexpr pair(pair<T, U>&& other);        //! Assign a pair to another pair. Only exists when both elements        //! of the destination pair are assignable from the corresponding        //! element in the source pair.        template <typename T, typename U>        constexpr pair& operator=(pair<T, U> const& other);        //! Move-assign a pair to another pair. Only exists when both elements        //! of the destination pair are move-assignable from the corresponding        //! element in the source pair.        template <typename T, typename U>        constexpr pair& operator=(pair<T, U>&& other);        //! Equivalent to `hana::equal`        template <typename X, typename Y>        friend constexpr auto operator==(X&& x, Y&& y);        //! Equivalent to `hana::not_equal`        template <typename X, typename Y>        friend constexpr auto operator!=(X&& x, Y&& y);        //! Equivalent to `hana::less`        template <typename X, typename Y>        friend constexpr auto operator<(X&& x, Y&& y);        //! Equivalent to `hana::greater`        template <typename X, typename Y>        friend constexpr auto operator>(X&& x, Y&& y);        //! Equivalent to `hana::less_equal`        template <typename X, typename Y>        friend constexpr auto operator<=(X&& x, Y&& y);        //! Equivalent to `hana::greater_equal`        template <typename X, typename Y>        friend constexpr auto operator>=(X&& x, Y&& y);    };#else    template <typename First, typename Second>    struct pair;#endif    //! Tag representing `hana::pair`.    //! @relates hana::pair    struct pair_tag { };#ifdef BOOST_HANA_DOXYGEN_INVOKED    //! Creates a `hana::pair` with the given elements.    //! @relates hana::pair    //!    //!    //! Example    //! -------    //! @include example/pair/make.cpp    template <>    constexpr auto make<pair_tag> = [](auto&& first, auto&& second)        -> hana::pair<std::decay_t<decltype(first)>, std::decay_t<decltype(second)>>    {        return {forwarded(first), forwarded(second)};    };#endif    //! Alias to `make<pair_tag>`; provided for convenience.    //! @relates hana::pair    //!    //! Example    //! -------    //! @include example/pair/make.cpp    constexpr auto make_pair = make<pair_tag>;BOOST_HANA_NAMESPACE_END#endif // !BOOST_HANA_FWD_PAIR_HPP
 |