jaulib v1.3.6
Jau Support Library (C++, Java, ..)
Loading...
Searching...
No Matches
test_darray_00.cpp
Go to the documentation of this file.
1/*
2 * Author: Sven Gothel <sgothel@jausoft.com>
3 * Copyright (c) 2020-2024 Gothel Software e.K.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24#include <cassert>
25#include <cstring>
26
27#include <jau/test/catch2_ext.hpp>
28
29#include <jau/basic_algos.hpp>
30#include <jau/basic_types.hpp>
31#include <jau/callocator.hpp>
34#include <jau/darray.hpp>
35#include <jau/float_types.hpp>
36
37/**
38 * Test general use of jau::darray, jau::cow_darray and jau::cow_vector.
39 */
40using namespace jau;
41
42typedef jau::darray<int, jau::nsize_t, jau::callocator<int>, std::is_trivially_copyable_v<int>, true> secure_ints;
43typedef jau::darray<int, jau::nsize_t, jau::callocator<int>, std::is_trivially_copyable_v<int>, false> normal_ints;
44
45TEST_CASE( "JAU DArray Test 00 - ctti", "[ctti][datatype][jau][darray]" ) {
46 typedef jau::darray<uint8_t> ByteBuffer;
47 typedef jau::darray<int32_t> IntBuffer;
48 typedef jau::darray<jau::float32_t> FloatBuffer;
49 ByteBuffer b0(10);
50 ByteBuffer b1(11);
51 IntBuffer i0(10);
52 IntBuffer i1(11);
53 FloatBuffer f0(10);
54 FloatBuffer f1(11);
55
56 std::cout << "RTTI: " << jau::is_rtti_available() << std::endl;
57 std::cout << std::endl;
58 std::cout << "b0: " << b0 << std::endl;
59 std::cout << "b1: " << b1 << std::endl;
60 std::cout << "i0: " << i0 << std::endl;
61 std::cout << "i1: " << i1 << std::endl;
62 std::cout << "f0: " << f0 << std::endl;
63 std::cout << "f1: " << f1 << std::endl;
64 std::cout << std::endl;
65 std::cout << "byte: " << jau::int_ctti::u8() << std::endl;
66 std::cout << "int: " << jau::int_ctti::i32() << std::endl;
67 std::cout << "float: " << jau::float_ctti::f32() << std::endl;
68 std::cout << std::endl;
69 std::cout << "b0 value: " << b0.valueSignature() << std::endl;
70 std::cout << "b1 value: " << b1.valueSignature() << std::endl;
71 std::cout << "i0 value: " << i0.valueSignature() << std::endl;
72 std::cout << "i1 value: " << i1.valueSignature() << std::endl;
73 std::cout << "b0 self: " << b0.classSignature() << std::endl;
74 std::cout << "b1 self: " << b1.classSignature() << std::endl;
75 std::cout << "i0 self: " << i0.classSignature() << std::endl;
76 std::cout << "i1 self: " << i1.classSignature() << std::endl;
77
78 REQUIRE( b0.classSignature() == b1.classSignature() );
79 REQUIRE( i0.classSignature() == i1.classSignature() );
80 REQUIRE( b0.classSignature() != i1.classSignature() );
81
82 REQUIRE( b0.valueSignature() == b1.valueSignature() );
83 REQUIRE( i0.valueSignature() == i1.valueSignature() );
84 REQUIRE( f0.valueSignature() == f1.valueSignature() );
85 REQUIRE( b0.valueSignature() != i1.valueSignature() );
86 REQUIRE( b0.valueSignature() != f1.valueSignature() );
87
88 REQUIRE( b0.valueSignature() == jau::int_ctti::u8() );
89 REQUIRE( b1.valueSignature() == jau::int_ctti::u8() );
90 REQUIRE( i0.valueSignature() == jau::int_ctti::i32() );
91 REQUIRE( i1.valueSignature() == jau::int_ctti::i32() );
92 REQUIRE( f0.valueSignature() == jau::float_ctti::f32() );
93 REQUIRE( f1.valueSignature() == jau::float_ctti::f32() );
94 REQUIRE( b0.valueSignature() != jau::int_ctti::i32() );
95 REQUIRE( i0.valueSignature() != jau::int_ctti::u8() );
96 REQUIRE( f0.valueSignature() != jau::float_ctti::f64() );
97 REQUIRE( f0.valueSignature() != jau::int_ctti::u8() );
98}
99
100template<class T>
101static void int_test() {
102 T data;
103 // printf("COPY-0.1: %s\n", data.getInfo().c_str());
104 CHECK( false == data.pinned() );
105 CHECK( false == data.shared() );
106 CHECK( 0 == data.position() );
107 CHECK( 0 == data.limit() );
108 CHECK( 0 == data.size() );
109 CHECK( 0 == data.capacity() );
110 data.reserve(2);
111 CHECK( 0 == data.position() );
112 CHECK( 0 == data.limit() );
113 CHECK( 0 == data.size() );
114 CHECK( 2 == data.capacity() );
115 data.resize(2);
116 CHECK( 0 == data.position() );
117 CHECK( 2 == data.limit() );
118 CHECK( 2 == data.size() );
119 CHECK( 2 == data.capacity() );
120 int j=0;
121 for(int i : data) {
122 CHECK(0 == i);
123 ++j;
124 }
125 CHECK(2 == j);
126
127 data.resize(4, 42);
128 CHECK( 0 == data.position() );
129 CHECK( 4 == data.limit() );
130 CHECK( 4 == data.size() );
131 CHECK( 4 == data.capacity() );
132 j = 0;
133 for(int i : data) {
134 if( j < 2 ) {
135 CHECK(0 == i);
136 } else {
137 CHECK(42 == i);
138 }
139 ++j;
140 }
141 CHECK(4 == j);
142
143 data.erase(data.cbegin(), data.cend());
144 CHECK( 0 == data.position() );
145 CHECK( 0 == data.limit() );
146 CHECK( 0 == data.size() );
147 CHECK( 4 == data.capacity() );
148
149 data.push_back(1);
150 data.push_back(2);
151 CHECK( 2 == data.position() );
152 CHECK( 2 == data.limit() );
153 CHECK( 2 == data.size() );
154 CHECK( 4 == data.capacity() );
155 CHECK(1 == data[0]);
156 CHECK(2 == data[1]);
157
158 data.shrink_to_fit();
159 CHECK( 2 == data.position() );
160 CHECK( 2 == data.limit() );
161 CHECK( 2 == data.size() );
162 CHECK( 2 == data.capacity() );
163 CHECK(1 == data[0]);
164 CHECK(2 == data[1]);
165
166 data.setGrowthFactor(0);
167 // printf("PINNED-0.6: %s\n", data.getInfo().c_str());
168 CHECK( true == data.pinned() );
169 CHECK( false == data.shared() );
170 REQUIRE_THROWS_AS( data.push_back(42), jau::IllegalStateError );
171 CHECK( 2 == data.position() );
172 CHECK( 2 == data.limit() );
173 CHECK( 2 == data.size() );
174 CHECK( 2 == data.capacity() );
175 data.setGrowthFactor(2.0f);
176 CHECK( false == data.pinned() );
177 CHECK( false == data.shared() );
178
179 data.erase(data.cbegin(), data.cend());
180 CHECK( 0 == data.position() );
181 CHECK( 0 == data.limit() );
182 CHECK( 0 == data.size() );
183 CHECK( 2 == data.capacity() );
184
185 data.shrink_to_fit();
186 // printf("SHRINK-0.8: %s\n", data.getInfo().c_str());
187 CHECK( 0 == data.position() );
188 CHECK( 0 == data.limit() );
189 CHECK( 0 == data.size() );
190 CHECK( 0 == data.capacity() );
191
192 data.push_back(42);
193 CHECK( 1 == data.position() );
194 CHECK( 1 == data.limit() );
195 CHECK( 1 == data.size() );
196 CHECK( 10 == data.capacity() );
197 CHECK(42 == data[0]);
198
199 data.push_back(43);
200 CHECK( 2 == data.position() );
201 CHECK( 2 == data.limit() );
202 CHECK( 2 == data.size() );
203 CHECK( 10 == data.capacity() );
204 CHECK(42 == data[0]);
205 CHECK(43 == data[1]);
206
207 data.setPosition(0);
208 // printf("POS-1.0: %s\n", data.getInfo().c_str());
209 CHECK( 0 == data.position() );
210 CHECK( 2 == data.limit() );
211 CHECK( 2 == data.size() );
212 CHECK( 10 == data.capacity() );
213
214 data.setPosition(1);
215 CHECK( 1 == data.position() );
216 CHECK( 2 == data.limit() );
217 CHECK( 2 == data.size() );
218 CHECK( 10 == data.capacity() );
219
220 data.setPosition(2);
221 CHECK( 2 == data.position() );
222 CHECK( 2 == data.limit() );
223 CHECK( 2 == data.size() );
224 CHECK( 10 == data.capacity() );
225
226 REQUIRE_THROWS_AS( data.setPosition(3), jau::IndexOutOfBoundsError );
227 REQUIRE_THROWS_AS( data.setLimit(3), jau::IndexOutOfBoundsError );
228
229 data.resize(5, 42);
230 CHECK( 2 == data.position() );
231 CHECK( 5 == data.limit() );
232 CHECK( 5 == data.size() );
233 CHECK( 10 == data.capacity() );
234
235 data.pop_back();
236 CHECK( 2 == data.position() );
237 CHECK( 4 == data.limit() );
238 CHECK( 4 == data.size() );
239 CHECK( 10 == data.capacity() );
240
241 data.setLimit(3);
242 CHECK( 2 == data.position() );
243 CHECK( 3 == data.limit() );
244 CHECK( 4 == data.size() );
245 CHECK( 10 == data.capacity() );
246 data.setLimit(1);
247 CHECK( 1 == data.position() );
248 CHECK( 1 == data.limit() );
249 CHECK( 4 == data.size() );
250 CHECK( 10 == data.capacity() );
251 data.setLimit(4);
252 data.setPosition(3);
253 CHECK( 3 == data.position() );
254 CHECK( 4 == data.limit() );
255 CHECK( 4 == data.size() );
256 CHECK( 10 == data.capacity() );
257
258 typename T::value_type val = 0;
259 for(auto it = data.begin(); it != data.end(); ++it) { *it=val++; }
260 data.erase(data.begin()+1);
261 // printf("ERASE-2.0: %s\n", data.getInfo().c_str());
262 // printf("ERASE-2.0: %s\n", data.toString().c_str());
263 CHECK( 2 == data.position() );
264 CHECK( 3 == data.limit() );
265 CHECK( 3 == data.size() );
266 CHECK( 10 == data.capacity() );
267 CHECK( data[0] == 0 );
268 CHECK( data[1] == 2 );
269 CHECK( data[2] == 3 );
270
271 data.resize(10);
272 val = 0;
273 for(auto it = data.begin(); it != data.end(); ++it) { *it=val++; }
274 CHECK( 2 == data.position() );
275 CHECK( 10 == data.limit() );
276 CHECK( 10 == data.size() );
277 CHECK( 10 == data.capacity() );
278 data.setPosition(8);
279 CHECK( 8 == data.position() );
280
281 data.erase(data.begin()+1, data.begin()+4);
282 CHECK( 5 == data.position() );
283 CHECK( 7 == data.limit() );
284 CHECK( 7 == data.size() );
285 CHECK( 10 == data.capacity() );
286 CHECK( data[0] == 0 );
287 CHECK( data[1] == 4 );
288 CHECK( data[2] == 5 );
289
290 data.resize(10);
291 val = 0;
292 for(auto it = data.begin(); it != data.end(); ++it) { *it=val++; }
293 CHECK( 5 == data.position() );
294 CHECK( 10 == data.limit() );
295 CHECK( 10 == data.size() );
296 CHECK( 10 == data.capacity() );
297
298 data.erase(data.begin()+3, data.begin()+8);
299 CHECK( 3 == data.position() );
300 CHECK( 5 == data.limit() );
301 CHECK( 5 == data.size() );
302 CHECK( 10 == data.capacity() );
303 CHECK( data[0] == 0 );
304 CHECK( data[1] == 1 );
305 CHECK( data[2] == 2 );
306 CHECK( data[3] == 8 );
307 CHECK( data[4] == 9 );
308
309 data.clear();
310 CHECK( 0 == data.position() );
311 CHECK( 0 == data.limit() );
312 CHECK( 0 == data.size() );
313 CHECK( 10 == data.capacity() );
314 data.resize(10);
315 CHECK( 0 == data.position() );
316 CHECK( 10 == data.limit() );
317 CHECK( 10 == data.size() );
318 CHECK( 10 == data.capacity() );
319 data.clear(true);
320 CHECK( 0 == data.position() );
321 CHECK( 0 == data.limit() );
322 CHECK( 0 == data.size() );
323 CHECK( 0 == data.capacity() );
324}
325
326TEST_CASE( "JAU DArray Test 01 - basics", "[basics][datatype][jau][darray]" ) {
329}
330
331TEST_CASE( "JAU DArray Test 02 - slice", "[slice][datatype][jau][darray]" ) {
332 normal_ints d0(nullptr, 10, 0);
333 CHECK( false == d0.pinned() );
334 CHECK( false == d0.shared() );
335 CHECK( 0 == d0.position() );
336 CHECK( 10 == d0.limit() );
337 CHECK( 10 == d0.size() );
338 CHECK( 10 == d0.capacity() );
339
340 {
341 normal_ints s0 = d0.duplicate();
342 CHECK( true == d0.pinned() );
343 CHECK( false == d0.shared() );
344 CHECK( true == s0.pinned() );
345 CHECK( true == s0.shared() );
346 CHECK( 0 == s0.position() );
347 CHECK( 10 == s0.limit() );
348 CHECK( 10 == s0.size() );
349 CHECK( 10 == s0.capacity() );
350 CHECK( d0.begin() == s0.begin() );
351 CHECK( d0.position_ptr() == s0.position_ptr() );
352 CHECK( d0.position() == s0.position() );
353 CHECK( d0.limit_ptr() == s0.limit_ptr() );
354 CHECK( d0.limit() == s0.limit() );
355 CHECK( d0.end() == s0.end() );
356 CHECK( d0.size() == s0.size() );
357 CHECK( d0.capacity() == s0.capacity() );
358 REQUIRE_THROWS_AS( d0.push_back(42), jau::IllegalStateError );
359 REQUIRE_THROWS_AS( s0.push_back(42), jau::IllegalStateError );
360 }
361
362 {
363 normal_ints s0 = d0.slice();
364 CHECK( true == d0.pinned() );
365 CHECK( false == d0.shared() );
366 CHECK( true == s0.pinned() );
367 CHECK( true == s0.shared() );
368 CHECK( 0 == s0.position() );
369 CHECK( 10 == s0.limit() );
370 CHECK( 10 == s0.size() );
371 CHECK( 10 == s0.capacity() );
372 CHECK( d0.begin() == s0.begin() );
373 CHECK( d0.position_ptr() == s0.position_ptr() );
374 CHECK( d0.position() == s0.position() );
375 CHECK( d0.limit_ptr() == s0.limit_ptr() );
376 CHECK( d0.limit() == s0.limit() );
377 CHECK( d0.end() == s0.end() );
378 CHECK( d0.size() == s0.size() );
379 CHECK( d0.capacity() == s0.capacity() );
380 REQUIRE_THROWS_AS( d0.push_back(42), jau::IllegalStateError );
381 REQUIRE_THROWS_AS( s0.push_back(42), jau::IllegalStateError );
382 }
383
384 d0.setPosition(5);
385 {
386 normal_ints s0 = d0.duplicate();
387 CHECK( true == d0.pinned() );
388 CHECK( false == d0.shared() );
389 CHECK( true == s0.pinned() );
390 CHECK( true == s0.shared() );
391 CHECK( 5 == s0.position() );
392 CHECK( 10 == s0.limit() );
393 CHECK( 10 == s0.size() );
394 CHECK( 10 == s0.capacity() );
395 CHECK( d0.begin() == s0.begin() );
396 CHECK( d0.position_ptr() == s0.position_ptr() );
397 CHECK( d0.position() == s0.position() );
398 CHECK( d0.limit_ptr() == s0.limit_ptr() );
399 CHECK( d0.limit() == s0.limit() );
400 CHECK( d0.end() == s0.end() );
401 CHECK( d0.size() == s0.size() );
402 CHECK( d0.capacity() == s0.capacity() );
403 REQUIRE_THROWS_AS( d0.push_back(42), jau::IllegalStateError );
404 REQUIRE_THROWS_AS( s0.push_back(42), jau::IllegalStateError );
405 }
406 {
407 normal_ints s0 = d0.slice();
408 CHECK( true == d0.pinned() );
409 CHECK( false == d0.shared() );
410 CHECK( true == s0.pinned() );
411 CHECK( true == s0.shared() );
412 CHECK( 0 == s0.position() );
413 CHECK( 5 == s0.limit() );
414 CHECK( 5 == s0.size() );
415 CHECK( 5 == s0.capacity() );
416 CHECK( d0.position_ptr() == s0.begin() );
417 CHECK( d0.position_ptr() == s0.position_ptr() );
418 CHECK( d0.limit_ptr() == s0.limit_ptr() );
419 CHECK( 5 == s0.limit() );
420 CHECK( d0.end() == s0.end() );
421 CHECK( 5 == s0.size() );
422 CHECK( 5 == s0.capacity() );
423 REQUIRE_THROWS_AS( d0.push_back(42), jau::IllegalStateError );
424 REQUIRE_THROWS_AS( s0.push_back(42), jau::IllegalStateError );
425 }
426}
427
428TEST_CASE( "JAU DArray Test 03 - put/get", "[put][get][datatype][jau][darray]" ) {
429 normal_ints d0(nullptr, 10);
430 CHECK( false == d0.pinned() );
431 CHECK( false == d0.shared() );
432 CHECK( 0 == d0.position() );
433 CHECK( 10 == d0.remaining() );
434 CHECK( 10 == d0.limit() );
435 CHECK( 10 == d0.size() );
436 CHECK( 10 == d0.capacity() );
437 int v = 0;
438 for(normal_ints::size_type i=0; i<6; ++i) {
439 d0.put(v++);
440 }
441 CHECK( 6 == d0.position() );
442 CHECK( 4 == d0.remaining() );
443 CHECK( 10 == d0.limit() );
444 CHECK( 10 == d0.size() );
445 CHECK( 10 == d0.capacity() );
446 d0.flip();
447 CHECK( 0 == d0.position() );
448 CHECK( 6 == d0.remaining() );
449 CHECK( 6 == d0.limit() );
450 CHECK( 10 == d0.size() );
451 CHECK( 10 == d0.capacity() );
452 v = 0;
453 while( d0.hasRemaining() ) {
454 CHECK( v++ == d0.get() );
455 }
456 CHECK( 6 == d0.position() );
457 CHECK( 0 == d0.remaining() );
458 CHECK( 6 == d0.limit() );
459 CHECK( 10 == d0.size() );
460 CHECK( 10 == d0.capacity() );
461 REQUIRE_THROWS_AS( d0.get(), jau::IndexOutOfBoundsError );
462 CHECK( 6 == d0.position() );
463 CHECK( 0 == d0.remaining() );
464 CHECK( 6 == d0.limit() );
465 CHECK( 10 == d0.size() );
466 CHECK( 10 == d0.capacity() );
467
468 d0.clearPosition();
469 CHECK( 0 == d0.position() );
470 CHECK( 10 == d0.remaining() );
471 CHECK( 10 == d0.limit() );
472 CHECK( 10 == d0.size() );
473 CHECK( 10 == d0.capacity() );
474 d0.putN(False(), 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 );
475 CHECK( 10 == d0.position() );
476 CHECK( 0 == d0.remaining() );
477 CHECK( 10 == d0.limit() );
478 CHECK( 10 == d0.size() );
479 CHECK( 10 == d0.capacity() );
480
481 d0.flip();
482 CHECK( 0 == d0.position() );
483 CHECK( 10 == d0.remaining() );
484 CHECK( 10 == d0.limit() );
485 CHECK( 10 == d0.size() );
486 CHECK( 10 == d0.capacity() );
487 v = 10;
488 while(d0.hasRemaining()) {
489 CHECK( v++ == d0.get() );
490 }
491
492 d0.rewind();
493 CHECK( 0 == d0.position() );
494 CHECK( 10 == d0.remaining() );
495 CHECK( 10 == d0.limit() );
496 CHECK( 10 == d0.size() );
497 CHECK( 10 == d0.capacity() );
498 REQUIRE_THROWS_AS( d0.putN(False(), 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ), jau::IndexOutOfBoundsError );
499 CHECK( 0 == d0.position() );
500 CHECK( 10 == d0.remaining() );
501 CHECK( 10 == d0.limit() );
502 CHECK( 10 == d0.size() );
503 CHECK( 10 == d0.capacity() );
504
505 d0.putN(True(), 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 );
506 std::cout << "p1: " << d0.getInfo() << "\n";
507 std::cout << "p1: " << d0 << "\n";
508 CHECK( 11 == d0.position() );
509 CHECK( 0 == d0.remaining() );
510 CHECK( 11 == d0.limit() );
511 CHECK( 11 == d0.size() );
512 CHECK( 11 < d0.capacity() );
513 auto c1 = d0.capacity();
514
515 REQUIRE_THROWS_AS( d0.put(21), jau::IndexOutOfBoundsError );
516 d0.put(21, True());
517 std::cout << "p2: " << d0.getInfo() << "\n";
518 std::cout << "p2: " << d0 << "\n";
519 CHECK( 12 == d0.position() );
520 CHECK( 0 == d0.remaining() );
521 CHECK( 12 == d0.limit() );
522 CHECK( 12 == d0.size() );
523 CHECK( c1 == d0.capacity() );
524
525 REQUIRE_THROWS_AS( d0.putN(False(), 22, 23, 24, 25 ), jau::IndexOutOfBoundsError );
526 d0.putN(True(), 22, 23, 24, 25 );
527 std::cout << "p3: " << d0.getInfo() << "\n";
528 std::cout << "p3: " << d0 << "\n";
529 CHECK( 16 == d0.position() );
530 CHECK( 0 == d0.remaining() );
531 CHECK( 16 == d0.limit() );
532 CHECK( 16 == d0.size() );
533 CHECK( 16 == d0.capacity() );
534
535 d0.setGrowthFactor(1.0f);
536 CHECK( false == d0.pinned() );
537 CHECK( false == d0.shared() );
538 d0.put(26, True());
539 std::cout << "p4: " << d0.getInfo() << "\n";
540 std::cout << "p4: " << d0 << "\n";
541 CHECK( 17 == d0.position() );
542 CHECK( 0 == d0.remaining() );
543 CHECK( 17 == d0.limit() );
544 CHECK( 17 == d0.size() );
545 CHECK( 17 == d0.capacity() );
546
547 d0.push_back(27);
548 std::cout << "p5: " << d0.getInfo() << "\n";
549 std::cout << "p5: " << d0 << "\n";
550 CHECK( 18 == d0.position() );
551 CHECK( 0 == d0.remaining() );
552 CHECK( 18 == d0.limit() );
553 CHECK( 18 == d0.size() );
554 CHECK( 18 == d0.capacity() );
555
556 d0.flip();
557 CHECK( 0 == d0.position() );
558 CHECK( 18 == d0.remaining() );
559 CHECK( 18 == d0.limit() );
560 CHECK( 18 == d0.size() );
561 CHECK( 18 == d0.capacity() );
562 v = 10;
563 while(d0.hasRemaining()) {
564 CHECK( v++ == d0.get() );
565 }
566 CHECK( 18 == d0.position() );
567 CHECK( 0 == d0.remaining() );
568 CHECK( 18 == d0.limit() );
569 CHECK( 18 == d0.size() );
570 CHECK( 18 == d0.capacity() );
571}
Implementation of a dynamic linear array storage, aka vector, including relative positional access.
Definition darray.hpp:153
constexpr self_t & rewind() noexcept
Sets position to zero.
Definition darray.hpp:881
constexpr_cxx20 self_t & put(const_reference v, Bool grow=Bool::False)
Relative put() for single value, increasing position().
Definition darray.hpp:925
constexpr_cxx20 const_reference get()
Relative get() for single value reference, increasing position() by one.
Definition darray.hpp:907
constexpr iterator end() noexcept
Definition darray.hpp:828
constexpr size_type capacity() const noexcept
Return the current capacity.
Definition darray.hpp:1044
constexpr size_type size() const noexcept
Like std::vector::size().
Definition darray.hpp:1069
constexpr void push_back(const value_type &x)
Like std::vector::push_back(), copy.
Definition darray.hpp:1522
constexpr size_type position() const noexcept
Next relative read/write element index, with 0 <= position <= limit.
Definition darray.hpp:843
constexpr bool pinned() const
Returns true if growthFactor() < 1, otherwise false.
Definition darray.hpp:235
constexpr bool shared() const
Returns true if growthFactor() < 0, otherwise false.
Definition darray.hpp:237
constexpr const_pointer limit_ptr() const noexcept
Pointer to immutable read/write limit, one element beyond maximum element with limit <= size/end.
Definition darray.hpp:861
constexpr size_type limit() const noexcept
Read/write limit, one element beyond maximum index with limit <= size/end.
Definition darray.hpp:859
self_t & setPosition(size_type v)
Sets position.
Definition darray.hpp:849
constexpr iterator begin() noexcept
Definition darray.hpp:824
constexpr_cxx20 self_t & putN(Bool grow, const Targs &...args)
Relative put() for multiple value of an assignable type fitting into value_type, increasing position(...
Definition darray.hpp:959
constexpr pointer position_ptr() noexcept
Pointer to mutable next relative read/write element index, with 0 <= position <= limit.
Definition darray.hpp:845
constexpr self_t & clearPosition() noexcept
Clears the relative position and limit w/o destructing elements nor mutating storage.
Definition darray.hpp:896
constexpr bool hasRemaining() const noexcept
Returns whether position < limit, i.e.
Definition darray.hpp:1027
self_t slice()
Returns a sliced duplicate starting from this buffers' current position.
Definition darray.hpp:991
constexpr void setGrowthFactor(float v) noexcept
Sets the growth factor when size() == capacity() is reached for growing operations,...
Definition darray.hpp:233
constexpr size_type remaining() const noexcept
Returns limit - position.
Definition darray.hpp:1025
self_t duplicate()
Returns a duplicate with same position and limit.
Definition darray.hpp:1019
constexpr self_t & flip() noexcept
Sets limit to position and position to zero.
Definition darray.hpp:874
std::string getInfo() const noexcept
Definition darray.hpp:1783
static const jau::type_info & f32()
static const jau::type_info & f64()
static const jau::type_info & u8()
static const jau::type_info & i32()
consteval_cxx20 bool is_rtti_available() noexcept
Returns true if compiled with RTTI available.
Definition type_info.hpp:88
constexpr Bool False() noexcept
constexpr Bool True() noexcept
__pack(...): Produces MSVC, clang and gcc compatible lead-in and -out macros.
Definition backtrace.hpp:32
jau::darray< int, jau::nsize_t, jau::callocator< int >, std::is_trivially_copyable_v< int >, true > secure_ints
TEST_CASE("JAU DArray Test 00 - ctti", "[ctti][datatype][jau][darray]")
static void int_test()
jau::darray< int, jau::nsize_t, jau::callocator< int >, std::is_trivially_copyable_v< int >, false > normal_ints