123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- // Copyright Louis Dionne 2013-2017
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
- #include <boost/hana/adjust_if.hpp>
- #include <boost/hana/all_of.hpp>
- #include <boost/hana/any_of.hpp>
- #include <boost/hana/assert.hpp>
- #include <boost/hana/count_if.hpp>
- #include <boost/hana/drop_while.hpp>
- #include <boost/hana/equal.hpp>
- #include <boost/hana/ext/std/tuple.hpp>
- #include <boost/hana/filter.hpp>
- #include <boost/hana/find_if.hpp>
- #include <boost/hana/functional/id.hpp>
- #include <boost/hana/functional/partial.hpp>
- #include <boost/hana/group.hpp>
- #include <boost/hana/integral_constant.hpp>
- #include <boost/hana/lexicographical_compare.hpp>
- #include <boost/hana/maximum.hpp>
- #include <boost/hana/minimum.hpp>
- #include <boost/hana/none_of.hpp>
- #include <boost/hana/optional.hpp>
- #include <boost/hana/partition.hpp>
- #include <boost/hana/plus.hpp>
- #include <boost/hana/remove_if.hpp>
- #include <boost/hana/replace_if.hpp>
- #include <boost/hana/sort.hpp>
- #include <boost/hana/span.hpp>
- #include <boost/hana/take_while.hpp>
- #include <boost/hana/tuple.hpp>
- #include <boost/hana/unique.hpp>
- #include <boost/hana/while.hpp>
- namespace hana = boost::hana;
- constexpr auto increment = hana::partial(hana::plus, hana::int_c<1>);
- int main() {
- // adjust_if
- {
- constexpr auto x = hana::adjust_if(hana::make_tuple(hana::int_c<0>), hana::id, increment);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<0>)));
- constexpr auto y = hana::adjust_if(hana::make_tuple(hana::int_c<1>), hana::id, increment);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple(hana::int_c<2>)));
- constexpr auto z = hana::adjust_if(hana::make_tuple(hana::int_c<3>), hana::id, increment);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<4>)));
- constexpr auto l = hana::adjust_if(hana::tuple_c<int, 3>, hana::id, increment);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(l, hana::make_tuple(hana::int_c<4>)));
- }
- {
- // test with lvalue
- constexpr auto x = hana::adjust_if(hana::tuple_c<int, 3>, hana::id, increment);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<4>)));
- }
- // all_of
- {
- BOOST_HANA_CONSTANT_CHECK(!hana::all_of(hana::make_tuple(hana::int_c<0>), hana::id));
- BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::make_tuple(hana::int_c<1>), hana::id));
- BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::make_tuple(hana::int_c<3>), hana::id));
- // test with lvalue
- BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::tuple_c<int, 3>, hana::id));
- }
- // any_of
- {
- BOOST_HANA_CONSTANT_CHECK(!hana::any_of(hana::make_tuple(hana::int_c<0>), hana::id));
- BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::make_tuple(hana::int_c<1>), hana::id));
- BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::make_tuple(hana::int_c<3>), hana::id));
- // test with lvalue
- BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::tuple_c<int, 3>, hana::id));
- }
- // count_if
- {
- constexpr auto x = hana::count_if(hana::make_tuple(hana::int_c<0>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::size_c<0>));
- constexpr auto y = hana::count_if(hana::make_tuple(hana::int_c<1>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::size_c<1>));
- constexpr auto z = hana::count_if(hana::make_tuple(hana::int_c<3>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::size_c<1>));
- }
- {
- // test with lvalue
- constexpr auto x = hana::count_if(hana::tuple_c<int, 3>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::size_c<1>));
- }
- // drop_while
- {
- constexpr auto x = hana::drop_while(
- hana::make_tuple(hana::int_c<0>), hana::id
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
- hana::make_tuple(hana::int_c<0>)
- )
- );
- constexpr auto y = hana::drop_while(
- hana::make_tuple(hana::int_c<1>, hana::int_c<3>, hana::int_c<0>), hana::id
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y,
- hana::make_tuple(hana::int_c<0>)
- )
- );
- }
- {
- // test with lvalue
- constexpr auto x = hana::drop_while(
- hana::tuple_c<int, 1, 3, 0>, hana::id
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
- hana::make_tuple(hana::int_c<0>)
- )
- );
- }
- // filter
- {
- constexpr auto x = hana::filter(hana::make_tuple(hana::int_c<0>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple()));
- constexpr auto y = hana::filter(hana::make_tuple(hana::int_c<1>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple(hana::int_c<1>)));
- constexpr auto z = hana::filter(hana::make_tuple(hana::int_c<3>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<3>)));
- }
- {
- // test with lvalue
- constexpr auto x = hana::filter(hana::tuple_c<int, 3>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<3>)));
- }
- // find_if
- {
- constexpr auto x = hana::find_if(hana::make_tuple(hana::int_c<0>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::nothing));
- constexpr auto y = hana::find_if(hana::make_tuple(hana::int_c<1>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::just(hana::int_c<1>)));
- constexpr auto z = hana::find_if(hana::make_tuple(hana::int_c<3>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::just(hana::int_c<3>)));
- }
- {
- // test with lvalue
- constexpr auto z = hana::find_if(hana::tuple_c<int, 3>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::just(hana::int_c<3>)));
- }
- {
- // test with std::tuple (for default implementation of find_if)
- constexpr auto x = hana::find_if(std::make_tuple(hana::int_c<0>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::nothing));
- constexpr auto y = hana::find_if(std::make_tuple(hana::int_c<1>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::just(hana::int_c<1>)));
- constexpr auto z = hana::find_if(std::make_tuple(hana::int_c<3>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::just(hana::int_c<3>)));
- }
- {
- // test with lvalue
- constexpr auto seq = std::make_tuple(hana::int_c<3>);
- constexpr auto x = hana::find_if(seq, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::just(hana::int_c<3>)));
- }
- // group
- {
- constexpr auto x = hana::group(
- hana::make_tuple(
- hana::int_c<0>,
- hana::int_c<0>,
- hana::int_c<1>,
- hana::int_c<1>,
- hana::int_c<2>
- ),
- hana::plus
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
- hana::make_tuple(
- hana::tuple_c<int, 0>,
- hana::tuple_c<int, 0, 1, 1, 2>
- )
- )
- );
- }
- {
- // test with lvalue
- constexpr auto x = hana::group(hana::tuple_c<int, 0, 0, 1, 1, 2>, hana::plus);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
- hana::make_tuple(
- hana::tuple_c<int, 0>,
- hana::tuple_c<int, 0, 1, 1, 2>
- )
- )
- );
- }
- // lexicographical_compare
- {
- BOOST_HANA_CONSTANT_CHECK(
- hana::lexicographical_compare(
- hana::make_tuple(hana::int_c<0>, hana::int_c<0>),
- hana::make_tuple(hana::int_c<0>, hana::int_c<3>),
- hana::plus
- )
- );
- }
- {
- // test with lvalue
- BOOST_HANA_CONSTANT_CHECK(
- hana::lexicographical_compare(
- hana::tuple_c<int, 0, 0>,
- hana::tuple_c<int, 0, 3>,
- hana::plus
- )
- );
- }
- // maximum
- {
- constexpr auto x = hana::maximum(
- hana::make_tuple(
- hana::int_c<0>,
- hana::int_c<0>,
- hana::int_c<1>,
- hana::int_c<3>,
- hana::int_c<2>
- ),
- hana::plus
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<2>));
- }
- {
- // test with lvalue
- constexpr auto x = hana::maximum(hana::tuple_c<int, 0, 0, 1, 3, 2>, hana::plus);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<2>));
- }
- // minimum
- {
- constexpr auto x = hana::minimum(
- hana::make_tuple(
- hana::int_c<0>,
- hana::int_c<0>,
- hana::int_c<1>,
- hana::int_c<3>,
- hana::int_c<2>
- ),
- hana::plus
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<0>));
- }
- {
- // test with lvalue
- constexpr auto x = hana::minimum(hana::tuple_c<int, 0, 0, 1, 3, 2>, hana::plus);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<0>));
- }
- // none_of
- {
- BOOST_HANA_CONSTANT_CHECK(hana::none_of(hana::make_tuple(hana::int_c<0>), hana::id));
- BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::make_tuple(hana::int_c<1>), hana::id));
- BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::make_tuple(hana::int_c<3>), hana::id));
- }
- {
- // test with lvalue
- BOOST_HANA_CONSTANT_CHECK(hana::none_of(hana::tuple_c<int, 0>, hana::id));
- BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::tuple_c<int, 1>, hana::id));
- BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::tuple_c<int, 3>, hana::id));
- }
- // partition
- {
- constexpr auto x = hana::partition(
- hana::make_tuple(
- hana::int_c<0>,
- hana::int_c<1>,
- hana::int_c<3>
- ),
- hana::id
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
- hana::make_pair(
- hana::tuple_c<int, 1, 3>,
- hana::tuple_c<int, 0>
- )
- )
- );
- }
- {
- // test with lvalue
- constexpr auto x = hana::partition(hana::tuple_c<int, 0, 1, 3>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x,
- hana::make_pair(
- hana::tuple_c<int, 1, 3>,
- hana::tuple_c<int, 0>
- )
- )
- );
- }
- // remove_if
- {
- constexpr auto x = hana::remove_if(hana::make_tuple(hana::int_c<0>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<0>)));
- constexpr auto y = hana::remove_if(hana::make_tuple(hana::int_c<1>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple()));
- constexpr auto z = hana::remove_if(hana::make_tuple(hana::int_c<3>), hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple()));
- }
- {
- // test with lvalue
- constexpr auto z = hana::remove_if(hana::tuple_c<int, 3>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple()));
- }
- // replace_if
- {
- constexpr auto x = hana::replace_if(
- hana::make_tuple(hana::int_c<0>),
- hana::id,
- hana::int_c<42>
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::make_tuple(hana::int_c<0>)));
- constexpr auto y = hana::replace_if(
- hana::make_tuple(hana::int_c<1>),
- hana::id,
- hana::int_c<42>
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(y, hana::make_tuple(hana::int_c<42>)));
- constexpr auto z = hana::replace_if(
- hana::make_tuple(hana::int_c<3>),
- hana::id,
- hana::int_c<42>
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<42>)));
- }
- {
- // test with lvalue
- constexpr auto z = hana::replace_if(
- hana::tuple_c<int, 3>,
- hana::id,
- hana::int_c<42>
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(z, hana::make_tuple(hana::int_c<42>)));
- }
- // sort
- {
- constexpr auto x = hana::sort(
- hana::make_tuple(
- hana::int_c<0>,
- hana::int_c<1>,
- hana::int_c<2>
- ),
- hana::plus);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1, 0>));
- }
- {
- // test with lvalue
- constexpr auto x = hana::sort(hana::tuple_c<int, 0, 1, 2>, hana::plus);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1, 0>));
- }
- // span
- {
- constexpr auto x = hana::span(
- hana::make_tuple(
- hana::int_c<2>,
- hana::int_c<1>,
- hana::int_c<0>
- ),
- hana::id
- );
- BOOST_HANA_CONSTANT_CHECK(
- hana::equal(x,
- hana::make_pair(
- hana::tuple_c<int, 2, 1>,
- hana::tuple_c<int, 0>
- )
- )
- );
- }
- {
- // test with an lvalue
- constexpr auto x = hana::span(hana::tuple_c<int, 2, 1, 0>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(
- hana::equal(x,
- hana::make_pair(
- hana::tuple_c<int, 2, 1>,
- hana::tuple_c<int, 0>
- )
- )
- );
- }
- // take_while
- {
- constexpr auto x = hana::take_while(
- hana::make_tuple(
- hana::int_c<2>,
- hana::int_c<1>,
- hana::int_c<0>
- ),
- hana::id
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1>));
- }
- {
- // test with lvalue
- constexpr auto x = hana::take_while(hana::tuple_c<int, 2, 1, 0>, hana::id);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 2, 1>));
- }
- // unique
- {
- constexpr auto x = hana::unique(
- hana::make_tuple(
- hana::int_c<0>,
- hana::int_c<0>,
- hana::int_c<1>,
- hana::int_c<2>
- ),
- hana::plus
- );
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 0, 0>));
- }
- {
- // test with lvalue
- constexpr auto x = hana::unique(hana::tuple_c<int, 0, 0, 1, 2>, hana::plus);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::tuple_c<int, 0, 0>));
- }
- // while
- {
- constexpr auto x = hana::while_(hana::id, hana::int_c<-3>, increment);
- BOOST_HANA_CONSTANT_CHECK(hana::equal(x, hana::int_c<0>));
- }
- }
|