Skip to content

Commit d7c8d7b

Browse files
Added type_traits tests
1 parent 14a5bca commit d7c8d7b

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

include/beman/any_view/detail/iterator.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#ifndef BEMAN_ANY_VIEW_DETAIL_ITERATOR_HPP
44
#define BEMAN_ANY_VIEW_DETAIL_ITERATOR_HPP
55

6+
#include <beman/any_view/detail/type_traits.hpp>
7+
68
#include <compare>
79
#include <type_traits>
810
#include <iterator>
@@ -52,6 +54,9 @@ class iterator {
5254
auto operator==(std::default_sentinel_t) const -> bool;
5355
};
5456

57+
template <class IterConceptT, class ElementT, class RefT, class RValueRefT, class DiffT>
58+
auto iter_move(const iterator<IterConceptT, ElementT, RefT, RValueRefT, DiffT>&) -> RValueRefT;
59+
5560
} // namespace beman::any_view::detail
5661

5762
#endif // BEMAN_ANY_VIEW_DETAIL_ITERATOR_HPP

tests/beman/any_view/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ function(beman_add_test)
1010
endfunction()
1111

1212
beman_add_test(TARGET concepts SOURCES concepts.test.cpp)
13+
beman_add_test(TARGET type_traits SOURCES type_traits.test.cpp)
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2+
3+
#include <beman/any_view/any_view.hpp>
4+
5+
#include <gtest/gtest.h>
6+
7+
#include <utility>
8+
9+
using beman::any_view::any_view;
10+
using value = std::pair<int, float>;
11+
using lvalue = std::pair<int&, float&>;
12+
using rvalue = std::pair<int&&, float&&>;
13+
14+
TEST(TypeTraitsTest, value_type) {
15+
using std::ranges::range_value_t;
16+
17+
static_assert(std::same_as<range_value_t<any_view<value>>, value>);
18+
static_assert(std::same_as<range_value_t<any_view<const value>>, value>);
19+
}
20+
21+
TEST(TypeTraitsTest, reference_type) {
22+
using std::ranges::range_reference_t;
23+
24+
static_assert(std::same_as<range_reference_t<any_view<value>>, value&>);
25+
static_assert(std::same_as<range_reference_t<any_view<const value>>, const value&>);
26+
27+
#if BEMAN_ANY_VIEW_USE_FLAGS()
28+
using enum beman::any_view::any_view_options;
29+
30+
static_assert(std::same_as<range_reference_t<any_view<value, input, value>>, value>);
31+
static_assert(std::same_as<range_reference_t<any_view<value, input, lvalue>>, lvalue>);
32+
#elif BEMAN_ANY_VIEW_USE_TRAITS()
33+
struct value_traits {
34+
using reference_type = value;
35+
};
36+
37+
struct lvalue_traits {
38+
using reference_type = lvalue;
39+
};
40+
41+
static_assert(std::same_as<range_reference_t<any_view<value, value_traits>>, value>);
42+
static_assert(std::same_as<range_reference_t<any_view<value, lvalue_traits>>, lvalue>);
43+
#elif BEMAN_ANY_VIEW_USE_NAMED()
44+
using beman::any_view::type;
45+
46+
static_assert(std::same_as<range_reference_t<any_view<value, {.reference_type = type<value>}>>, value>);
47+
static_assert(std::same_as<range_reference_t<any_view<lvalue, {.reference_type = type<lvalue>}>>, lvalue>);
48+
#endif
49+
}
50+
51+
TEST(TypeTraitsTest, rvalue_reference_type) {
52+
using std::ranges::range_rvalue_reference_t;
53+
54+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value>>, value&&>);
55+
static_assert(std::same_as<range_rvalue_reference_t<any_view<const value>>, const value&&>);
56+
57+
#if BEMAN_ANY_VIEW_USE_FLAGS()
58+
using enum beman::any_view::any_view_options;
59+
60+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, input, value>>, value>);
61+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, input, lvalue>>, lvalue>);
62+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, input, lvalue, rvalue>>, rvalue>);
63+
#elif BEMAN_ANY_VIEW_USE_TRAITS()
64+
struct value_traits {
65+
using reference_type = value;
66+
};
67+
68+
struct lvalue_traits {
69+
using reference_type = lvalue;
70+
};
71+
72+
struct rvalue_traits {
73+
using rvalue_reference_type = rvalue;
74+
};
75+
76+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, value_traits>>, value>);
77+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, lvalue_traits>>, lvalue>);
78+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, rvalue_traits>>, rvalue>);
79+
#elif BEMAN_ANY_VIEW_USE_NAMED()
80+
using beman::any_view::type;
81+
82+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, {.reference_type = type<value>}>>, value>);
83+
static_assert(std::same_as<range_rvalue_reference_t<any_view<value, {.reference_type = type<lvalue>}>>, lvalue>);
84+
static_assert(
85+
std::same_as<range_rvalue_reference_t<
86+
any_view<value, {.reference_type = type<lvalue>, .rvalue_reference_type = type<rvalue>}>>,
87+
rvalue>);
88+
#endif
89+
}
90+
91+
TEST(TypeTraitsTest, difference_type) {
92+
using std::ranges::range_difference_t;
93+
94+
static_assert(std::same_as<range_difference_t<any_view<value>>, std::ptrdiff_t>);
95+
96+
#if BEMAN_ANY_VIEW_USE_FLAGS()
97+
using enum beman::any_view::any_view_options;
98+
99+
static_assert(std::same_as<range_difference_t<any_view<value, input, lvalue, rvalue, short>>, short>);
100+
#elif BEMAN_ANY_VIEW_USE_TRAITS()
101+
struct difference_traits {
102+
using difference_type = short;
103+
};
104+
105+
static_assert(std::same_as<range_difference_t<any_view<value, difference_traits>>, short>);
106+
#elif BEMAN_ANY_VIEW_USE_NAMED()
107+
using beman::any_view::type;
108+
109+
static_assert(
110+
std::same_as<
111+
range_difference_t<any_view<value, {.reference_type = type<lvalue>, .difference_type = type<short>}>>,
112+
short>);
113+
#endif
114+
}
115+
116+
struct sized_traits {
117+
static constexpr bool sized = true;
118+
};
119+
120+
TEST(TypeTraitsTest, size_type) {
121+
using std::ranges::range_size_t;
122+
123+
#if BEMAN_ANY_VIEW_USE_FLAGS()
124+
using enum beman::any_view::any_view_options;
125+
126+
static_assert(std::same_as<range_size_t<any_view<value, input | sized>>, std::size_t>);
127+
static_assert(std::same_as<range_size_t<any_view<value, input | sized, lvalue, rvalue, short>>, unsigned short>);
128+
#elif BEMAN_ANY_VIEW_USE_TRAITS()
129+
struct difference_traits : sized_traits {
130+
using difference_type = short;
131+
};
132+
133+
static_assert(std::same_as<range_size_t<any_view<value, sized_traits>>, std::size_t>);
134+
static_assert(std::same_as<range_size_t<any_view<value, difference_traits>>, unsigned short>);
135+
#elif BEMAN_ANY_VIEW_USE_NAMED()
136+
using beman::any_view::type;
137+
138+
static_assert(
139+
std::same_as<range_size_t<any_view<value, {.reference_type = type<lvalue>, .sized = true}>>, std::size_t>);
140+
static_assert(
141+
std::same_as<
142+
range_size_t<
143+
any_view<value, {.reference_type = type<lvalue>, .sized = true, .difference_type = type<short>}>>,
144+
unsigned short>);
145+
#endif
146+
}
147+
148+
struct borrowed_traits {
149+
static constexpr bool borrowed = true;
150+
};
151+
152+
TEST(TypeTraitsTest, borrowed_iterator_type) {
153+
using std::ranges::borrowed_iterator_t;
154+
using std::ranges::iterator_t;
155+
156+
static_assert(std::same_as<borrowed_iterator_t<any_view<value>>, std::ranges::dangling>);
157+
158+
#if BEMAN_ANY_VIEW_USE_FLAGS()
159+
using enum beman::any_view::any_view_options;
160+
161+
static_assert(std::same_as<borrowed_iterator_t<any_view<value, input | borrowed>>,
162+
iterator_t<any_view<value, input | borrowed>>>);
163+
#elif BEMAN_ANY_VIEW_USE_TRAITS()
164+
static_assert(std::same_as<borrowed_iterator_t<any_view<value, borrowed_traits>>,
165+
iterator_t<any_view<value, borrowed_traits>>>);
166+
#elif BEMAN_ANY_VIEW_USE_NAMED()
167+
using beman::any_view::type;
168+
169+
static_assert(
170+
std::same_as<borrowed_iterator_t<any_view<value, {.reference_type = type<lvalue>, .borrowed = true}>>,
171+
iterator_t<any_view<value, {.reference_type = type<lvalue>, .borrowed = true}>>>);
172+
#endif
173+
}

0 commit comments

Comments
 (0)