123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104 |
- // 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)
- #ifndef BOOST_HANA_TEST_LAWS_FOLDABLE_HPP
- #define BOOST_HANA_TEST_LAWS_FOLDABLE_HPP
- #include <boost/hana/assert.hpp>
- #include <boost/hana/chain.hpp>
- #include <boost/hana/concept/comparable.hpp>
- #include <boost/hana/concept/foldable.hpp>
- #include <boost/hana/concept/product.hpp>
- #include <boost/hana/concept/sequence.hpp>
- #include <boost/hana/config.hpp>
- #include <boost/hana/core/make.hpp>
- #include <boost/hana/core/when.hpp>
- #include <boost/hana/count.hpp>
- #include <boost/hana/count_if.hpp>
- #include <boost/hana/equal.hpp>
- #include <boost/hana/first.hpp>
- #include <boost/hana/fold.hpp>
- #include <boost/hana/fold_left.hpp>
- #include <boost/hana/fold_right.hpp>
- #include <boost/hana/for_each.hpp>
- #include <boost/hana/functional/capture.hpp>
- #include <boost/hana/functional/curry.hpp>
- #include <boost/hana/functional/demux.hpp>
- #include <boost/hana/functional/flip.hpp>
- #include <boost/hana/integral_constant.hpp>
- #include <boost/hana/lazy.hpp>
- #include <boost/hana/length.hpp>
- #include <boost/hana/lift.hpp>
- #include <boost/hana/maximum.hpp>
- #include <boost/hana/minimum.hpp>
- #include <boost/hana/monadic_fold_left.hpp>
- #include <boost/hana/monadic_fold_right.hpp>
- #include <boost/hana/not_equal.hpp>
- #include <boost/hana/product.hpp>
- #include <boost/hana/reverse_fold.hpp>
- #include <boost/hana/second.hpp>
- #include <boost/hana/size.hpp>
- #include <boost/hana/sum.hpp>
- #include <boost/hana/unpack.hpp>
- #include <boost/hana/value.hpp>
- #include <laws/base.hpp>
- #include <support/identity.hpp>
- #include <vector>
- namespace boost { namespace hana { namespace test {
- template <typename F, typename = when<true>>
- struct TestFoldable : TestFoldable<F, laws> {
- using TestFoldable<F, laws>::TestFoldable;
- };
- template <typename F>
- struct TestFoldable<F, laws> {
- template <typename Foldables>
- TestFoldable(Foldables foldables) {
- hana::for_each(foldables, [](auto xs) {
- static_assert(Foldable<decltype(xs)>{}, "");
- _injection<0> f{};
- ct_eq<999> s{};
- // equivalence of size(xs) and length(xs)
- BOOST_HANA_CHECK(hana::equal(
- hana::length(xs),
- hana::size(xs)
- ));
- // equivalence of fold with fold_left and
- // of reverse_fold with fold_right
- BOOST_HANA_CHECK(hana::equal(
- hana::fold(xs, s, f),
- hana::fold_left(xs, s, f)
- ));
- BOOST_HANA_CHECK(hana::equal(
- hana::reverse_fold(xs, s, f),
- hana::fold_right(xs, s, hana::flip(f))
- ));
- only_when_(hana::not_equal(hana::length(xs), hana::size_c<0>),
- hana::make_lazy([](auto f, auto xs) {
- BOOST_HANA_CHECK(hana::equal(
- hana::fold(xs, f),
- hana::fold_left(xs, f)
- ));
- BOOST_HANA_CHECK(hana::equal(
- hana::reverse_fold(xs, f),
- hana::fold_right(xs, hana::flip(f))
- ));
- })(f, xs));
- // equivalence of count(xs, val) and count_if(xs, equal.to(val))
- struct not_there { };
- BOOST_HANA_CHECK(hana::equal(
- hana::count(xs, not_there{}),
- hana::count_if(xs, equal.to(not_there{}))
- ));
- hana::for_each(xs, hana::capture(xs)([](auto xs, auto value) {
- BOOST_HANA_CHECK(hana::equal(
- hana::count(xs, value),
- hana::count_if(xs, equal.to(value))
- ));
- }));
- });
- }
- };
- template <typename P>
- struct TestFoldable<P, when<Product<P>::value>>
- : TestFoldable<P, laws>
- {
- template <typename Products>
- TestFoldable(Products products) : TestFoldable<P, laws>{products} {
- hana::for_each(products, [](auto p) {
- _injection<0> f{};
- BOOST_HANA_CHECK(hana::equal(
- hana::unpack(p, f),
- f(hana::first(p), hana::second(p))
- ));
- });
- }
- };
- template <typename S>
- struct TestFoldable<S, when<Sequence<S>::value>>
- : TestFoldable<S, laws>
- {
- template <int i>
- using x = _constant<i>;
- template <int i>
- using ord = _constant<i>;
- struct undefined { };
- template <typename Xs>
- TestFoldable(Xs xs) : TestFoldable<S, laws>{xs} {
- _injection<0> f{};
- auto z = x<999>{};
- constexpr auto list = make<S>;
- //////////////////////////////////////////////////////////////////
- // fold_left (with initial state)
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(), z, undefined{}),
- z
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(x<1>{}), z, f),
- f(z, x<1>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(x<1>{}, x<2>{}), z, f),
- f(f(z, x<1>{}), x<2>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(x<1>{}, x<2>{}, x<3>{}), z, f),
- f(f(f(z, x<1>{}), x<2>{}), x<3>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), z, f),
- f(f(f(f(z, x<1>{}), x<2>{}), x<3>{}), x<4>{})
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_left(list(1), z, f),
- f(z, 1)
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_left(list(1, '2'), z, f),
- f(f(z, 1), '2')
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_left(list(1, '2', 3.3), z, f),
- f(f(f(z, 1), '2'), 3.3)
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_left(list(1, '2', 3.3, 4.4f), z, f),
- f(f(f(f(z, 1), '2'), 3.3), 4.4f)
- ));
- //////////////////////////////////////////////////////////////////
- // fold_left (without initial state)
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(z), undefined{}),
- z
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(z, x<2>{}), f),
- f(z, x<2>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(z, x<2>{}, x<3>{}), f),
- f(f(z, x<2>{}), x<3>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_left(list(z, x<2>{}, x<3>{}, x<4>{}), f),
- f(f(f(z, x<2>{}), x<3>{}), x<4>{})
- ));
- //////////////////////////////////////////////////////////////////
- // fold_right (with initial state)
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(), z, undefined{}),
- z
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<0>{}), z, f),
- f(x<0>{}, z)
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<0>{}, x<1>{}), z, f),
- f(x<0>{}, f(x<1>{}, z))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<0>{}, x<1>{}, x<2>{}), z, f),
- f(x<0>{}, f(x<1>{}, f(x<2>{}, z)))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<0>{}, x<1>{}, x<2>{}, x<3>{}), z, f),
- f(x<0>{}, f(x<1>{}, f(x<2>{}, f(x<3>{}, z))))
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_right(list(1), z, f),
- f(1, z)
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_right(list(1, '2'), z, f),
- f(1, f('2', z))
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_right(list(1, '2', 3.3), z, f),
- f(1, f('2', f(3.3, z)))
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- fold_right(list(1, '2', 3.3, 4.4f), z, f),
- f(1, f('2', f(3.3, f(4.4f, z))))
- ));
- //////////////////////////////////////////////////////////////////
- // fold_right (without initial state)
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(z), undefined{}),
- z
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<1>{}, z), f),
- f(x<1>{}, z)
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<1>{}, x<2>{}, z), f),
- f(x<1>{}, f(x<2>{}, z))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- fold_right(list(x<1>{}, x<2>{}, x<3>{}, z), f),
- f(x<1>{}, f(x<2>{}, f(x<3>{}, z)))
- ));
- //////////////////////////////////////////////////////////////////
- // monadic_fold_left (with initial state)
- //////////////////////////////////////////////////////////////////
- {
- using M = ::Identity;
- auto f = hana::demux(::identity)(test::_injection<0>{});
- auto s = x<999>{};
- auto fp = hana::curry<2>(hana::flip(f));
- constexpr auto mfold = monadic_fold_left<M>;
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(), s, undefined{}),
- lift<M>(s)
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}), s, f),
- f(s, x<1>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}), s, f),
- chain(f(s, x<1>{}), fp(x<2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}), s, f),
- chain(chain(f(s, x<1>{}), fp(x<2>{})), fp(x<3>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), s, f),
- chain(chain(chain(f(s, x<1>{}), fp(x<2>{})), fp(x<3>{})), fp(x<4>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), s, f),
- chain(chain(chain(chain(f(s, x<1>{}), fp(x<2>{})), fp(x<3>{})), fp(x<4>{})), fp(x<5>{}))
- ));
- }
- //////////////////////////////////////////////////////////////////
- // monadic_fold_left (without initial state)
- //////////////////////////////////////////////////////////////////
- {
- using M = ::Identity;
- auto f = hana::demux(::identity)(test::_injection<0>{});
- auto fp = hana::curry<2>(hana::flip(f));
- constexpr auto mfold = monadic_fold_left<M>;
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}), undefined{}),
- lift<M>(x<1>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}), f),
- f(x<1>{}, x<2>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}), f),
- chain(f(x<1>{}, x<2>{}), fp(x<3>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), f),
- chain(chain(f(x<1>{}, x<2>{}), fp(x<3>{})), fp(x<4>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), f),
- chain(chain(chain(f(x<1>{}, x<2>{}), fp(x<3>{})), fp(x<4>{})), fp(x<5>{}))
- ));
- }
- //////////////////////////////////////////////////////////////////
- // monadic_fold_right (with initial state)
- //////////////////////////////////////////////////////////////////
- {
- using M = ::Identity;
- auto f = hana::demux(::identity)(test::_injection<0>{});
- auto s = x<999>{};
- auto fp = hana::curry<2>(f);
- // flipping `chain` makes the right associativity easier to see
- auto chain = hana::flip(hana::chain);
- constexpr auto mfold = monadic_fold_right<M>;
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(), s, undefined{}),
- lift<M>(s)
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}), s, f),
- f(x<1>{}, s)
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}), s, f),
- chain(fp(x<1>{}), f(x<2>{}, s))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}), s, f),
- chain(fp(x<1>{}), chain(fp(x<2>{}), f(x<3>{}, s)))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), s, f),
- chain(fp(x<1>{}), chain(fp(x<2>{}), chain(fp(x<3>{}), f(x<4>{}, s))))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), s, f),
- chain(fp(x<1>{}), chain(fp(x<2>{}), chain(fp(x<3>{}), chain(fp(x<4>{}), f(x<5>{}, s)))))
- ));
- }
- //////////////////////////////////////////////////////////////////
- // monadic_fold_right (without initial state)
- //////////////////////////////////////////////////////////////////
- {
- using M = ::Identity;
- auto f = hana::demux(::identity)(test::_injection<0>{});
- auto fp = hana::curry<2>(f);
- // flipping `chain` makes the right associativity easier to see
- auto chain = hana::flip(hana::chain);
- constexpr auto mfold = monadic_fold_right<M>;
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}), undefined{}),
- lift<M>(x<1>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}), f),
- f(x<1>{}, x<2>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}), f),
- chain(fp(x<1>{}), f(x<2>{}, x<3>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}), f),
- chain(fp(x<1>{}), chain(fp(x<2>{}), f(x<3>{}, x<4>{})))
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- mfold(list(x<1>{}, x<2>{}, x<3>{}, x<4>{}, x<5>{}), f),
- chain(fp(x<1>{}), chain(fp(x<2>{}), chain(fp(x<3>{}), f(x<4>{}, x<5>{}))))
- ));
- }
- //////////////////////////////////////////////////////////////////
- // length
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- length(list()), size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- length(list(undefined{})), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- length(list(undefined{}, undefined{})), size_c<2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- length(list(undefined{}, undefined{}, undefined{})), size_c<3>
- ));
- int i = 0; // non-constexpr
- BOOST_HANA_CONSTANT_CHECK(equal(
- length(list(i, i)),
- size_c<2>
- ));
- //////////////////////////////////////////////////////////////////
- // maximum (without a custom predicate)
- //////////////////////////////////////////////////////////////////
- {
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<0>{})),
- ord<0>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<0>{}, ord<1>{})),
- ord<1>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<1>{}, ord<0>{})),
- ord<1>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<0>{}, ord<1>{}, ord<2>{})),
- ord<2>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<1>{}, ord<0>{}, ord<2>{})),
- ord<2>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<1>{}, ord<2>{}, ord<0>{})),
- ord<2>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<2>{}, ord<1>{}, ord<0>{})),
- ord<2>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<2>{}, ord<0>{}, ord<1>{})),
- ord<2>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<0>{}, ord<1>{}, ord<2>{}, ord<3>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<1>{}, ord<0>{}, ord<2>{}, ord<3>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<1>{}, ord<2>{}, ord<0>{}, ord<3>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<1>{}, ord<2>{}, ord<3>{}, ord<0>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<2>{}, ord<1>{}, ord<3>{}, ord<0>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<2>{}, ord<3>{}, ord<1>{}, ord<0>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<2>{}, ord<3>{}, ord<0>{}, ord<1>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<3>{}, ord<2>{}, ord<0>{}, ord<1>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<3>{}, ord<0>{}, ord<2>{}, ord<1>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<3>{}, ord<0>{}, ord<1>{}, ord<2>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<0>{}, ord<2>{}, ord<3>{}, ord<1>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- maximum(list(ord<0>{}, ord<3>{}, ord<1>{}, ord<2>{})),
- ord<3>{}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0})),
- int{0}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, long{1})),
- long{1}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{1}, long{0})),
- int{1}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, 1ll, long{2})),
- long{2}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{1}, 0ll, long{2})),
- long{2}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{1}, 2ll, long{0})),
- 2ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{2}, 1ll, long{0})),
- int{2}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{2}, 0ll, long{1})),
- int{2}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, 1ll, long{2}, short{3})),
- short{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{1}, 0ll, long{2}, short{3})),
- short{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{1}, 2ll, long{0}, short{3})),
- short{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{1}, 2ll, long{3}, short{0})),
- long{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{2}, 1ll, long{3}, short{0})),
- long{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{2}, 3ll, long{1}, short{0})),
- 3ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{2}, 3ll, long{0}, short{1})),
- 3ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{3}, 2ll, long{0}, short{1})),
- int{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{3}, 0ll, long{2}, short{1})),
- int{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{3}, 0ll, long{1}, short{2})),
- int{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, 2ll, long{3}, short{1})),
- long{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, 3ll, long{1}, short{2})),
- 3ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, 1ll, long_c<2>)),
- long{2}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- maximum(list(int{0}, long_c<1>, 2ll)),
- 2ll
- ));
- }
- //////////////////////////////////////////////////////////////////
- // minimum (without a custom predicate)
- //////////////////////////////////////////////////////////////////
- {
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<6>{}, ord<7>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<7>{}, ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<6>{}, ord<7>{}, ord<8>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<7>{}, ord<6>{}, ord<8>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<7>{}, ord<8>{}, ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<8>{}, ord<7>{}, ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<8>{}, ord<6>{}, ord<7>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<6>{}, ord<7>{}, ord<8>{}, ord<9>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<7>{}, ord<6>{}, ord<8>{}, ord<9>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<7>{}, ord<8>{}, ord<6>{}, ord<9>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<7>{}, ord<8>{}, ord<9>{}, ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<8>{}, ord<7>{}, ord<9>{}, ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<8>{}, ord<9>{}, ord<7>{}, ord<6>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<8>{}, ord<9>{}, ord<6>{}, ord<7>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<9>{}, ord<8>{}, ord<6>{}, ord<7>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<9>{}, ord<6>{}, ord<8>{}, ord<7>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<9>{}, ord<6>{}, ord<7>{}, ord<8>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<6>{}, ord<8>{}, ord<9>{}, ord<7>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- minimum(list(ord<6>{}, ord<9>{}, ord<7>{}, ord<8>{})),
- ord<6>{}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{4})),
- int{4}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{4}, short{5})),
- int{4}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{5}, short{4})),
- short{4}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{4}, short{5}, long{6})),
- int{4}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{7}, short{6}, long{8})),
- short{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{7}, short{8}, long{6})),
- long{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{8}, short{7}, long{6})),
- long{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{8}, short{6}, long{7})),
- short{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{6}, short{7}, long{8}, 9ll)),
- int{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{7}, short{6}, long{8}, 9ll)),
- short{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{7}, short{8}, long{6}, 9ll)),
- long{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{7}, short{8}, long{9}, 6ll)),
- 6ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{8}, short{7}, long{9}, 6ll)),
- 6ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{8}, short{9}, long{7}, 6ll)),
- 6ll
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{8}, short{9}, long{6}, 7ll)),
- long{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{9}, short{8}, long{6}, 7ll)),
- long{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{9}, short{6}, long{8}, 7ll)),
- short{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{9}, short{6}, long{7}, 8ll)),
- short{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{6}, short{8}, long{9}, 7ll)),
- int{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{6}, short{9}, long{7}, 8ll)),
- int{6}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(int{3}, short{4}, long_c<5>)),
- int{3}
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- minimum(list(ord<33>{}, short{45}, long{46})),
- ord<33>{}
- ));
- }
- //////////////////////////////////////////////////////////////////
- // count_if
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(), id), size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>), id), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>), id), size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>, char_c<1>), id), size_c<2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>, char_c<0>), id), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>, char_c<1>), id), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>, char_c<0>), id), size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>, char_c<1>, long_c<1>), id), size_c<3>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>, char_c<1>, long_c<0>), id), size_c<2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>, char_c<0>, long_c<1>), id), size_c<2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<1>, char_c<0>, long_c<0>), id), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>, char_c<1>, long_c<1>), id), size_c<2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>, char_c<1>, long_c<0>), id), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>, char_c<0>, long_c<1>), id), size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- count_if(list(int_c<0>, char_c<0>, long_c<0>), id), size_c<0>
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}), id), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}), id), 0u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}, char{1}), id), 2u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}, char{0}), id), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}, char{1}), id), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}, char{0}), id), 0u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}, char{1}, double{1}), id), 3u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}, char{1}, double{0}), id), 2u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}, char{0}, double{1}), id), 2u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{1}, char{0}, double{0}), id), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}, char{1}, double{1}), id), 2u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}, char{1}, double{0}), id), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}, char{0}, double{1}), id), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(int{0}, char{0}, double{0}), id), 0u
- ));
- BOOST_HANA_CONSTEXPR_LAMBDA auto is_even = [](auto x) {
- return x % 2 == 0;
- };
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(), is_even), 0u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(1), is_even), 0u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(2), is_even), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(1, 2), is_even), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(1, 2, 3), is_even), 1u
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- count_if(list(1, 2, 3, 4), is_even), 2u
- ));
- //////////////////////////////////////////////////////////////////
- // count
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(), undefined{}),
- size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(ct_eq<0>{}), undefined{}),
- size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(ct_eq<0>{}), ct_eq<0>{}),
- size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(ct_eq<0>{}, ct_eq<1>{}), undefined{}),
- size_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(ct_eq<0>{}, ct_eq<1>{}), ct_eq<0>{}),
- size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(ct_eq<0>{}, ct_eq<1>{}), ct_eq<1>{}),
- size_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::count(list(ct_eq<0>{}, ct_eq<0>{}), ct_eq<0>{}),
- size_c<2>
- ));
- //////////////////////////////////////////////////////////////////
- // product
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<int>>(list()),
- int_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<int>>(list(int_c<2>)),
- int_c<2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<int>>(list(int_c<2>, int_c<3>)),
- int_c<2 * 3>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<int>>(list(int_c<2>, int_c<3>, int_c<4>)),
- int_c<2 * 3 * 4>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<int>>(list(int_c<2>, int_c<3>, int_c<4>, int_c<5>)),
- int_c<2 * 3 * 4 * 5>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<unsigned long>>(list()),
- ulong_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- product<integral_constant_tag<unsigned long>>(list(ulong_c<2>, ulong_c<3>, ulong_c<4>)),
- ulong_c<2 * 3 * 4>
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- product<int>(list(2)),
- 2
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- product<int>(list(2, 3)),
- 2 * 3
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- product<int>(list(2, 3, 4)),
- 2 * 3 * 4
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- product<int>(list(2, 3, 4, 5)),
- 2 * 3 * 4 * 5
- ));
- //////////////////////////////////////////////////////////////////
- // sum
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<int>>(list()),
- int_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<int>>(list(int_c<1>)),
- int_c<1>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<int>>(list(int_c<1>, int_c<2>)),
- int_c<1 + 2>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<int>>(list(int_c<1>, int_c<2>, int_c<3>)),
- int_c<1 + 2 + 3>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<int>>(list(int_c<1>, int_c<2>, int_c<3>, int_c<4>)),
- int_c<1 + 2 + 3 + 4>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<unsigned long>>(list()),
- ulong_c<0>
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- sum<integral_constant_tag<unsigned long>>(list(ulong_c<1>, ulong_c<2>, ulong_c<3>)),
- ulong_c<1 + 2 + 3>
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- sum<int>(list(1)), 1
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- sum<int>(list(1, 2)), 1 + 2
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- sum<int>(list(1, 2, 3)), 1 + 2 + 3
- ));
- BOOST_HANA_CONSTEXPR_CHECK(equal(
- sum<int>(list(1, 2, 3, 4)), 1 + 2 + 3 + 4
- ));
- //////////////////////////////////////////////////////////////////
- // unpack
- //////////////////////////////////////////////////////////////////
- BOOST_HANA_CONSTANT_CHECK(equal(
- unpack(list(), f),
- f()
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- unpack(list(x<0>{}), f),
- f(x<0>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- unpack(list(x<0>{}, x<1>{}), f),
- f(x<0>{}, x<1>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- unpack(list(x<0>{}, x<1>{}, x<2>{}), f),
- f(x<0>{}, x<1>{}, x<2>{})
- ));
- BOOST_HANA_CONSTANT_CHECK(equal(
- unpack(list(x<0>{}, x<1>{}, x<2>{}, x<3>{}), f),
- f(x<0>{}, x<1>{}, x<2>{}, x<3>{})
- ));
- }
- };
- }}} // end namespace boost::hana::test
- #endif // !BOOST_HANA_TEST_LAWS_FOLDABLE_HPP
|