Distributed Ranges
Loading...
Searching...
No Matches
onedpl_direct_iterator.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <iterator>
8
9#include <dr/detail/iterator_adaptor.hpp>
10
11namespace dr {
12
13namespace __detail {
14
15template <std::random_access_iterator Iter> class direct_iterator {
16public:
17 using value_type = std::iter_value_t<Iter>;
18 using difference_type = std::iter_difference_t<Iter>;
19 using reference = std::iter_reference_t<Iter>;
21
22 using pointer = iterator;
23
24 using iterator_category = std::random_access_iterator_tag;
25
26 using is_passed_directly = ::std::true_type;
27
28 direct_iterator(Iter iter) noexcept : iter_(iter) {}
29 direct_iterator() noexcept = default;
30 ~direct_iterator() noexcept = default;
31 direct_iterator(const direct_iterator &) noexcept = default;
32 direct_iterator &operator=(const direct_iterator &) noexcept = default;
33
34 bool operator==(const direct_iterator &) const noexcept = default;
35 bool operator!=(const direct_iterator &) const noexcept = default;
36
37 iterator operator+(difference_type offset) const noexcept {
38 return iterator(iter_ + offset);
39 }
40
41 iterator operator-(difference_type offset) const noexcept {
42 return iterator(iter_ - offset);
43 }
44
45 difference_type operator-(iterator other) const noexcept {
46 return iter_ - other.iter_;
47 }
48
49 bool operator<(iterator other) const noexcept { return iter_ < other.iter_; }
50
51 bool operator>(iterator other) const noexcept { return iter_ > iter_; }
52
53 bool operator<=(iterator other) const noexcept {
54 return iter_ <= other.iter_;
55 }
56
57 bool operator>=(iterator other) const noexcept {
58 return iter_ >= other.iter_;
59 }
60
61 iterator &operator++() noexcept {
62 ++iter_;
63 return *this;
64 }
65
66 iterator operator++(int) noexcept {
67 iterator other = *this;
68 ++(*this);
69 return other;
70 }
71
72 iterator &operator--() noexcept {
73 --iter_;
74 return *this;
75 }
76
77 iterator operator--(int) noexcept {
78 iterator other = *this;
79 --(*this);
80 return other;
81 }
82
83 iterator &operator+=(difference_type offset) noexcept {
84 iter_ += offset;
85 return *this;
86 }
87
88 iterator &operator-=(difference_type offset) noexcept {
89 iter_ -= offset;
90 return *this;
91 }
92
93 reference operator*() const noexcept { return *iter_; }
94
95 reference operator[](difference_type offset) const noexcept {
96 return reference(*(*this + offset));
97 }
98
99 friend iterator operator+(difference_type n, iterator iter) {
100 return iter.iter_ + n;
101 }
102
103 Iter base() const noexcept { return iter_; }
104
105private:
106 Iter iter_;
107};
108
109} // namespace __detail
110
111} // namespace dr
Definition: onedpl_direct_iterator.hpp:15