33
33
#include " sus/num/overflow_integer.h"
34
34
#include " sus/ops/eq.h"
35
35
#include " sus/prelude.h"
36
+ #include " sus/test/no_copy_move.h"
36
37
37
38
using sus::containers::Array;
38
39
using sus::iter::IteratorBase;
39
40
using sus::option::Option;
41
+ using sus::result::Result;
42
+ using sus::test::NoCopyMove;
40
43
41
44
namespace sus ::test::iter {
42
45
@@ -45,6 +48,10 @@ struct CollectSum {
45
48
T sum;
46
49
};
47
50
51
+ struct CollectRefs {
52
+ sus::Vec<const NoCopyMove*> vec;
53
+ };
54
+
48
55
} // namespace sus::test::iter
49
56
50
57
template <class T >
@@ -57,6 +64,16 @@ struct sus::iter::FromIteratorImpl<sus::test::iter::CollectSum<T>> {
57
64
}
58
65
};
59
66
67
+ template <>
68
+ struct sus ::iter::FromIteratorImpl<sus::test::iter::CollectRefs> {
69
+ static sus::test::iter::CollectRefs from_iter (
70
+ sus::iter::IntoIterator<const NoCopyMove&> auto iter) noexcept {
71
+ auto v = sus::Vec<const NoCopyMove*>();
72
+ for (const NoCopyMove& t : sus::move (iter).into_iter ()) v.push (&t);
73
+ return sus::test::iter::CollectRefs (sus::move (v));
74
+ }
75
+ };
76
+
60
77
namespace {
61
78
using namespace sus ::test::iter;
62
79
@@ -460,6 +477,10 @@ TEST(Iterator, Collect) {
460
477
ArrayIterator<i32, 5 >::with_array (nums).collect <CollectSum<i32>>();
461
478
EXPECT_EQ (collected.sum , 1 + 2 + 3 + 4 + 5 );
462
479
480
+ auto from = sus::iter::from_iter<CollectSum<i32>>(
481
+ ArrayIterator<i32, 5 >::with_array (nums));
482
+ EXPECT_EQ (from.sum , 1 + 2 + 3 + 4 + 5 );
483
+
463
484
static_assert (sus::Array<i32, 5 >::with (1 , 2 , 3 , 4 , 5 )
464
485
.into_iter ()
465
486
.collect <CollectSum<i32>>()
@@ -481,6 +502,66 @@ TEST(Iterator, CollectVec) {
481
502
sus::Vec<i32>::with (1 , 2 , 3 , 4 , 5 ));
482
503
}
483
504
505
+ TEST (Iterator, TryCollect) {
506
+ // Option.
507
+ {
508
+ auto collected = sus::Array<Option<i32>, 3 >::with (
509
+ ::sus::some (1 ), ::sus::some(2 ), ::sus::some(3 ))
510
+ .into_iter()
511
+ .try_collect<Option<Vec<i32>>>();
512
+ EXPECT_EQ (collected.is_some (), true );
513
+ EXPECT_EQ (collected.as_value (), sus::Vec<i32>::with (1 , 2 , 3 ));
514
+
515
+ auto it = sus::Array<Option<i32>, 3 >::with (::sus::some (1 ), ::sus::none (),
516
+ ::sus::some (3 ))
517
+ .into_iter();
518
+ auto up_to_none = it.try_collect <Option<Vec<i32>>>();
519
+ EXPECT_EQ (up_to_none, sus::none ());
520
+ auto after_none = it.try_collect <Option<Vec<i32>>>();
521
+ EXPECT_EQ (after_none.as_value (), sus::Vec<i32>::with (3 ));
522
+
523
+ NoCopyMove n[3 ];
524
+ auto refs = sus::Array<Option<const NoCopyMove&>, 3 >::with (
525
+ ::sus::some (n[0 ]), ::sus::some(n[1 ]), ::sus::some(n[2 ]))
526
+ .into_iter()
527
+ .try_collect<Option<CollectRefs>>();
528
+ EXPECT_EQ (refs.is_some (), true );
529
+ EXPECT_EQ (refs.as_value ().vec [0u ], &n[0 ]);
530
+ EXPECT_EQ (refs.as_value ().vec [1u ], &n[1 ]);
531
+ EXPECT_EQ (refs.as_value ().vec [2u ], &n[2 ]);
532
+ }
533
+ // Result.
534
+ enum Error { ERROR };
535
+ {
536
+ auto collected = sus::Array<Result<i32, Error>, 3 >::with (
537
+ ::sus::ok (1 ), ::sus::ok(2 ), ::sus::ok(3 ))
538
+ .into_iter()
539
+ .try_collect<Result<Vec<i32>, Error>>();
540
+ EXPECT_EQ (collected.as_ok (), sus::Vec<i32>::with (1 , 2 , 3 ));
541
+
542
+ auto it = sus::Array<Result<i32, Error>, 3 >::with (
543
+ ::sus::ok (1 ), ::sus::err(ERROR), ::sus::ok(3 ))
544
+ .into_iter();
545
+ auto up_to_err = it.try_collect <Result<Vec<i32>, Error>>();
546
+ EXPECT_EQ (up_to_err, sus::err (ERROR));
547
+ auto after_err = it.try_collect <Result<Vec<i32>, Error>>();
548
+ EXPECT_EQ (after_err.as_ok (), sus::Vec<i32>::with (3 ));
549
+ }
550
+
551
+ auto from = sus::iter::try_from_iter<Option<Vec<i32>>>(
552
+ sus::Array<Option<i32>, 3 >::with (::sus::some (1 ), ::sus::some (2 ),
553
+ ::sus::some (3 )));
554
+ EXPECT_EQ (from.as_value (), sus::Vec<i32>::with (1 , 2 , 3 ));
555
+
556
+ static_assert (
557
+ sus::Array<Option<i32>, 3 >::with (sus::some (1 ), sus::some (2 ), sus::some (3 ))
558
+ .into_iter ()
559
+ .try_collect <Option<Vec<i32>>>()
560
+ .unwrap ()
561
+ .into_iter ()
562
+ .sum () == 1 + 2 + 3 );
563
+ }
564
+
484
565
TEST (Iterator, Rev) {
485
566
i32 nums[5 ] = {1 , 2 , 3 , 4 , 5 };
486
567
0 commit comments