• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

STEllAR-GROUP / hpx / #845

05 Dec 2022 08:25PM UTC coverage: 85.664% (-0.1%) from 85.8%
#845

push

StellarBot
Merge #6091

6091: Replace artificial sequencing with fold expressions r=hkaiser a=hkaiser

- flyby: fix left-over problems from namespace change

working towards resolving #5497

Co-authored-by: Hartmut Kaiser <hartmut.kaiser@gmail.com>

99 of 99 new or added lines in 15 files covered. (100.0%)

171125 of 199764 relevant lines covered (85.66%)

1865254.07 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.17
/libs/core/iterator_support/tests/unit/is_iterator.cpp
1
//  Copyright (c) 2019 Austin McCartney
2
//  Copyright (c) 2022 Hartmut Kaiser
3
//
4
//  SPDX-License-Identifier: BSL-1.0
5
//  Distributed under the Boost Software License, Version 1.0. (See accompanying
6
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7

8
#include <hpx/config.hpp>
9
#include <hpx/iterator_support/iterator_adaptor.hpp>
10
#include <hpx/iterator_support/traits/is_iterator.hpp>
11
#include <hpx/modules/testing.hpp>
12

13
#include <cstddef>
14
#include <forward_list>
15
#include <iterator>
16
#include <list>
17
#include <type_traits>
18
#include <vector>
19

20
namespace test {
21

22
    template <typename BaseIterator, typename IteratorTag>
23
    struct test_iterator
24
      : hpx::util::iterator_adaptor<test_iterator<BaseIterator, IteratorTag>,
25
            BaseIterator, void, IteratorTag>
26
    {
27
    private:
28
        typedef hpx::util::iterator_adaptor<
29
            test_iterator<BaseIterator, IteratorTag>, BaseIterator, void,
30
            IteratorTag>
31
            base_type;
32

33
    public:
34
        test_iterator()
35
          : base_type()
36
        {
37
        }
38
        explicit test_iterator(BaseIterator base)
39
          : base_type(base)
40
        {
41
        }
42
    };
43
}    // namespace test
44

45
template <typename T, typename = void>
46
struct has_nested_type : std::integral_constant<bool, false>
47
{
48
};
49

50
template <typename T>
51
struct has_nested_type<T, std::void_t<typename T::type>>
52
  : std::integral_constant<bool, true>
53
{
54
};
55

56
struct bidirectional_traversal_iterator
57
{
58
    using difference_type = int;
59
    using value_type = int;
60
    using iterator_category = std::input_iterator_tag;
61
    using pointer = const int*;
62
    using reference = void;
63

64
    int state;
65

66
    int operator*() const
67
    {
68
        return this->state;
69
    }
70
    int operator->() const = delete;
71

72
    bidirectional_traversal_iterator& operator++()
73
    {
74
        ++(this->state);
75
        return *this;
76
    }
77

78
    bidirectional_traversal_iterator operator++(int)
79
    {
80
        bidirectional_traversal_iterator copy = *this;
81
        ++(*this);
82
        return copy;
83
    }
84

85
    bidirectional_traversal_iterator& operator--()
86
    {
87
        --(this->state);
88
        return *this;
89
    }
90

91
    bidirectional_traversal_iterator operator--(int)
92
    {
93
        bidirectional_traversal_iterator copy = *this;
94
        --(*this);
95
        return copy;
96
    }
97

98
    bool operator==(const bidirectional_traversal_iterator& that) const
99
    {
100
        return this->state == that.state;
101
    }
102

103
    bool operator!=(const bidirectional_traversal_iterator& that) const
104
    {
105
        return this->state != that.state;
106
    }
107

108
    bool operator<(const bidirectional_traversal_iterator& that) const
109
    {
110
        return this->state < that.state;
111
    }
112

113
    bool operator<=(const bidirectional_traversal_iterator& that) const
114
    {
115
        return this->state <= that.state;
116
    }
117

118
    bool operator>(const bidirectional_traversal_iterator& that) const
119
    {
120
        return this->state > that.state;
121
    }
122

123
    bool operator>=(const bidirectional_traversal_iterator& that) const
124
    {
125
        return this->state >= that.state;
126
    }
127
};
128

129
struct random_access_traversal_iterator
130
{
131
    using difference_type = int;
132
    using value_type = int;
133
    using iterator_category = std::input_iterator_tag;
134
    using pointer = const int*;
135
    using reference = void;
136

137
    int state;
138

139
    int operator*() const
140
    {
141
        return this->state;
142
    }
143
    int operator->() const = delete;
144

145
    random_access_traversal_iterator& operator++()
146
    {
147
        ++(this->state);
148
        return *this;
149
    }
150

151
    random_access_traversal_iterator operator++(int)
152
    {
153
        random_access_traversal_iterator copy = *this;
154
        ++(*this);
155
        return copy;
156
    }
157

158
    random_access_traversal_iterator& operator--()
159
    {
160
        --(this->state);
161
        return *this;
162
    }
163

164
    random_access_traversal_iterator operator--(int)
165
    {
166
        random_access_traversal_iterator copy = *this;
167
        --(*this);
168
        return copy;
169
    }
170

171
    int operator[](difference_type n) const
172
    {
173
        return this->state + n;
174
    }
175

176
    random_access_traversal_iterator& operator+=(difference_type n)
177
    {
178
        this->state += n;
179
        return *this;
180
    }
181

182
    random_access_traversal_iterator operator+(difference_type n)
183
    {
184
        random_access_traversal_iterator copy = *this;
185
        return copy += n;
186
    }
187

188
    random_access_traversal_iterator& operator-=(difference_type n)
189
    {
190
        this->state -= n;
191
        return *this;
192
    }
193

194
    random_access_traversal_iterator operator-(difference_type n)
195
    {
196
        random_access_traversal_iterator copy = *this;
197
        return copy -= n;
198
    }
199

200
    difference_type operator-(
201
        const random_access_traversal_iterator& that) const
202
    {
203
        return this->state - that.state;
204
    }
205

206
    bool operator==(const random_access_traversal_iterator& that) const
207
    {
208
        return this->state == that.state;
209
    }
210

211
    bool operator!=(const random_access_traversal_iterator& that) const
212
    {
213
        return this->state != that.state;
214
    }
215

216
    bool operator<(const random_access_traversal_iterator& that) const
217
    {
218
        return this->state < that.state;
219
    }
220

221
    bool operator<=(const random_access_traversal_iterator& that) const
222
    {
223
        return this->state <= that.state;
224
    }
225

226
    bool operator>(const random_access_traversal_iterator& that) const
227
    {
228
        return this->state > that.state;
229
    }
230

231
    bool operator>=(const random_access_traversal_iterator& that) const
232
    {
233
        return this->state >= that.state;
234
    }
235
};
236

237
void addition_result_test()
1✔
238
{
239
    using namespace hpx::traits::detail;
240

241
    struct A
242
    {
243
    };
244
    struct B
245
    {
246
    };
247

248
    struct C
249
    {
250
        B operator+(const A&) const
251
        {
252
            return B{};
253
        }
254
    };
255

256
    HPX_TEST_MSG((std::is_same_v<B, addition_result_t<C, A>>), "deduced type");
1✔
257

258
    HPX_TEST_MSG(
1✔
259
        (!has_nested_type<addition_result<B, A>>::value), "invalid operation");
260
}
1✔
261

262
void dereference_result_test()
1✔
263
{
264
    using namespace hpx::traits::detail;
265

266
    struct A
267
    {
268
    };
269

270
    struct B
271
    {
272
        A operator*() const
273
        {
274
            return A{};
275
        }
276
    };
277

278
    HPX_TEST_MSG((std::is_same_v<A, dereference_result_t<B>>), "deduced type");
1✔
279

280
    HPX_TEST_MSG(
1✔
281
        (!has_nested_type<dereference_result<A>>::value), "invalid operation");
282
}
1✔
283

284
void equality_result_test()
1✔
285
{
286
    using namespace hpx::traits::detail;
287

288
    struct A
289
    {
290
    };
291
    struct B
292
    {
293
    };
294

295
    struct C
296
    {
297
        B operator==(const A&) const
298
        {
299
            return B{};
300
        }
301
    };
302

303
    HPX_TEST_MSG((std::is_same_v<B, equality_result_t<C, A>>), "deduced type");
1✔
304

305
    HPX_TEST_MSG(
1✔
306
        (!has_nested_type<equality_result<B, A>>::value), "invalid operation");
307
}
1✔
308

309
void inequality_result_test()
1✔
310
{
311
    using namespace hpx::traits::detail;
312

313
    struct A
314
    {
315
    };
316
    struct B
317
    {
318
    };
319

320
    struct C
321
    {
322
        B operator!=(const A&) const
323
        {
324
            return B{};
325
        }
326
    };
327

328
    HPX_TEST_MSG(
1✔
329
        (std::is_same_v<B, inequality_result_t<C, A>>), "deduced type");
330

331
    HPX_TEST_MSG((!has_nested_type<inequality_result<B, A>>::value),
1✔
332
        "invalid operation");
333
}
1✔
334

335
void inplace_addition_result_test()
1✔
336
{
337
    using namespace hpx::traits::detail;
338

339
    struct A
340
    {
341
    };
342
    struct B
343
    {
344
    };
345

346
    struct C
347
    {
348
        B operator+=(const A&) const
349
        {
350
            return B{};
351
        }
352
    };
353

354
    HPX_TEST_MSG(
1✔
355
        (std::is_same_v<B, inplace_addition_result_t<C, A>>), "deduced type");
356

357
    HPX_TEST_MSG((!has_nested_type<inplace_addition_result<B, A>>::value),
1✔
358
        "invalid operation");
359
}
1✔
360

361
void inplace_subtraction_result_test()
1✔
362
{
363
    using namespace hpx::traits::detail;
364

365
    struct A
366
    {
367
    };
368
    struct B
369
    {
370
    };
371

372
    struct C
373
    {
374
        B operator-=(const A&) const
375
        {
376
            return B{};
377
        }
378
    };
379

380
    HPX_TEST_MSG((std::is_same_v<B, inplace_subtraction_result_t<C, A>>),
1✔
381
        "deduced type");
382

383
    HPX_TEST_MSG((!has_nested_type<inplace_subtraction_result<B, A>>::value),
1✔
384
        "invalid operation");
385
}
1✔
386

387
void predecrement_result_test()
1✔
388
{
389
    using namespace hpx::traits::detail;
390

391
    struct A
392
    {
393
    };
394

395
    struct B
396
    {
397
        A& operator--() const
398
        {
399
            static A a;
400
            return a;
401
        }
402
    };
403

404
    HPX_TEST_MSG(
1✔
405
        (std::is_same_v<A&, predecrement_result_t<B>>), "deduced type");
406

407
    HPX_TEST_MSG(
1✔
408
        (!has_nested_type<predecrement_result<A>>::value), "invalid operation");
409
}
1✔
410

411
void preincrement_result_test()
1✔
412
{
413
    using namespace hpx::traits::detail;
414

415
    struct A
416
    {
417
    };
418

419
    struct B
420
    {
421
        A& operator++() const
422
        {
423
            static A a;
424
            return a;
425
        }
426
    };
427

428
    HPX_TEST_MSG(
1✔
429
        (std::is_same_v<A&, preincrement_result_t<B>>), "deduced type");
430

431
    HPX_TEST_MSG(
1✔
432
        (!has_nested_type<preincrement_result<A>>::value), "invalid operation");
433
}
1✔
434

435
void postdecrement_result_test()
1✔
436
{
437
    using namespace hpx::traits::detail;
438

439
    struct A
440
    {
441
    };
442

443
    struct B
444
    {
445
        A operator--(int) const
446
        {
447
            return A{};
448
        }
449
    };
450

451
    HPX_TEST_MSG(
1✔
452
        (std::is_same_v<A, postdecrement_result_t<B>>), "deduced type");
453

454
    HPX_TEST_MSG((!has_nested_type<postdecrement_result<A>>::value),
1✔
455
        "invalid operation");
456
}
1✔
457

458
void postincrement_result_test()
1✔
459
{
460
    using namespace hpx::traits::detail;
461

462
    struct A
463
    {
464
    };
465

466
    struct B
467
    {
468
        A operator++(int) const
469
        {
470
            return A{};
471
        }
472
    };
473

474
    HPX_TEST_MSG(
1✔
475
        (std::is_same_v<A, postincrement_result_t<B>>), "deduced type");
476

477
    HPX_TEST_MSG((!has_nested_type<postincrement_result<A>>::value),
1✔
478
        "invalid operation");
479
}
1✔
480

481
void subscript_result_test()
1✔
482
{
483
    using namespace hpx::traits::detail;
484

485
    struct A
486
    {
487
    };
488
    struct B
489
    {
490
    };
491

492
    struct C
493
    {
494
        B operator[](const A&) const
495
        {
496
            return B{};
497
        }
498
    };
499

500
    HPX_TEST_MSG((std::is_same_v<B, subscript_result_t<C, A>>), "deduced type");
1✔
501

502
    HPX_TEST_MSG(
1✔
503
        (!has_nested_type<subscript_result<B, A>>::value), "invalid operation");
504
}
1✔
505

506
void subtraction_result_test()
1✔
507
{
508
    using namespace hpx::traits::detail;
509

510
    struct A
511
    {
512
    };
513
    struct B
514
    {
515
    };
516

517
    struct C
518
    {
519
        B operator-(const A&) const
520
        {
521
            return B{};
522
        }
523
    };
524

525
    HPX_TEST_MSG(
1✔
526
        (std::is_same_v<B, subtraction_result_t<C, A>>), "deduced type");
527

528
    HPX_TEST_MSG((!has_nested_type<subtraction_result<B, A>>::value),
1✔
529
        "invalid operation");
530
}
1✔
531

532
void bidirectional_concept_test()
1✔
533
{
534
    using hpx::traits::detail::bidirectional_concept;
535

536
    {
537
        using iterator = std::ostream_iterator<int>;
538
        HPX_TEST_MSG(
1✔
539
            (!bidirectional_concept<iterator>::value), "output iterator");
540
    }
541
    {
542
        using iterator = std::istream_iterator<int>;
543
        HPX_TEST_MSG(
1✔
544
            (!bidirectional_concept<iterator>::value), "input iterator");
545
    }
546
    {
547
        using iterator = typename std::forward_list<int>::iterator;
548
        HPX_TEST_MSG(
1✔
549
            (!bidirectional_concept<iterator>::value), "forward iterator");
550
    }
551
    {
552
        using iterator = typename std::list<int>::iterator;
553
        HPX_TEST_MSG(
1✔
554
            (bidirectional_concept<iterator>::value), "bidirectional iterator");
555
    }
556
    {
557
        using iterator = typename std::vector<int>::iterator;
558
        HPX_TEST_MSG(
1✔
559
            (bidirectional_concept<iterator>::value), "random access iterator");
560
    }
561
    {
562
        using iterator = bidirectional_traversal_iterator;
563
        HPX_TEST_MSG((bidirectional_concept<iterator>::value),
1✔
564
            "bidirectional traversal input iterator");
565
    }
566
    {
567
        using iterator = random_access_traversal_iterator;
568
        HPX_TEST_MSG((bidirectional_concept<iterator>::value),
1✔
569
            "random access traversal input iterator");
570
    }
571
}
1✔
572

573
void random_access_concept_test()
1✔
574
{
575
    using namespace hpx::traits;
576
    using namespace hpx::traits::detail;
577

578
    {
579
        using iterator = std::ostream_iterator<int>;
580
        HPX_TEST_MSG(
1✔
581
            (!random_access_concept<iterator>::value), "output iterator");
582
    }
583
    {
584
        using iterator = std::istream_iterator<int>;
585
        HPX_TEST_MSG(
1✔
586
            (!random_access_concept<iterator>::value), "input iterator");
587
    }
588
    {
589
        using iterator = typename std::forward_list<int>::iterator;
590
        HPX_TEST_MSG(
1✔
591
            (!random_access_concept<iterator>::value), "forward iterator");
592
    }
593
    {
594
        using iterator = typename std::list<int>::iterator;
595
        HPX_TEST_MSG((!random_access_concept<iterator>::value),
1✔
596
            "bidirectional iterator");
597
    }
598
    {
599
        using iterator = typename std::vector<int>::iterator;
600
        HPX_TEST_MSG(
1✔
601
            (random_access_concept<iterator>::value), "random access iterator");
602
    }
603
    {
604
        using iterator = bidirectional_traversal_iterator;
605
        HPX_TEST_MSG((!random_access_concept<iterator>::value),
1✔
606
            "bidirectional traversal input iterator");
607
    }
608
    {
609
        using iterator = random_access_traversal_iterator;
610

611
        using namespace hpx::traits::detail;
612
        static_assert(std::is_same_v<iterator,
613
            addition_result_t<iterator, iter_difference_t<iterator>>>);
614
        static_assert(std::is_same_v<
615
            typename std::add_lvalue_reference<iterator>::type,
616
            inplace_addition_result_t<iterator, iter_difference_t<iterator>>>);
617
        static_assert(std::is_same_v<iterator,
618
            subtraction_result_t<iterator, iter_difference_t<iterator>>>);
619
        static_assert(std::is_same_v<iter_difference_t<iterator>,
620
            subtraction_result_t<iterator, iterator>>);
621
        static_assert(std::is_same_v<std::add_lvalue_reference_t<iterator>,
622
            inplace_subtraction_result_t<iterator,
623
                iter_difference_t<iterator>>>);
624

625
        HPX_TEST_MSG((random_access_concept<iterator>::value),
1✔
626
            "random access traversal input iterator");
627
    }
628
}
1✔
629

630
void satisfy_traversal_concept_forward_test()
1✔
631
{
632
    using namespace hpx::traits::detail;
633

634
    {
635
        using iterator = std::ostream_iterator<int>;
636
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
637
                         hpx::forward_traversal_tag>::value),
638
            "output iterator");
639
    }
640
    {
641
        using iterator = std::istream_iterator<int>;
642
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
643
                         hpx::forward_traversal_tag>::value),
644
            "input iterator");
645
    }
646
    {
647
        // see comment on definition for explanation
648
        using iterator = typename std::forward_list<int>::iterator;
649
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
650
                         hpx::forward_traversal_tag>::value),
651
            "forward iterator");
652
    }
653
    {
654
        using iterator = typename std::list<int>::iterator;
655
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
656
                         hpx::forward_traversal_tag>::value),
657
            "bidirectional iterator");
658
    }
659
    {
660
        using iterator = typename std::vector<int>::iterator;
661
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
662
                         hpx::forward_traversal_tag>::value),
663
            "random access iterator");
664
    }
665
    {
666
        using iterator = bidirectional_traversal_iterator;
667
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
668
                         hpx::forward_traversal_tag>::value),
669
            "bidirectional traversal input iterator");
670
    }
671
    {
672
        using iterator = random_access_traversal_iterator;
673
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
674
                         hpx::forward_traversal_tag>::value),
675
            "random access traversal input iterator");
676
    }
677
}
1✔
678

679
void satisfy_traversal_concept_bidirectional_test()
1✔
680
{
681
    using namespace hpx::traits::detail;
682

683
    {
684
        using iterator = std::ostream_iterator<int>;
685
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
686
                         hpx::bidirectional_traversal_tag>::value),
687
            "output iterator");
688
    }
689
    {
690
        using iterator = std::istream_iterator<int>;
691
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
692
                         hpx::bidirectional_traversal_tag>::value),
693
            "input iterator");
694
    }
695
    {
696
        using iterator = typename std::forward_list<int>::iterator;
697
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
698
                         hpx::bidirectional_traversal_tag>::value),
699
            "forward iterator");
700
    }
701
    {
702
        using iterator = typename std::list<int>::iterator;
703
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
704
                         hpx::bidirectional_traversal_tag>::value),
705
            "bidirectional iterator");
706
    }
707
    {
708
        using iterator = typename std::vector<int>::iterator;
709
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
710
                         hpx::bidirectional_traversal_tag>::value),
711
            "random access iterator");
712
    }
713
    {
714
        using iterator = bidirectional_traversal_iterator;
715
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
716
                         hpx::bidirectional_traversal_tag>::value),
717
            "bidirectional traversal input iterator");
718
    }
719
    {
720
        using iterator = random_access_traversal_iterator;
721
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
722
                         hpx::bidirectional_traversal_tag>::value),
723
            "random access traversal input iterator");
724
    }
725
}
1✔
726

727
void satisfy_traversal_concept_random_access_test()
1✔
728
{
729
    using namespace hpx::traits::detail;
730

731
    {
732
        using iterator = std::ostream_iterator<int>;
733
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
734
                         hpx::random_access_traversal_tag>::value),
735
            "output iterator");
736
    }
737
    {
738
        using iterator = std::istream_iterator<int>;
739
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
740
                         hpx::random_access_traversal_tag>::value),
741
            "input iterator");
742
    }
743
    {
744
        using iterator = typename std::forward_list<int>::iterator;
745
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
746
                         hpx::random_access_traversal_tag>::value),
747
            "forward iterator");
748
    }
749
    {
750
        using iterator = typename std::list<int>::iterator;
751
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
752
                         hpx::random_access_traversal_tag>::value),
753
            "bidirectional iterator");
754
    }
755
    {
756
        using iterator = typename std::vector<int>::iterator;
757
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
758
                         hpx::random_access_traversal_tag>::value),
759
            "random access iterator");
760
    }
761
    {
762
        using iterator = bidirectional_traversal_iterator;
763
        HPX_TEST_MSG((!satisfy_traversal_concept<iterator,
1✔
764
                         hpx::random_access_traversal_tag>::value),
765
            "bidirectional traversal input iterator");
766
    }
767
    {
768
        using iterator = random_access_traversal_iterator;
769
        HPX_TEST_MSG((satisfy_traversal_concept<iterator,
1✔
770
                         hpx::random_access_traversal_tag>::value),
771
            "random access traversal input iterator");
772
    }
773
}
1✔
774

775
void is_iterator_test()
1✔
776
{
777
    using hpx::traits::is_iterator;
778

779
    {
780
        using iterator = std::ostream_iterator<int>;
781
        HPX_TEST_MSG((is_iterator<iterator>::value), "output iterator");
1✔
782
    }
783
    {
784
        using iterator = std::istream_iterator<int>;
785
        HPX_TEST_MSG((is_iterator<iterator>::value), "input iterator");
1✔
786
    }
787
    {
788
        using iterator = typename std::forward_list<int>::iterator;
789
        HPX_TEST_MSG((is_iterator<iterator>::value), "forward iterator");
1✔
790
    }
791
    {
792
        using iterator = typename std::list<int>::iterator;
793
        HPX_TEST_MSG((is_iterator<iterator>::value), "bidirectional iterator");
1✔
794
    }
795
    {
796
        using iterator = typename std::vector<int>::iterator;
797
        HPX_TEST_MSG((is_iterator<iterator>::value), "random access iterator");
1✔
798
    }
799
    {
800
        using iterator = bidirectional_traversal_iterator;
801
        HPX_TEST_MSG((is_iterator<iterator>::value),
1✔
802
            "bidirectional traversal input iterator");
803
    }
804
    {
805
        using iterator = random_access_traversal_iterator;
806
        HPX_TEST_MSG((is_iterator<iterator>::value),
1✔
807
            "random access traversal input iterator");
808
    }
809
}
1✔
810

811
void is_output_iterator_test()
×
812
{
813
    using hpx::traits::is_output_iterator;
814

815
    {
816
        using iterator = std::ostream_iterator<int>;
817
        HPX_TEST_MSG((is_output_iterator<iterator>::value), "output iterator");
×
818
    }
819
    {
820
        using iterator = std::istream_iterator<int>;
821
        HPX_TEST_MSG((!is_output_iterator<iterator>::value), "input iterator");
×
822
    }
823
    {
824
        using iterator = typename std::forward_list<int>::iterator;
825
        HPX_TEST_MSG((is_output_iterator<iterator>::value), "forward iterator");
×
826
    }
827
    {
828
        using iterator = typename std::list<int>::iterator;
829
        HPX_TEST_MSG(
×
830
            (is_output_iterator<iterator>::value), "bidirectional iterator");
831
    }
832
    {
833
        using iterator = typename std::vector<int>::iterator;
834
        HPX_TEST_MSG(
×
835
            (is_output_iterator<iterator>::value), "random access iterator");
836
    }
837
    {
838
        using iterator = bidirectional_traversal_iterator;
839
        HPX_TEST_MSG((is_output_iterator<iterator>::value),
×
840
            "bidirectional traversal input iterator");
841
    }
842
    {
843
        using iterator = random_access_traversal_iterator;
844
        HPX_TEST_MSG((is_output_iterator<iterator>::value),
×
845
            "random access traversal input iterator");
846
    }
847
}
×
848

849
void is_input_iterator_test()
×
850
{
851
    using hpx::traits::is_input_iterator;
852

853
    {
854
        using iterator = std::ostream_iterator<int>;
855
        HPX_TEST_MSG((!is_input_iterator<iterator>::value), "output iterator");
×
856
    }
857
    {
858
        using iterator = std::istream_iterator<int>;
859
        HPX_TEST_MSG((is_input_iterator<iterator>::value), "input iterator");
×
860
    }
861
    {
862
        using iterator = typename std::forward_list<int>::iterator;
863
        HPX_TEST_MSG((is_input_iterator<iterator>::value), "forward iterator");
×
864
    }
865
    {
866
        using iterator = typename std::list<int>::iterator;
867
        HPX_TEST_MSG(
×
868
            (is_input_iterator<iterator>::value), "bidirectional iterator");
869
    }
870
    {
871
        using iterator = typename std::vector<int>::iterator;
872
        HPX_TEST_MSG(
×
873
            (is_input_iterator<iterator>::value), "random access iterator");
874
    }
875
    {
876
        using iterator = bidirectional_traversal_iterator;
877
        HPX_TEST_MSG((is_input_iterator<iterator>::value),
×
878
            "bidirectional traversal input iterator");
879
    }
880
    {
881
        using iterator = random_access_traversal_iterator;
882
        HPX_TEST_MSG((is_input_iterator<iterator>::value),
×
883
            "random access traversal input iterator");
884
    }
885
    {
886
        using base_iterator = std::vector<std::size_t>::iterator;
887
        using iterator =
888
            test::test_iterator<base_iterator, std::random_access_iterator_tag>;
889

890
        HPX_TEST_MSG((is_input_iterator<iterator>::value), "hpx test iterator");
×
891
    }
892
    {
893
        using base_iterator = std::vector<std::size_t>::iterator;
894
        using iterator =
895
            test::test_iterator<base_iterator, std::bidirectional_iterator_tag>;
896

897
        HPX_TEST_MSG((is_input_iterator<iterator>::value), "hpx test iterator");
×
898
    }
899
    {
900
        using base_iterator = std::vector<std::size_t>::iterator;
901
        using iterator =
902
            test::test_iterator<base_iterator, std::forward_iterator_tag>;
903

904
        HPX_TEST_MSG((is_input_iterator<iterator>::value), "hpx test iterator");
×
905
    }
906
    {
907
        using base_iterator = std::vector<std::size_t>::iterator;
908
        using iterator =
909
            test::test_iterator<base_iterator, std::input_iterator_tag>;
910

911
        HPX_TEST_MSG((is_input_iterator<iterator>::value), "hpx test iterator");
×
912
    }
913
}
×
914

915
void is_forward_iterator_test()
1✔
916
{
917
    using hpx::traits::is_forward_iterator;
918

919
    {
920
        using iterator = std::ostream_iterator<int>;
921
        HPX_TEST_MSG(
1✔
922
            (!is_forward_iterator<iterator>::value), "output iterator");
923
    }
924
    {
925
        using iterator = std::istream_iterator<int>;
926
        HPX_TEST_MSG((!is_forward_iterator<iterator>::value), "input iterator");
1✔
927
    }
928
    {
929
        using iterator = typename std::forward_list<int>::iterator;
930
        HPX_TEST_MSG(
1✔
931
            (is_forward_iterator<iterator>::value), "forward iterator");
932
    }
933
    {
934
        using iterator = typename std::list<int>::iterator;
935
        HPX_TEST_MSG(
1✔
936
            (is_forward_iterator<iterator>::value), "bidirectional iterator");
937
    }
938
    {
939
        using iterator = typename std::vector<int>::iterator;
940
        HPX_TEST_MSG(
1✔
941
            (is_forward_iterator<iterator>::value), "random access iterator");
942
    }
943
    {
944
        using iterator = bidirectional_traversal_iterator;
945
        HPX_TEST_MSG((is_forward_iterator<iterator>::value),
1✔
946
            "bidirectional traversal input iterator");
947
    }
948
    {
949
        using iterator = random_access_traversal_iterator;
950
        HPX_TEST_MSG((is_forward_iterator<iterator>::value),
1✔
951
            "random access traversal input iterator");
952
    }
953
    {
954
        using base_iterator = std::vector<std::size_t>::iterator;
955
        using iterator =
956
            test::test_iterator<base_iterator, std::random_access_iterator_tag>;
957

958
        HPX_TEST_MSG(
1✔
959
            (is_forward_iterator<iterator>::value), "hpx test iterator");
960
    }
961
    {
962
        using base_iterator = std::vector<std::size_t>::iterator;
963
        using iterator =
964
            test::test_iterator<base_iterator, std::bidirectional_iterator_tag>;
965

966
        HPX_TEST_MSG(
1✔
967
            (is_forward_iterator<iterator>::value), "hpx test iterator");
968
    }
969
    {
970
        using base_iterator = std::vector<std::size_t>::iterator;
971
        using iterator =
972
            test::test_iterator<base_iterator, std::forward_iterator_tag>;
973

974
        HPX_TEST_MSG(
1✔
975
            (is_forward_iterator<iterator>::value), "hpx test iterator");
976
    }
977
    {
978
        using base_iterator = std::vector<std::size_t>::iterator;
979
        using iterator =
980
            test::test_iterator<base_iterator, std::input_iterator_tag>;
981

982
        HPX_TEST_MSG(
1✔
983
            (!is_forward_iterator<iterator>::value), "hpx test iterator");
984
    }
985
}
1✔
986

987
void is_bidirectional_iterator_test()
1✔
988
{
989
    using hpx::traits::is_bidirectional_iterator;
990

991
    {
992
        using iterator = std::ostream_iterator<int>;
993
        HPX_TEST_MSG(
1✔
994
            (!is_bidirectional_iterator<iterator>::value), "output iterator");
995
    }
996
    {
997
        using iterator = std::istream_iterator<int>;
998
        HPX_TEST_MSG(
1✔
999
            (!is_bidirectional_iterator<iterator>::value), "input iterator");
1000
    }
1001
    {
1002
        using iterator = typename std::forward_list<int>::iterator;
1003
        HPX_TEST_MSG(
1✔
1004
            (!is_bidirectional_iterator<iterator>::value), "forward iterator");
1005
    }
1006
    {
1007
        using iterator = typename std::list<int>::iterator;
1008
        HPX_TEST_MSG((is_bidirectional_iterator<iterator>::value),
1✔
1009
            "bidirectional iterator");
1010
    }
1011
    {
1012
        using iterator = typename std::vector<int>::iterator;
1013
        HPX_TEST_MSG((is_bidirectional_iterator<iterator>::value),
1✔
1014
            "random access iterator");
1015
    }
1016
    {
1017
        using iterator = bidirectional_traversal_iterator;
1018
        HPX_TEST_MSG((is_bidirectional_iterator<iterator>::value),
1✔
1019
            "bidirectional traversal input iterator");
1020
    }
1021
    {
1022
        using iterator = random_access_traversal_iterator;
1023
        HPX_TEST_MSG((is_bidirectional_iterator<iterator>::value),
1✔
1024
            "random access traversal input iterator");
1025
    }
1026
    {
1027
        using base_iterator = std::vector<std::size_t>::iterator;
1028
        using iterator =
1029
            test::test_iterator<base_iterator, std::random_access_iterator_tag>;
1030

1031
        HPX_TEST_MSG(
1✔
1032
            (is_bidirectional_iterator<iterator>::value), "hpx test iterator");
1033
    }
1034
    {
1035
        using base_iterator = std::vector<std::size_t>::iterator;
1036
        using iterator =
1037
            test::test_iterator<base_iterator, std::bidirectional_iterator_tag>;
1038

1039
        HPX_TEST_MSG(
1✔
1040
            (is_bidirectional_iterator<iterator>::value), "hpx test iterator");
1041
    }
1042
    {
1043
        using base_iterator = std::vector<std::size_t>::iterator;
1044
        using iterator =
1045
            test::test_iterator<base_iterator, std::forward_iterator_tag>;
1046

1047
        HPX_TEST_MSG(
1✔
1048
            (!is_bidirectional_iterator<iterator>::value), "hpx test iterator");
1049
    }
1050
    {
1051
        using base_iterator = std::vector<std::size_t>::iterator;
1052
        using iterator =
1053
            test::test_iterator<base_iterator, std::input_iterator_tag>;
1054

1055
        HPX_TEST_MSG(
1✔
1056
            (!is_bidirectional_iterator<iterator>::value), "hpx test iterator");
1057
    }
1058
}
1✔
1059

1060
void is_random_access_iterator_test()
1✔
1061
{
1062
    using hpx::traits::is_random_access_iterator;
1063

1064
    {
1065
        using iterator = std::ostream_iterator<int>;
1066
        HPX_TEST_MSG(
1✔
1067
            (!is_random_access_iterator<iterator>::value), "output iterator");
1068
    }
1069
    {
1070
        using iterator = std::istream_iterator<int>;
1071
        HPX_TEST_MSG(
1✔
1072
            (!is_random_access_iterator<iterator>::value), "input iterator");
1073
    }
1074
    {
1075
        using iterator = typename std::forward_list<int>::iterator;
1076
        HPX_TEST_MSG(
1✔
1077
            (!is_random_access_iterator<iterator>::value), "forward iterator");
1078
    }
1079
    {
1080
        using iterator = typename std::list<int>::iterator;
1081
        HPX_TEST_MSG((!is_random_access_iterator<iterator>::value),
1✔
1082
            "bidirectional iterator");
1083
    }
1084
    {
1085
        using iterator = typename std::vector<int>::iterator;
1086
        HPX_TEST_MSG((is_random_access_iterator<iterator>::value),
1✔
1087
            "random access iterator");
1088
    }
1089
    {
1090
        using iterator = bidirectional_traversal_iterator;
1091
        HPX_TEST_MSG((!is_random_access_iterator<iterator>::value),
1✔
1092
            "bidirectional traversal input iterator");
1093
    }
1094
    {
1095
        using iterator = random_access_traversal_iterator;
1096
        HPX_TEST_MSG((is_random_access_iterator<iterator>::value),
1✔
1097
            "random access traversal input iterator");
1098
    }
1099
    {
1100
        using base_iterator = std::vector<std::size_t>::iterator;
1101
        using iterator =
1102
            test::test_iterator<base_iterator, std::random_access_iterator_tag>;
1103

1104
        HPX_TEST_MSG(
1✔
1105
            (is_random_access_iterator<iterator>::value), "hpx test iterator");
1106
    }
1107
    {
1108
        using base_iterator = std::vector<std::size_t>::iterator;
1109
        using iterator =
1110
            test::test_iterator<base_iterator, std::bidirectional_iterator_tag>;
1111

1112
        HPX_TEST_MSG(
1✔
1113
            (!is_random_access_iterator<iterator>::value), "hpx test iterator");
1114
    }
1115
    {
1116
        using base_iterator = std::vector<std::size_t>::iterator;
1117
        using iterator =
1118
            test::test_iterator<base_iterator, std::forward_iterator_tag>;
1119

1120
        HPX_TEST_MSG(
1✔
1121
            (!is_random_access_iterator<iterator>::value), "hpx test iterator");
1122
    }
1123
    {
1124
        using base_iterator = std::vector<std::size_t>::iterator;
1125
        using iterator =
1126
            test::test_iterator<base_iterator, std::input_iterator_tag>;
1127

1128
        HPX_TEST_MSG(
1✔
1129
            (!is_random_access_iterator<iterator>::value), "hpx test iterator");
1130
    }
1131
}
1✔
1132

1133
///////////////////////////////////////////////////////////////////////////////
1134
int main()
1✔
1135
{
1136
    {
1137
        addition_result_test();
1✔
1138
        dereference_result_test();
1✔
1139
        equality_result_test();
1✔
1140
        inequality_result_test();
1✔
1141
        inplace_addition_result_test();
1✔
1142
        inplace_subtraction_result_test();
1✔
1143
        predecrement_result_test();
1✔
1144
        preincrement_result_test();
1✔
1145
        postdecrement_result_test();
1✔
1146
        postincrement_result_test();
1✔
1147
        subscript_result_test();
1✔
1148
        subtraction_result_test();
1✔
1149
        bidirectional_concept_test();
1✔
1150
        random_access_concept_test();
1✔
1151
        satisfy_traversal_concept_forward_test();
1✔
1152
        satisfy_traversal_concept_bidirectional_test();
1✔
1153
        satisfy_traversal_concept_random_access_test();
1✔
1154
        is_iterator_test();
1✔
1155
        is_forward_iterator_test();
1✔
1156
        is_bidirectional_iterator_test();
1✔
1157
        is_random_access_iterator_test();
1✔
1158
    }
1159

1160
    return hpx::util::report_errors();
1✔
1161
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc