]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/hof/test/tuple_transform.cpp
1 /*=============================================================================
2 Copyright (c) 2017 Paul Fultz II
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #include <boost/hof/proj.hpp>
8 #include <boost/hof/construct.hpp>
9 #include <boost/hof/unpack.hpp>
10 #include <boost/hof/function.hpp>
11 #include <boost/hof/placeholders.hpp>
12 #include <boost/hof/compose.hpp>
13 // Disable static checks for gcc 4.7
14 #ifndef BOOST_HOF_HAS_STATIC_TEST_CHECK
15 #if (defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 8)
16 #define BOOST_HOF_HAS_STATIC_TEST_CHECK 0
21 struct tuple_transform_f
23 template<class Sequence
, class F
>
24 constexpr auto operator()(Sequence
&& s
, F f
) const BOOST_HOF_RETURNS
26 boost::hof::unpack(boost::hof::proj(f
, boost::hof::construct
<std::tuple
>()))(boost::hof::forward
<Sequence
>(s
))
30 struct pack_transform_f
32 template<class Sequence
, class F
>
33 constexpr auto operator()(Sequence
&& s
, F f
) const BOOST_HOF_RETURNS
35 boost::hof::unpack(boost::hof::proj(f
, boost::hof::pack()))(boost::hof::forward
<Sequence
>(s
))
39 BOOST_HOF_STATIC_FUNCTION(tuple_transform
) = tuple_transform_f
{};
40 // BOOST_HOF_STATIC_FUNCTION(pack_transform) = pack_transform_f{};
42 #if !BOOST_HOF_HAS_CONSTEXPR_TUPLE
43 #define TUPLE_TRANSFORM_STATIC_CHECK(...)
45 #define TUPLE_TRANSFORM_STATIC_CHECK BOOST_HOF_STATIC_TEST_CHECK
51 auto t
= std::make_tuple(1, 2);
52 auto r
= tuple_transform(t
, [](int i
) { return i
*i
; });
53 BOOST_HOF_TEST_CHECK(r
== std::make_tuple(1, 4));
58 TUPLE_TRANSFORM_STATIC_CHECK(tuple_transform(std::make_tuple(1, 2), boost::hof::_1
* boost::hof::_1
) == std::make_tuple(1, 4));
61 #define TUPLE_TRANSFORM_CHECK_ID(x) \
62 BOOST_HOF_TEST_CHECK(tuple_transform(x, boost::hof::identity) == x); \
63 TUPLE_TRANSFORM_STATIC_CHECK(tuple_transform(x, boost::hof::identity) == x);
67 TUPLE_TRANSFORM_CHECK_ID(std::make_tuple(1, 2));
68 TUPLE_TRANSFORM_CHECK_ID(std::make_tuple(1));
69 TUPLE_TRANSFORM_CHECK_ID(std::make_tuple());
74 auto x
= tuple_transform(std::make_tuple(std::unique_ptr
<int>(new int(3))), boost::hof::identity
);
75 auto y
= std::make_tuple(std::unique_ptr
<int>(new int(3)));
76 BOOST_HOF_TEST_CHECK(x
!= y
);
77 BOOST_HOF_TEST_CHECK(tuple_transform(x
, *boost::hof::_1
) == tuple_transform(y
, *boost::hof::_1
));
80 #define TUPLE_TRANSFORM_CHECK_COMPOSE(x, f, g) \
81 BOOST_HOF_TEST_CHECK(tuple_transform(x, boost::hof::compose(f, g)) == tuple_transform(tuple_transform(x, g), f)); \
82 TUPLE_TRANSFORM_STATIC_CHECK(tuple_transform(x, boost::hof::compose(f, g)) == tuple_transform(tuple_transform(x, g), f));
86 TUPLE_TRANSFORM_CHECK_COMPOSE(std::make_tuple(1, 2, 3, 4), boost::hof::_1
* boost::hof::_1
, boost::hof::_1
+ boost::hof::_1
);
87 TUPLE_TRANSFORM_CHECK_COMPOSE(std::make_tuple(1, 2, 3), boost::hof::_1
* boost::hof::_1
, boost::hof::_1
+ boost::hof::_1
);
88 TUPLE_TRANSFORM_CHECK_COMPOSE(std::make_tuple(1), boost::hof::_1
* boost::hof::_1
, boost::hof::_1
+ boost::hof::_1
);
89 TUPLE_TRANSFORM_CHECK_COMPOSE(std::make_tuple(), boost::hof::_1
* boost::hof::_1
, boost::hof::_1
+ boost::hof::_1
);