/* @copyright Louis Dionne 2015 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 using namespace boost::hana; int main() { ////////////////////////////////////////////////////////////////////////////// // Models ////////////////////////////////////////////////////////////////////////////// { //! [Searchable] BOOST_HANA_CONSTEXPR_CHECK( find_if(make(1.0, 2, '3'), trait) == just(2) ); BOOST_HANA_CONSTANT_CHECK( find_if(make(1.0, 2, '3'), trait) == nothing ); BOOST_HANA_CONSTANT_CHECK( find(make(int_<1>, char_<'c'>, type), type) == just(type) ); BOOST_HANA_CONSTANT_CHECK( find(make(int_<1>, char_<'c'>, type), type) == nothing ); //! [Searchable] } ////////////////////////////////////////////////////////////////////////////// // Methods ////////////////////////////////////////////////////////////////////////////// { //! [at] BOOST_HANA_CONSTEXPR_CHECK(at(make_tuple(0, '1', 2.0), int_<0>) == 0); BOOST_HANA_CONSTEXPR_CHECK(at(make_tuple(0, '1', 2.0), int_<1>) == '1'); BOOST_HANA_CONSTEXPR_CHECK(at(make_tuple(0, '1', 2.0), int_<2>) == 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); // drop (equivalent to drop.at_most) static_assert(drop(xs, int_<0>) == xs, ""); static_assert(drop(xs, int_<1>) == make_tuple('1', 2.0), ""); static_assert(drop(xs, int_<2>) == make_tuple(2.0), ""); BOOST_HANA_CONSTANT_CHECK(drop(xs, int_<3>) == make_tuple()); BOOST_HANA_CONSTANT_CHECK(drop(xs, int_<4>) == make_tuple()); BOOST_HANA_CONSTANT_CHECK(drop.at_most(xs, int_<4>) == make_tuple()); // drop.exactly static_assert(drop.exactly(xs, int_<2>) == make_tuple(2.0), ""); BOOST_HANA_CONSTANT_CHECK(drop.exactly(xs, int_<3>) == make_tuple()); //! [drop] }{ //! [drop_c] static_assert(drop_c<2>(make_tuple(0, '1', 2.0)) == make_tuple(2.0), ""); //! [drop_c] }{ //! [drop_until] using namespace boost::hana::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(1_c, -2_c, 4_c, 5_c), positive) == make(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(1_c, -2_c, 4_c, 5_c), negative) == make(1_c, -2_c, 4_c, 5_c) ); //! [drop_while] }{ //! [head] BOOST_HANA_CONSTEXPR_CHECK(head(make(1, '2', 3.3, nullptr)) == 1); //! [head] }{ //! [is_empty] BOOST_HANA_CONSTANT_CHECK(!is_empty(make(1, '2'))); BOOST_HANA_CONSTANT_CHECK( is_empty(make())); //! [is_empty] }{ //! [last] BOOST_HANA_CONSTEXPR_CHECK(last(make(1, '2', 3.3, nullptr)) == nullptr); //! [last] }{ //! [tail] BOOST_HANA_CONSTEXPR_CHECK( tail(make(1, '2', 3.3, nullptr)) == make('2', 3.3, nullptr) ); //! [tail] } }