2
0
mirror of https://github.com/boostorg/hana.git synced 2026-01-31 20:22:10 +00:00
Files
hana/example/iterable.cpp
2015-02-22 16:50:01 -05:00

127 lines
3.0 KiB
C++

/*
@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 <boost/hana/assert.hpp>
#include <boost/hana/detail/constexpr.hpp>
#include <boost/hana/ext/std/integral_constant.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/maybe.hpp>
#include <boost/hana/range.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/type.hpp>
#include <sstream>
#include <type_traits>
using namespace boost::hana;
int main() {
{
//! [head]
BOOST_HANA_CONSTEXPR_CHECK(head(make<Tuple>(1, '2', 3.3, nullptr)) == 1);
//! [head]
}{
//! [at]
BOOST_HANA_CONSTEXPR_CHECK(at(int_<0>, make<Tuple>(0, '1', 2.0)) == 0);
BOOST_HANA_CONSTEXPR_CHECK(at(int_<1>, make<Tuple>(0, '1', 2.0)) == '1');
BOOST_HANA_CONSTEXPR_CHECK(at(int_<2>, make<Tuple>(0, '1', 2.0)) == 2.0);
//! [at]
}{
//! [at_c]
BOOST_HANA_CONSTEXPR_CHECK(at_c<0>(make<Tuple>(0, '1', 2.0)) == 0);
BOOST_HANA_CONSTEXPR_CHECK(at_c<1>(make<Tuple>(0, '1', 2.0)) == '1');
BOOST_HANA_CONSTEXPR_CHECK(at_c<2>(make<Tuple>(0, '1', 2.0)) == 2.0);
//! [at_c]
}{
//! [drop]
constexpr auto xs = make<Tuple>(0, '1', 2.0);
BOOST_HANA_CONSTEXPR_CHECK(drop(int_<0>, xs) == xs);
BOOST_HANA_CONSTEXPR_CHECK(drop(int_<1>, xs) == make<Tuple>('1', 2.0));
BOOST_HANA_CONSTEXPR_CHECK(drop(int_<2>, xs) == make<Tuple>(2.0));
BOOST_HANA_CONSTANT_CHECK(drop(int_<3>, xs) == make<Tuple>());
BOOST_HANA_CONSTANT_CHECK(drop(int_<4>, xs) == make<Tuple>());
//! [drop]
}{
//! [drop_c]
BOOST_HANA_CONSTEXPR_CHECK(drop_c<2>(make<Tuple>(0, '1', 2.0)) == make<Tuple>(2.0));
//! [drop_c]
}{
//! [drop_until]
using namespace literals;
BOOST_HANA_CONSTEXPR_LAMBDA auto positive = [](auto x) {
return x > int_<0>;
};
BOOST_HANA_CONSTANT_CHECK(
drop_until(range(int_<-3>, int_<6>), positive) == range(int_<1>, int_<6>)
);
BOOST_HANA_CONSTANT_CHECK(
drop_until(make<Tuple>(1_c, -2_c, 4_c, 5_c), positive) == make<Tuple>(1_c, -2_c, 4_c, 5_c)
);
//! [drop_until]
}{
//! [drop_while]
using namespace literals;
BOOST_HANA_CONSTEXPR_LAMBDA auto negative = [](auto x) {
return x < int_<0>;
};
BOOST_HANA_CONSTANT_CHECK(
drop_while(range(int_<-3>, int_<6>), negative) == range(int_<0>, int_<6>)
);
BOOST_HANA_CONSTANT_CHECK(
drop_while(make<Tuple>(1_c, -2_c, 4_c, 5_c), negative) == make<Tuple>(1_c, -2_c, 4_c, 5_c)
);
//! [drop_while]
}{
//! [is_empty]
BOOST_HANA_CONSTANT_CHECK(!is_empty(make<Tuple>(1, '2')));
BOOST_HANA_CONSTANT_CHECK( is_empty(make<Tuple>()));
//! [is_empty]
}{
//! [last]
BOOST_HANA_CONSTEXPR_CHECK(last(make<Tuple>(1, '2', 3.3, nullptr)) == nullptr);
//! [last]
}{
//! [tail]
BOOST_HANA_CONSTEXPR_CHECK(
tail(make<Tuple>(1, '2', 3.3, nullptr)) == make<Tuple>('2', 3.3, nullptr)
);
//! [tail]
}{
//! [find]
BOOST_HANA_CONSTEXPR_CHECK(find(make<Tuple>(1.0, 2, '3'), trait_<std::is_integral>) == just(2));
BOOST_HANA_CONSTANT_CHECK(find(make<Tuple>(1.0, 2, '3'), trait_<std::is_class>) == nothing);
//! [find]
}
}