/// \file // Range v3 library // // Copyright Eric Niebler 2013-2014. // Copyright Casey Carter 2017. // // Use, modification and distribution is subject to the // Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Project home: https://github.com/ericniebler/range-v3 // #include #include #include #include #include #include "../simple_test.hpp" #include "../test_utils.hpp" using namespace ranges; int main() { { int count = 0; std::vector v{1,2,3}; auto rng = v | views::transform([&count](int i){ ++count; return i;}) | views::cache1; using Rng = decltype(rng); CPP_assert(!range); CPP_assert(input_range); CPP_assert(!forward_range); CPP_assert(common_range); CPP_assert(view_); CPP_assert(sized_range); CPP_assert(sized_sentinel_for, iterator_t>); CPP_assert(same_as, int>); CPP_assert(same_as, int &&>); CPP_assert(same_as, int &&>); CHECK(count == 0); auto it = ranges::begin(rng); CHECK(count == 0); auto last = ranges::end(rng); CHECK(it != last); CHECK(count == 0); CHECK(*it == 1); CHECK(count == 1); CHECK(*it == 1); CHECK(count == 1); ++it; CHECK(it != last); CHECK(count == 1); CHECK(*it == 2); CHECK(count == 2); CHECK(*it == 2); CHECK(count == 2); ++it; CHECK(it != last); CHECK(count == 2); CHECK(*it == 3); CHECK(count == 3); CHECK(*it == 3); CHECK(count == 3); ++it; CHECK(count == 3); CHECK(it == last); } { int count = 0; char const * hi = "hi"; auto rng = views::c_str(hi) | views::transform([&count](char ch){ ++count; return ch;}) | views::cache1; using Rng = decltype(rng); CPP_assert(!range); CPP_assert(input_range); CPP_assert(!forward_range); CPP_assert(!common_range); CPP_assert(view_); CPP_assert(!sized_range); CPP_assert(!sized_sentinel_for, iterator_t>); CPP_assert(same_as, char>); CPP_assert(same_as, char &&>); CPP_assert(same_as, char &&>); CHECK(count == 0); auto it = ranges::begin(rng); CHECK(count == 0); auto last = ranges::end(rng); CHECK(it != last); CHECK(count == 0); CHECK(*it == 'h'); CHECK(count == 1); CHECK(*it == 'h'); CHECK(count == 1); ++it; CHECK(it != last); CHECK(count == 1); CHECK(*it == 'i'); CHECK(count == 2); CHECK(*it == 'i'); CHECK(count == 2); ++it; CHECK(count == 2); CHECK(it == last); } { int count = 0; MoveOnlyString rg[] = {"hello", "world"}; auto rng = rg | views::move | views::transform([&count](auto s){ ++count; RANGES_ENSURE(s != ""); return s;}) | views::cache1; using Rng = decltype(rng); CPP_assert(!range); CPP_assert(input_range); CPP_assert(!forward_range); CPP_assert(common_range); CPP_assert(view_); CPP_assert(sized_range); CPP_assert(sized_sentinel_for, iterator_t>); CPP_assert(same_as, MoveOnlyString>); CPP_assert(same_as, MoveOnlyString &&>); CPP_assert(same_as, MoveOnlyString &&>); CHECK(count == 0); auto it = ranges::begin(rng); CHECK(count == 0); auto last = ranges::end(rng); CHECK(it != last); CHECK(count == 0); CHECK((*it == "hello")); CHECK(count == 1); CHECK((*it == "hello")); CHECK(count == 1); ++it; CHECK(it != last); CHECK(count == 1); CHECK((*it == "world")); CHECK(count == 2); CHECK((*it == "world")); CHECK(count == 2); ++it; CHECK(count == 2); CHECK(it == last); } return test_result(); }