]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/hana/test/_include/support/minimal_product.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / hana / test / _include / support / minimal_product.hpp
CommitLineData
b32b8144 1// Copyright Louis Dionne 2013-2017
7c673cae
FG
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
4
5#ifndef TEST_SUPPORT_MINIMAL_PRODUCT_HPP
6#define TEST_SUPPORT_MINIMAL_PRODUCT_HPP
7
8#include <boost/hana/fwd/core/make.hpp>
9#include <boost/hana/fwd/first.hpp>
10#include <boost/hana/fwd/second.hpp>
11
12#include <type_traits>
13
14
15struct MinimalProduct;
16
17template <typename X, typename Y>
18struct product_t {
19 X fst;
20 Y snd;
21 using hana_tag = MinimalProduct;
22};
23
24struct make_minimal_product {
25 template <typename T, typename U>
26 constexpr product_t<typename std::decay<T>::type,
27 typename std::decay<U>::type>
28 operator()(T&& t, U&& u) const {
29 return {static_cast<T&&>(t), static_cast<U&&>(u)};
30 }
31};
32
33constexpr make_minimal_product minimal_product{};
34
35namespace boost { namespace hana {
36 //////////////////////////////////////////////////////////////////////////
37 // Product
38 //////////////////////////////////////////////////////////////////////////
39 template <>
40 struct make_impl<MinimalProduct> {
41 template <typename X, typename Y>
42 static constexpr auto apply(X x, Y y)
43 { return ::minimal_product(x, y); }
44 };
45
46 template <>
47 struct first_impl<MinimalProduct> {
48 template <typename P>
49 static constexpr decltype(auto) apply(P&& p)
50 { return p.fst; }
51 };
52
53 template <>
54 struct second_impl<MinimalProduct> {
55 template <typename P>
56 static constexpr decltype(auto) apply(P&& p)
57 { return p.snd; }
58 };
59}} // end namespace boost::hana
60
61#endif // !TEST_SUPPORT_MINIMAL_PRODUCT_HPP