1// Copyright Louis Dionne 2013-2022
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#include <boost/hana/assert.hpp>
6#include <boost/hana/equal.hpp>
7#include <boost/hana/experimental/types.hpp>
8#include <boost/hana/transform.hpp>
9#include <boost/hana/type.hpp>
10namespace hana = boost::hana;
11
12
13template <typename ...>
14struct mf { struct type; };
15
16template <int> struct x;
17struct undefined { };
18
19int main() {
20 BOOST_HANA_CONSTANT_CHECK(hana::equal(
21 hana::transform(hana::experimental::types<>{}, undefined{}),
22 hana::experimental::types<>{}
23 ));
24
25 // with a Metafunction
26 {
27 BOOST_HANA_CONSTANT_CHECK(hana::equal(
28 hana::transform(hana::experimental::types<x<0>>{}, hana::metafunction<mf>),
29 hana::experimental::types<mf<x<0>>::type>{}
30 ));
31
32 BOOST_HANA_CONSTANT_CHECK(hana::equal(
33 hana::transform(hana::experimental::types<x<0>, x<1>>{}, hana::metafunction<mf>),
34 hana::experimental::types<mf<x<0>>::type, mf<x<1>>::type>{}
35 ));
36
37 BOOST_HANA_CONSTANT_CHECK(hana::equal(
38 hana::transform(hana::experimental::types<x<0>, x<1>, x<2>>{}, hana::metafunction<mf>),
39 hana::experimental::types<mf<x<0>>::type, mf<x<1>>::type, mf<x<2>>::type>{}
40 ));
41
42 BOOST_HANA_CONSTANT_CHECK(hana::equal(
43 hana::transform(hana::experimental::types<x<0>, x<1>, x<2>, x<3>>{}, hana::metafunction<mf>),
44 hana::experimental::types<mf<x<0>>::type, mf<x<1>>::type, mf<x<2>>::type, mf<x<3>>::type>{}
45 ));
46 }
47
48 // with a non-Metafunction
49 {
50 auto f = [](auto t) {
51 return hana::metafunction<mf>(t);
52 };
53
54 BOOST_HANA_CONSTANT_CHECK(hana::equal(
55 hana::transform(hana::experimental::types<x<0>>{}, f),
56 hana::experimental::types<mf<x<0>>::type>{}
57 ));
58
59 BOOST_HANA_CONSTANT_CHECK(hana::equal(
60 hana::transform(hana::experimental::types<x<0>, x<1>>{}, f),
61 hana::experimental::types<mf<x<0>>::type, mf<x<1>>::type>{}
62 ));
63
64 BOOST_HANA_CONSTANT_CHECK(hana::equal(
65 hana::transform(hana::experimental::types<x<0>, x<1>, x<2>>{}, f),
66 hana::experimental::types<mf<x<0>>::type, mf<x<1>>::type, mf<x<2>>::type>{}
67 ));
68
69 BOOST_HANA_CONSTANT_CHECK(hana::equal(
70 hana::transform(hana::experimental::types<x<0>, x<1>, x<2>, x<3>>{}, f),
71 hana::experimental::types<mf<x<0>>::type, mf<x<1>>::type, mf<x<2>>::type, mf<x<3>>::type>{}
72 ));
73 }
74}
75

source code of boost/libs/hana/test/experimental/types/transform.cpp