sparrow 0.3.0
Loading...
Searching...
No Matches
layout_iterator.hpp
Go to the documentation of this file.
1// Copyright 2024 Man Group Operations Limited
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
18
19namespace sparrow
20{
24 template <class T>
25 concept iterator_types = requires {
26 typename T::value_type;
27 typename T::reference;
28 typename T::value_iterator;
29 typename T::bitmap_iterator;
30 typename T::iterator_tag;
31 };
32
39 template <iterator_types Iterator_types>
41 layout_iterator<Iterator_types>,
42 typename Iterator_types::value_type,
43 typename Iterator_types::iterator_tag,
44 typename Iterator_types::reference>
45 {
46 public:
47
51 typename Iterator_types::value_type,
52 typename Iterator_types::iterator_tag,
53 typename Iterator_types::reference>;
54
55 using reference = typename base_type::reference;
56 using difference_type = typename base_type::difference_type;
57
58 using value_iterator = Iterator_types::value_iterator;
59
60 using bitmap_iterator = Iterator_types::bitmap_iterator;
61
62 layout_iterator() noexcept = default;
64
65 private:
66
67 [[nodiscard]] reference dereference() const;
68 [[nodiscard]] reference dereference();
69 void increment();
70 void decrement();
71 void advance(difference_type n);
72 [[nodiscard]] difference_type distance_to(const self_type& rhs) const;
73 [[nodiscard]] bool equal(const self_type& rhs) const;
74 [[nodiscard]] bool less_than(const self_type& rhs) const;
75
76 value_iterator m_value_iter;
77 bitmap_iterator m_bitmap_iter;
78
79 friend class iterator_access;
80 };
81
82 /**********************************
83 * layout_iterator implementation *
84 **********************************/
85
86 template <iterator_types Iterator_types>
87 layout_iterator<Iterator_types>::layout_iterator(value_iterator value_iter, bitmap_iterator bitmap_iter)
88 : m_value_iter(value_iter)
89 , m_bitmap_iter(bitmap_iter)
90 {
91 }
92
93 template <iterator_types Iterator_types>
94 auto layout_iterator<Iterator_types>::dereference() const -> reference
95 {
96 return reference(*m_value_iter, *m_bitmap_iter);
97 }
98
99 template <iterator_types Iterator_types>
100 auto layout_iterator<Iterator_types>::dereference() -> reference
101 {
102 return reference(*m_value_iter, *m_bitmap_iter);
103 }
104
105 template <iterator_types Iterator_types>
107 {
108 ++m_value_iter;
109 ++m_bitmap_iter;
110 }
111
112 template <iterator_types Iterator_types>
114 {
115 --m_value_iter;
116 --m_bitmap_iter;
117 }
118
119 template <iterator_types Iterator_types>
121 {
122 m_value_iter += n;
123 m_bitmap_iter += n;
124 }
125
126 template <iterator_types Iterator_types>
128 {
129 return rhs.m_value_iter - m_value_iter;
130 }
131
132 template <iterator_types Iterator_types>
134 {
135 return m_value_iter == rhs.m_value_iter && m_bitmap_iter == rhs.m_bitmap_iter;
136 }
137
138 template <iterator_types Iterator_types>
140 {
141 return m_value_iter < rhs.m_value_iter && m_bitmap_iter < rhs.m_bitmap_iter;
142 }
143}
typename base_type::difference_type difference_type
layout_iterator< Iterator_types > self_type
Iterator_types::bitmap_iterator bitmap_iterator
typename base_type::reference reference
Iterator_types::value_iterator value_iterator
layout_iterator() noexcept=default
iterator_base< self_type, typename Iterator_types::value_type, typename Iterator_types::iterator_tag, typename Iterator_types::reference > base_type
Concept for iterator types.