123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- // 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_AUTO_ZIPS_HPP
- #define BOOST_HANA_TEST_AUTO_ZIPS_HPP
- #include <boost/hana/assert.hpp>
- #include <boost/hana/equal.hpp>
- #include <boost/hana/zip.hpp>
- #include <boost/hana/zip_shortest.hpp>
- #include <boost/hana/zip_shortest_with.hpp>
- #include <boost/hana/zip_with.hpp>
- #include <laws/base.hpp>
- #include "test_case.hpp"
- TestCase test_zip_shortest_with{[]{
- namespace hana = boost::hana;
- using hana::test::ct_eq;
- hana::test::_injection<0> f{};
- auto zip = hana::zip_shortest_with;
- struct undefined { };
- // zip 1
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<0>{})),
- MAKE_TUPLE(f(ct_eq<0>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
- MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
- MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}), f(ct_eq<2>{}))
- ));
- // zip 2
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(undefined{})),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<-1>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}), MAKE_TUPLE(ct_eq<-1>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}), MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}), f(ct_eq<2>{}, ct_eq<-2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
- MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{}, ct_eq<-3>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}),
- f(ct_eq<2>{}, ct_eq<-2>{}),
- f(ct_eq<3>{}, ct_eq<-3>{}))
- ));
- // zip 3
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(undefined{}), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(), MAKE_TUPLE(undefined{})),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(undefined{}), MAKE_TUPLE(undefined{})),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE(), MAKE_TUPLE(undefined{})),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(undefined{}, MAKE_TUPLE(undefined{}), MAKE_TUPLE(undefined{}), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f, MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{})),
- MAKE_TUPLE(f(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
- ));
- // zip 4
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f,
- MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}, ct_eq<14>{}),
- MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}),
- MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}, ct_eq<34>{}),
- MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{}, ct_eq<44>{}, ct_eq<45>{})
- ),
- MAKE_TUPLE(
- f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}),
- f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}),
- f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{})
- )
- ));
- // zip 5
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- zip(f,
- MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}, ct_eq<14>{}),
- MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}, ct_eq<24>{}, ct_eq<25>{}),
- MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}, ct_eq<34>{}),
- MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{}, ct_eq<44>{}, ct_eq<45>{}, ct_eq<46>{}),
- MAKE_TUPLE(ct_eq<51>{}, ct_eq<52>{}, ct_eq<53>{}, ct_eq<54>{}, ct_eq<55>{})
- ),
- MAKE_TUPLE(
- f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}, ct_eq<51>{}),
- f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}, ct_eq<52>{}),
- f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{}, ct_eq<53>{}),
- f(ct_eq<14>{}, ct_eq<24>{}, ct_eq<34>{}, ct_eq<44>{}, ct_eq<54>{})
- )
- ));
- }};
- TestCase test_zip_with{[]{
- namespace hana = boost::hana;
- using hana::test::ct_eq;
- hana::test::_injection<0> f{};
- struct undefined { };
- // zip 1
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(undefined{}, MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{})),
- MAKE_TUPLE(f(ct_eq<0>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
- MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
- MAKE_TUPLE(f(ct_eq<0>{}), f(ct_eq<1>{}), f(ct_eq<2>{}))
- ));
- // zip 2
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(undefined{}, MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f, MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<-1>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f, MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}), MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{})),
- MAKE_TUPLE(f(ct_eq<1>{}, ct_eq<-1>{}), f(ct_eq<2>{}, ct_eq<-2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f,
- MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
- MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{}, ct_eq<-3>{})),
- MAKE_TUPLE(
- f(ct_eq<1>{}, ct_eq<-1>{}),
- f(ct_eq<2>{}, ct_eq<-2>{}),
- f(ct_eq<3>{}, ct_eq<-3>{}))
- ));
- // zip 3
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(undefined{}, MAKE_TUPLE(), MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f, MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{})),
- MAKE_TUPLE(f(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f,
- MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
- MAKE_TUPLE(ct_eq<2>{}, ct_eq<3>{}),
- MAKE_TUPLE(ct_eq<4>{}, ct_eq<5>{})
- ),
- MAKE_TUPLE(
- f(ct_eq<0>{}, ct_eq<2>{}, ct_eq<4>{}),
- f(ct_eq<1>{}, ct_eq<3>{}, ct_eq<5>{})
- )
- ));
- // zip 4
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f,
- MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}),
- MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}),
- MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}),
- MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{})
- ),
- MAKE_TUPLE(
- f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}),
- f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}),
- f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{})
- )
- ));
- // zip 5
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_with(f,
- MAKE_TUPLE(ct_eq<11>{}, ct_eq<12>{}, ct_eq<13>{}, ct_eq<14>{}),
- MAKE_TUPLE(ct_eq<21>{}, ct_eq<22>{}, ct_eq<23>{}, ct_eq<24>{}),
- MAKE_TUPLE(ct_eq<31>{}, ct_eq<32>{}, ct_eq<33>{}, ct_eq<34>{}),
- MAKE_TUPLE(ct_eq<41>{}, ct_eq<42>{}, ct_eq<43>{}, ct_eq<44>{}),
- MAKE_TUPLE(ct_eq<51>{}, ct_eq<52>{}, ct_eq<53>{}, ct_eq<54>{})
- ),
- MAKE_TUPLE(
- f(ct_eq<11>{}, ct_eq<21>{}, ct_eq<31>{}, ct_eq<41>{}, ct_eq<51>{}),
- f(ct_eq<12>{}, ct_eq<22>{}, ct_eq<32>{}, ct_eq<42>{}, ct_eq<52>{}),
- f(ct_eq<13>{}, ct_eq<23>{}, ct_eq<33>{}, ct_eq<43>{}, ct_eq<53>{}),
- f(ct_eq<14>{}, ct_eq<24>{}, ct_eq<34>{}, ct_eq<44>{}, ct_eq<54>{})
- )
- ));
- }};
- TestCase test_zip{[]{
- namespace hana = boost::hana;
- using hana::test::ct_eq;
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(ct_eq<0>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip(MAKE_TUPLE(ct_eq<0>{}, ct_eq<3>{}),
- MAKE_TUPLE(ct_eq<1>{}, ct_eq<4>{}),
- MAKE_TUPLE(ct_eq<2>{}, ct_eq<5>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
- MAKE_TUPLE(ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}))
- ));
- }};
- TestCase test_zip_shortest{[]{
- namespace hana = boost::hana;
- using hana::test::ct_eq;
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{}), MAKE_TUPLE(ct_eq<2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(), MAKE_TUPLE()),
- MAKE_TUPLE()
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}), MAKE_TUPLE(ct_eq<1>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}),
- MAKE_TUPLE(ct_eq<1>{}),
- MAKE_TUPLE(ct_eq<2>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))
- ));
- BOOST_HANA_CONSTANT_CHECK(hana::equal(
- hana::zip_shortest(MAKE_TUPLE(ct_eq<0>{}, ct_eq<3>{}),
- MAKE_TUPLE(ct_eq<1>{}, ct_eq<4>{}),
- MAKE_TUPLE(ct_eq<2>{}, ct_eq<5>{}, ct_eq<8>{})),
- MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
- MAKE_TUPLE(ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}))
- ));
- }};
- #endif // !BOOST_HANA_TEST_AUTO_ZIPS_HPP
|