55#include <gtest/gtest.h>
77 static_assert(std::movable<Iter>,
"Iterator must be movable");
78 static_assert(std::copyable<Iter>,
"Iterator must be copyable");
79 static_assert(std::default_initializable<Iter>,
"Iterator must be default initializable");
80 static_assert(std::weakly_incrementable<Iter>,
"Iterator must be weakly incrementable");
83 static_assert(
requires(
const Iter it) { *it; },
84 "Must be able to dereference const iterator");
87 static_assert(std::same_as<std::iter_reference_t<Iter>,
88 std::iter_reference_t<const Iter>>,
89 "iter_reference_t<I> must equal iter_reference_t<const I>");
92 static_assert(std::indirectly_readable<Iter>,
93 "Iterator must satisfy indirectly_readable");
96 static_assert(std::input_iterator<Iter>,
97 "Iterator must satisfy input_iterator");
100 static_assert(std::forward_iterator<Iter>,
101 "Iterator must satisfy forward_iterator");
110 static_assert(std::indirectly_readable<Iter>,
111 "Const iterator must satisfy indirectly_readable");
112 static_assert(std::input_iterator<Iter>,
113 "Const iterator must satisfy input_iterator");
114 static_assert(std::forward_iterator<Iter>,
115 "Const iterator must satisfy forward_iterator");
124 static_assert(std::same_as<std::iter_reference_t<Iter>,
125 std::iter_reference_t<const Iter>>,
126 "iter_reference_t<I> must equal iter_reference_t<const I>");
127 static_assert(std::indirectly_readable<Iter>,
128 "Iterator must satisfy indirectly_readable");
129 static_assert(std::input_iterator<Iter>,
130 "Iterator must satisfy input_iterator");
138 using Iter = Set::iterator;
140 static_assert(std::same_as<std::iter_reference_t<Iter>,
141 std::iter_reference_t<const Iter>>,
142 "iter_reference_t<I> must equal iter_reference_t<const I>");
143 static_assert(std::indirectly_readable<Iter>,
144 "Iterator must satisfy indirectly_readable");
145 static_assert(std::input_iterator<Iter>,
146 "Iterator must satisfy input_iterator");
157 static_assert(std::ranges::range<DynDlist<int>>,
158 "DynDlist must satisfy std::ranges::range");
159 static_assert(std::ranges::input_range<DynDlist<int>>,
160 "DynDlist must satisfy std::ranges::input_range");
161 static_assert(std::ranges::forward_range<DynDlist<int>>,
162 "DynDlist must satisfy std::ranges::forward_range");
169 static_assert(std::ranges::range<const DynDlist<int>>,
170 "const DynDlist must satisfy std::ranges::range");
171 static_assert(std::ranges::input_range<const DynDlist<int>>,
172 "const DynDlist must satisfy std::ranges::input_range");
186 void SetUp()
override
198 EXPECT_TRUE(std::ranges::all_of(list, [](
int x) {
return x > 0; }));
199 EXPECT_FALSE(std::ranges::all_of(list, [](
int x) {
return x > 3; }));
204 EXPECT_TRUE(std::ranges::any_of(list, [](
int x) {
return x == 3; }));
205 EXPECT_FALSE(std::ranges::any_of(list, [](
int x) {
return x == 10; }));
210 EXPECT_TRUE(std::ranges::none_of(list, [](
int x) {
return x < 0; }));
211 EXPECT_FALSE(std::ranges::none_of(list, [](
int x) {
return x == 3; }));
216 auto it = std::ranges::find(list, 3);
220 auto not_found = std::ranges::find(list, 10);
226 auto it = std::ranges::find_if(list, [](
int x) {
return x % 2 == 0; });
234 auto count = std::ranges::count(list, 3);
240 auto count = std::ranges::count_if(list, [](
int x) {
return x % 2 == 0; });
246 auto it = std::ranges::min_element(list);
253 auto it = std::ranges::max_element(list);
261 std::ranges::for_each(list, [&sum](
int x) {
sum += x; });
268 std::ranges::for_each(list, [&sum](
int x) {
sum += x; },
269 [](
int x) {
return x * 2; });
309 auto evens = list | std::views::filter([](
int x) {
return x % 2 == 0; });
311 std::vector<int> result;
322 auto doubled = list | std::views::transform([](
int x) {
return x * 2; });
324 std::vector<int> result;
340 std::vector<int> result;
354 | std::views::filter([](
int x) {
return x % 2 == 0; })
355 | std::views::transform([](
int x) {
return x * 2; });
357 std::vector<int> result;
377 EXPECT_TRUE(std::ranges::all_of(arr, [](
int x) {
return x >= 10; }));
379 auto it = std::ranges::find(arr, 20);
383 auto max_it = std::ranges::max_element(arr);
401 EXPECT_TRUE(std::ranges::all_of(set, [](
int x) {
return x > 0; }));
404 auto it = std::ranges::find(set, 5);
409 auto count = std::ranges::count_if(set, [](
int x) {
return x > 5; });
413 auto min_it = std::ranges::min_element(set);
422 GTEST_SKIP() <<
"std::ranges not fully supported on this platform";
433 testing::InitGoogleTest(&
argc,
argv);
TEST_F(StaticArenaFixture, simple_fail)
C++20 Ranges support and adaptors for Aleph-w containers.
T & append()
Allocate a new entry to the end of array.
Dynamic doubly linked list with O(1) size and bidirectional access.
T & append(const T &item)
Append a copied item at the end of the list.
T & append(const T &item)
Append a new item by copy.
Dynamic set backed by balanced binary search trees with automatic memory management.
Key * insert(const Key &key)
Inserts a key into the dynamic set.
iterator end() noexcept
Return an STL-compatible end iterator.
Main namespace for Aleph-w library functions.
DynList< T > maps(const C &c, Op op)
Classic map operation.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
T sum(const Container &container, const T &init=T{})
Compute sum of all elements.
Lazy and scalable dynamic array implementation.
Dynamic doubly linked list implementation.
Dynamic set implementations based on balanced binary search trees.