diff --git a/example/tuple.cpp b/example/tuple.cpp new file mode 100644 index 000000000..64a41acca --- /dev/null +++ b/example/tuple.cpp @@ -0,0 +1,79 @@ +/* +@copyright Louis Dionne 2014 +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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +using namespace boost::hana; + + +int main() { + +{ + +//! [tuple_t] +BOOST_HANA_CONSTANT_CHECK( + to(tuple_t) + == + tuple(type, type, type, type) +); +//! [tuple_t] + +}{ + +//! [tuple_c] +BOOST_HANA_CONSTANT_CHECK( + to(tuple_c) + == + tuple(int_<0>, int_<1>, int_<2>) +); +BOOST_HANA_CONSTANT_CHECK(head(tuple_c) == int_<0>); +//! [tuple_c] + +}{ + +//! [Foldable] +using namespace literals; + +constexpr auto numbers = tuple_c; +constexpr auto negatives = tuple_c; + +BOOST_HANA_CONSTEXPR_LAMBDA auto keep_negatives = [](auto n, auto acc) { + return if_(n < 0_c, prepend(n, acc), acc); +}; + +BOOST_HANA_CONSTANT_CHECK(foldr(numbers, tuple_c, keep_negatives) == negatives); +//! [Foldable] + +}{ + +//! [Tuple_interop] +BOOST_HANA_CONSTEXPR_CHECK( + to(std::make_tuple(1, '2', 3.3)) == tuple(1, '2', 3.3) +); + +BOOST_HANA_CONSTANT_CHECK( + to(range(int_<1>, int_<4>)) == tuple(int_<1>, int_<2>, int_<3>) +); + +BOOST_HANA_CONSTEXPR_CHECK( + to(std::array{{1, 2, 3}}) == tuple(1, 2, 3) +); +//! [Tuple_interop] + +} + +} \ No newline at end of file diff --git a/test/tuple.cpp b/test/tuple.cpp index 82ce6864b..efa1c79ae 100644 --- a/test/tuple.cpp +++ b/test/tuple.cpp @@ -40,12 +40,13 @@ namespace boost { namespace hana { namespace test { ); }}} +struct x0; struct x1; struct x2; struct x3; int main() { test::check_datatype(); using test::x; - // move-only friendlyness and reference semantics + // move-only friendliness and reference semantics { struct movable { movable() = default; @@ -84,12 +85,28 @@ int main() { } } + // Comparable + { + // equal + { + BOOST_HANA_CONSTANT_CHECK(equal(tuple_t<>, tuple_t<>)); + BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t, tuple_t<>))); + BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t<>, tuple_t))); + BOOST_HANA_CONSTANT_CHECK(equal(tuple_t, tuple_t)); + BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t, tuple_t))); + BOOST_HANA_CONSTANT_CHECK(not_(equal(tuple_t, tuple_t))); + BOOST_HANA_CONSTANT_CHECK(equal(tuple_t, tuple_t)); + BOOST_HANA_CONSTANT_CHECK(equal(tuple_t, tuple_t)); + } + } + // Foldable { // unpack { auto f = test::injection([]{}); + // tuple BOOST_HANA_CONSTANT_CHECK(equal( unpack(tuple(), f), f() @@ -106,17 +123,149 @@ int main() { unpack(tuple(x<0>, x<1>, x<2>), f), f(x<0>, x<1>, x<2>) )); + + // tuple_t + BOOST_HANA_CONSTANT_CHECK(equal( + unpack(tuple_t<>, f), + f() + )); + BOOST_HANA_CONSTANT_CHECK(equal( + unpack(tuple_t, f), + f(type) + )); + BOOST_HANA_CONSTANT_CHECK(equal( + unpack(tuple_t, f), + f(type, type) + )); + BOOST_HANA_CONSTANT_CHECK(equal( + unpack(tuple_t, f), + f(type, type, type) + )); + BOOST_HANA_CONSTANT_CHECK(equal( + unpack(tuple_t, f), + f(type, type, type, type) + )); } } // Iterable { + /////////////////// + // tuple_t + ////////////////// + // head + { + BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_t), type)); + BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_t), type)); + BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_t), type)); + } + + // is_empty + { + BOOST_HANA_CONSTANT_CHECK(is_empty(tuple_t<>)); + BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_t))); + BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_t))); + } + + // tail + { + BOOST_HANA_CONSTANT_CHECK(equal(tail(tuple_t), tuple_t<>)); + BOOST_HANA_CONSTANT_CHECK(equal(tail(tuple_t), tuple_t)); + BOOST_HANA_CONSTANT_CHECK(equal(tail(tuple_t), tuple_t)); + } + + ////////////////// + // tuple_c + ///////////////// + + // head + { + BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_c), int_<0>)); + BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_c), int_<0>)); + BOOST_HANA_CONSTANT_CHECK(equal(head(tuple_c), int_<0>)); + } + + // is_empty + { + BOOST_HANA_CONSTANT_CHECK(is_empty(tuple_c)); + BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_c))); + BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_c))); + BOOST_HANA_CONSTANT_CHECK(not_(is_empty(tuple_c))); + } + + // tail + { + BOOST_HANA_CONSTANT_CHECK(equal( + tail(tuple_c), + tuple_c + )); + + BOOST_HANA_CONSTANT_CHECK(equal( + tail(tuple_c), + tuple_c + )); + + BOOST_HANA_CONSTANT_CHECK(equal( + tail(tuple_c), + tuple_c + )); + } + // operators { BOOST_HANA_CONSTANT_CHECK(equal( tuple(x<0>, x<1>)[size_t<0>], x<0> )); + + BOOST_HANA_CONSTANT_CHECK(equal( + tuple_t[size_t<0>], + type + )); + + BOOST_HANA_CONSTANT_CHECK(equal( + tuple_t[size_t<1>], + type + )); + } + } + + // MonadPlus + { + // prepend + { + BOOST_HANA_CONSTANT_CHECK(equal( + prepend(long_<0>, tuple_c), + tuple_c + )); + BOOST_HANA_CONSTANT_CHECK(equal( + prepend(uint<0>, tuple_c), + tuple_c + )); + BOOST_HANA_CONSTANT_CHECK(equal( + prepend(llong<0>, tuple_c), + tuple_c + )); + BOOST_HANA_CONSTANT_CHECK(equal( + prepend(ulong<0>, tuple_c), + tuple_c + )); + } + + // nil + { + BOOST_HANA_CONSTANT_CHECK(equal( + nil(), + tuple_c + )); + BOOST_HANA_CONSTANT_CHECK(equal( + nil(), + tuple_c + )); + BOOST_HANA_CONSTANT_CHECK(equal( + nil(), + tuple_c + )); } } }