RTI Routing Service Version 7.6.0
SampleIterator.hpp
1/* $Id$
2
3(c) Copyright, Real-Time Innovations, 2014-2016.
4All rights reserved.
5
6No duplications, whole or partial, manual or electronic, may be made
7without express written permission. Any such copies, or
8revisions thereof, must display this notice unaltered.
9This code contains trade secrets of Real-Time Innovations, Inc.
10
11
12modification history
13--------------------
141.0a,05may14,acr Added ValidSampleIterator and valid_samples helper
151.0a,20mar13,acr Created
16============================================================================= */
17
18#ifndef RTI_ROUTING_PROCESSOR_SAMPLE_ITERATOR_HPP_
19 #define RTI_ROUTING_PROCESSOR_SAMPLE_ITERATOR_HPP_
20
21
22 #include <rti/routing/processor/LoanedSample.hpp>
23 #include <exception>
24
25namespace rti {
26namespace routing {
27namespace processor {
28
29/*i
30 * @brief Tag type to emulate/indicate that sample infos are not available
31 */
32struct no_sample_info_t {
33};
34
43template <typename T, typename U>
45public:
46 // iterator traits
47 using iterator_category = std::random_access_iterator_tag;
48 using value_type = const LoanedSample<T, U>;
49 using reference = value_type;
50 using pointer = value_type;
51 using difference_type = std::size_t;
52 using SampleSeqType = RTI_RoutingServiceSample*;
53 using InfoSeqType = RTI_RoutingServiceSampleInfo*;
54
55private:
56 static no_sample_info_t *_null_info_scrachtpad[1];
57 static InfoSeqType _null_info_seq;
58 static difference_type _null_info_pos;
59
60public:
62 : _sample_seq(0),
63 _info_seq(0),
64 _length(0),
65 _pos(0),
66 _info_pos(_pos)
67 {
68 }
69
71 const SampleSeqType sample_seq,
72 const InfoSeqType info_seq,
73 int length,
74 int position = 0)
75 : _sample_seq(sample_seq),
76 _info_seq(info_seq == NULL ? _null_info_seq : info_seq),
77 _length(length),
78 _info_pos(info_seq == NULL ? _null_info_pos : _pos)
79 {
80 if (position < 0) {
81 throw dds::core::IllegalOperationError("SampleIterator out of range");
82 }
83
84 _pos = static_cast<difference_type>(position);
85 }
86
88 : _sample_seq(other._sample_seq),
89 _info_seq(other._info_seq),
90 _length(other._length),
91 _pos(other._pos),
92 _info_pos(other._info_pos)
93 {
94 }
95
96 SampleIterator & operator=(const SampleIterator<T, U> & other)
97 {
98 _sample_seq = other._sample_seq;
99 _info_seq = other._info_seq;
100 _length = other._length;
101 _pos = other._pos;
102 _info_pos = other._info_pos;
103
104 return *this;
105 }
106
107 value_type operator*() const
108 {
109 return value_type(_sample_seq[_pos], _info_seq[_info_pos]);
110 }
111
112 value_type operator->() const
113 {
114 return value_type(_sample_seq[_pos], _info_seq[_info_pos]);
115 }
116
117 value_type operator[](difference_type offset) const
118 {
119 return (_info_seq == _null_info_seq)
120 ? value_type(_sample_seq[_pos], NULL)
121 : value_type(_sample_seq[_pos + offset], _info_seq[_info_pos + offset]);
122 }
123
124/*
125 * Windows defines min and max in one of the Windows headers, and they
126 * collide with the max() definition we use below
127 */
128#ifdef RTI_WIN32
129#undef max
130#undef min
131#endif
132 SampleIterator & operator++()
133 {
134 if (_pos == std::numeric_limits<difference_type>::max()) {
135 throw dds::core::IllegalOperationError("SampleIterator out of range");
136 }
137
138 ++_pos;
139 return *this;
140 }
141
142 SampleIterator operator++(int)
143 {
144 SampleIterator temp(*this);
145 ++(*this);
146 return temp;
147 }
148
149 SampleIterator & operator--()
150 {
151 if (_pos == std::numeric_limits<difference_type>::min()) {
152 throw dds::core::IllegalOperationError("SampleIterator out of range");
153 }
154
155 --_pos;
156 return *this;
157 }
158
159 SampleIterator operator--(int)
160 {
161 SampleIterator temp(*this);
162 --(*this);
163 return temp;
164 }
165
166 SampleIterator & operator-=(difference_type i)
167 {
168 if (i > _pos) {
169 throw dds::core::IllegalOperationError("SampleIterator out of range");
170 }
171
172 _pos -= i;
173 return *this;
174 }
175
176 SampleIterator & operator+=(difference_type i)
177 {
178 if ((std::numeric_limits<difference_type>::max() - _pos) < i) {
179 throw dds::core::IllegalOperationError("SampleIterator out of range");
180 }
181
182 _pos += i;
183 return *this;
184 }
185
186 friend SampleIterator operator-(
187 const SampleIterator& si,
188 difference_type i)
189 {
190 SampleIterator temp(si);
191 temp -= i;
192 return temp;
193 }
194
195 friend SampleIterator operator+(
196 const SampleIterator& si,
197 difference_type i)
198 {
199 SampleIterator temp(si);
200 temp += i;
201 return temp;
202 }
203
204 friend difference_type operator-(
205 const SampleIterator& s1,
206 const SampleIterator& s2)
207 {
208 return s1._pos - s2._pos;
209 }
210
211 friend bool operator<(const SampleIterator & s1,
212 const SampleIterator & s2)
213 {
214 return s1._pos < s2._pos;
215 }
216
217 friend bool operator>(const SampleIterator & s1,
218 const SampleIterator & s2)
219 {
220 return s1._pos > s2._pos;
221 }
222
223 friend bool operator<=(const SampleIterator & s1,
224 const SampleIterator & s2)
225 {
226 return s1._pos <= s2._pos;
227 }
228
229 friend bool operator>=(const SampleIterator & s1,
230 const SampleIterator & s2)
231 {
232 return s1._pos >= s2._pos;
233 }
234
235 friend bool operator==(const SampleIterator & s1,
236 const SampleIterator & s2)
237 {
238 return (s1._sample_seq == s2._sample_seq) && (s1._pos == s2._pos);
239 }
240
241 friend bool operator!=(const SampleIterator & s1,
242 const SampleIterator & s2)
243 {
244 return !(s1 == s2);
245 }
246
247 bool is_end() const
248 {
249 return (_length == _pos);
250 }
251
252 // Keep these members public otherwise some of the
253 // converting constructors will not compile.
254public:
255 SampleSeqType _sample_seq;
256 InfoSeqType _info_seq;
257 int _length;
258 difference_type _pos;
259 difference_type& _info_pos;
260};
261
262
263template <typename T, typename U>
265
266template <typename T, typename U>
267no_sample_info_t * SampleIterator<T, U>::_null_info_scrachtpad[1] = {NULL};
268
269template <typename T, typename U>
270typename SampleIterator<T, U>::InfoSeqType SampleIterator<T, U>::_null_info_seq =
271reinterpret_cast<InfoSeqType> (SampleIterator<T, U>::_null_info_scrachtpad);
272
273} } }
274
275#endif // RTI_ROUTING_PROCESSOR_SAMPLE_ITERATOR_HPP_
A random-access iterator of LoanedSample.
Definition: SampleIterator.hpp:44