Medial Code Documentation
Loading...
Searching...
No Matches
test_span.h
1
4#ifndef XGBOOST_TEST_SPAN_H_
5#define XGBOOST_TEST_SPAN_H_
6
7#include <xgboost/base.h>
8#include <xgboost/span.h>
9
10template <typename Iter>
11XGBOOST_DEVICE void InitializeRange(Iter _begin, Iter _end) {
12 float j = 0;
13 for (Iter i = _begin; i != _end; ++i, ++j) {
14 *i = j;
15 }
16}
17
18namespace xgboost {
19namespace common {
20
21#define SPAN_ASSERT_TRUE(cond, status) \
22 if (!(cond)) { \
23 *(status) = -1; \
24 }
25
26#define SPAN_ASSERT_FALSE(cond, status) \
27 if ((cond)) { \
28 *(status) = -1; \
29 }
30
32 int * status_;
33
34 TestTestStatus(int* _status): status_(_status) {}
35
36 XGBOOST_DEVICE void operator()() {
37 this->operator()(0);
38 }
39 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
40 SPAN_ASSERT_TRUE(false, status_);
41 }
42};
43
45 int* status_;
46
47 TestAssignment(int* _status) : status_(_status) {}
48
49 XGBOOST_DEVICE void operator()() {
50 this->operator()(0);
51 }
52 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
53 Span<float> s1;
54
55 float arr[] = {3, 4, 5};
56
57 Span<const float> s2 = arr;
58 SPAN_ASSERT_TRUE(s2.size() == 3, status_);
59 SPAN_ASSERT_TRUE(s2.data() == &arr[0], status_);
60
61 s2 = s1;
62 SPAN_ASSERT_TRUE(s2.empty(), status_);
63 }
64};
65
67 int* status_;
68
69 TestBeginEnd(int* _status) : status_(_status) {}
70
71 XGBOOST_DEVICE void operator()() {
72 this->operator()(0);
73 }
74 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
75 float arr[16];
76 InitializeRange(arr, arr + 16);
77
78 Span<float> s (arr);
79 Span<float>::iterator beg { s.begin() };
80 Span<float>::iterator end { s.end() };
81
82 SPAN_ASSERT_TRUE(end == beg + 16, status_);
83 SPAN_ASSERT_TRUE(*beg == arr[0], status_);
84 SPAN_ASSERT_TRUE(*(end - 1) == arr[15], status_);
85 }
86};
87
89 int * status_;
90
91 TestRBeginREnd(int* _status): status_(_status) {}
92
93 XGBOOST_DEVICE void operator()() {
94 this->operator()(0);
95 }
96 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
97 float arr[16];
98 InitializeRange(arr, arr + 16);
99
100 Span<float> s (arr);
101
102#if defined(__CUDA_ARCH__)
103 auto rbeg = dh::trbegin(s);
104 auto rend = dh::trend(s);
105#else
106 Span<float>::reverse_iterator rbeg{s.rbegin()};
107 Span<float>::reverse_iterator rend{s.rend()};
108#endif
109
110 SPAN_ASSERT_TRUE(rbeg + 16 == rend, status_);
111 SPAN_ASSERT_TRUE(*(rbeg) == arr[15], status_);
112 SPAN_ASSERT_TRUE(*(rend - 1) == arr[0], status_);
113 }
114};
115
117 int * status_;
118
119 TestObservers(int * _status): status_(_status) {}
120
121 XGBOOST_DEVICE void operator()() {
122 this->operator()(0);
123 }
124 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
125 // empty
126 {
127 float *arr = nullptr;
128 Span<float> s(arr, static_cast<Span<float>::index_type>(0));
129 SPAN_ASSERT_TRUE(s.empty(), status_);
130 }
131
132 // size, size_types
133 {
134 float* arr = new float[16];
135 Span<float> s (arr, 16);
136 SPAN_ASSERT_TRUE(s.size() == 16, status_);
137 SPAN_ASSERT_TRUE(s.size_bytes() == 16 * sizeof(float), status_);
138 delete [] arr;
139 }
140 }
141};
142
144 int * status_;
145
146 TestCompare(int * _status): status_(_status) {}
147
148 XGBOOST_DEVICE void operator()() {
149 this->operator()(0);
150 }
151 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
152 float lhs_arr[16], rhs_arr[16];
153 InitializeRange(lhs_arr, lhs_arr + 16);
154 InitializeRange(rhs_arr, rhs_arr + 16);
155
156 Span<float> lhs(lhs_arr);
157 Span<float> rhs(rhs_arr);
158
159 SPAN_ASSERT_TRUE(lhs == rhs, status_);
160 SPAN_ASSERT_FALSE(lhs != rhs, status_);
161
162 SPAN_ASSERT_TRUE(lhs <= rhs, status_);
163 SPAN_ASSERT_TRUE(lhs >= rhs, status_);
164
165 lhs[2] -= 1;
166
167 SPAN_ASSERT_FALSE(lhs == rhs, status_);
168 SPAN_ASSERT_TRUE(lhs < rhs, status_);
169 SPAN_ASSERT_FALSE(lhs > rhs, status_);
170 }
171};
172
174 int * status_;
175
176 TestIterConstruct(int * _status): status_(_status) {}
177
178 XGBOOST_DEVICE void operator()() {
179 this->operator()(0);
180 }
181 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index.
184 SPAN_ASSERT_TRUE(it1 == it2, status_);
185
188 SPAN_ASSERT_TRUE(cit1 == cit2, status_);
189 }
190};
191
193 int * status_;
194
195 TestIterRef(int * _status): status_(_status) {}
196
197 XGBOOST_DEVICE void operator()() {
198 this->operator()(0);
199 }
200 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
201 float arr[16];
202 InitializeRange(arr, arr + 16);
203
204 Span<float> s (arr);
205 SPAN_ASSERT_TRUE(*(s.begin()) == s[0], status_);
206 SPAN_ASSERT_TRUE(*(s.end() - 1) == s[15], status_);
207 }
208};
209
211 int * status_;
212
213 TestIterCalculate(int * _status): status_(_status) {}
214
215 XGBOOST_DEVICE void operator()() {
216 this->operator()(0);
217 }
218 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
219 float arr[16];
220 InitializeRange(arr, arr + 16);
221
222 Span<float> s (arr);
223 Span<float>::iterator beg { s.begin() };
224
225 beg += 4;
226 SPAN_ASSERT_TRUE(*beg == 4, status_);
227
228 beg -= 2;
229 SPAN_ASSERT_TRUE(*beg == 2, status_);
230
231 ++beg;
232 SPAN_ASSERT_TRUE(*beg == 3, status_);
233
234 --beg;
235 SPAN_ASSERT_TRUE(*beg == 2, status_);
236
237 beg++;
238 beg--;
239 SPAN_ASSERT_TRUE(*beg == 2, status_);
240 }
241};
242
244 int * status_;
245
246 TestIterCompare(int * _status): status_(_status) {}
247
248 XGBOOST_DEVICE void operator()() {
249 this->operator()(0);
250 }
251 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
252 float arr[16];
253 InitializeRange(arr, arr + 16);
254 Span<float> s (arr);
255 Span<float>::iterator left { s.begin() };
256 Span<float>::iterator right { s.end() };
257
258 left += 1;
259 right -= 15;
260
261 SPAN_ASSERT_TRUE(left == right, status_);
262
263 SPAN_ASSERT_TRUE(left >= right, status_);
264 SPAN_ASSERT_TRUE(left <= right, status_);
265
266 ++right;
267 SPAN_ASSERT_TRUE(right > left, status_);
268 SPAN_ASSERT_TRUE(left < right, status_);
269 SPAN_ASSERT_TRUE(left <= right, status_);
270 }
271};
272
274 int * status_;
275
276 TestAsBytes(int * _status): status_(_status) {}
277
278 XGBOOST_DEVICE void operator()() {
279 this->operator()(0);
280 }
281 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
282 float arr[16];
283 InitializeRange(arr, arr + 16);
284
285 {
286 const Span<const float> s {arr};
287 const Span<const byte> bs = as_bytes(s);
288 SPAN_ASSERT_TRUE(bs.size() == s.size_bytes(), status_);
289 SPAN_ASSERT_TRUE(static_cast<const void*>(bs.data()) ==
290 static_cast<const void*>(s.data()),
291 status_);
292 }
293
294 {
295 Span<float> s;
296 const Span<const byte> bs = as_bytes(s);
297 SPAN_ASSERT_TRUE(bs.size() == s.size(), status_);
298 SPAN_ASSERT_TRUE(bs.size() == 0, status_);
299 SPAN_ASSERT_TRUE(bs.size_bytes() == 0, status_);
300 SPAN_ASSERT_TRUE(static_cast<const void*>(bs.data()) ==
301 static_cast<const void*>(s.data()),
302 status_);
303 SPAN_ASSERT_TRUE(bs.data() == nullptr, status_);
304 }
305 }
306};
307
309 int * status_;
310
311 TestAsWritableBytes(int * _status): status_(_status) {}
312
313 XGBOOST_DEVICE void operator()() {
314 this->operator()(0);
315 }
316 XGBOOST_DEVICE void operator()(size_t) { // size_t for CUDA index
317 float arr[16];
318 InitializeRange(arr, arr + 16);
319
320 {
321 Span<float> s;
322 Span<byte> bs = as_writable_bytes(s);
323 SPAN_ASSERT_TRUE(bs.size() == s.size(), status_);
324 SPAN_ASSERT_TRUE(bs.size_bytes() == s.size_bytes(), status_);
325 SPAN_ASSERT_TRUE(bs.size() == 0, status_);
326 SPAN_ASSERT_TRUE(bs.size_bytes() == 0, status_);
327 SPAN_ASSERT_TRUE(bs.data() == nullptr, status_);
328 SPAN_ASSERT_TRUE(static_cast<void*>(bs.data()) ==
329 static_cast<void*>(s.data()), status_);
330 }
331
332 {
333 Span<float> s { arr };
334 Span<byte> bs { as_writable_bytes(s) };
335 SPAN_ASSERT_TRUE(s.size_bytes() == bs.size_bytes(), status_);
336 SPAN_ASSERT_TRUE(static_cast<void*>(bs.data()) ==
337 static_cast<void*>(s.data()), status_);
338 }
339 }
340};
341
342} // namespace common
343} // namespace xgboost
344
345#endif
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition span.h:424
Copyright 2015-2023 by XGBoost Contributors.
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition base.h:64
namespace of xgboost
Definition base.h:90
Definition test_span.h:273
Definition test_span.h:308
Definition test_span.h:44
Definition test_span.h:66
Definition test_span.h:143
Definition test_span.h:210
Definition test_span.h:243
Definition test_span.h:173
Definition test_span.h:192
Definition test_span.h:116
Definition test_span.h:88
Definition test_span.h:31