Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
TupleRandomIterator.h
1/*
2 * Copyright 2020 IFPEN-CEA
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * SPDX-License-Identifier: Apache-2.0
17 */
18
19#pragma once
20
21#include <boost/tuple/tuple.hpp>
22#include <iterator>
23
24/*---------------------------------------------------------------------------*/
25
26namespace Alien
27{
28template <typename Iterator>
30{
31 typedef typename Iterator::value_type value_type;
32};
33
34template <typename T>
36{
37 typedef T value_type;
38};
39
40template <typename T>
42{
43 typedef T value_type;
44};
45
46/*---------------------------------------------------------------------------*/
47
48template <typename IteratorA, typename IteratorB>
49class DualRandomIterator
50{
51 private:
52 typedef typename TupleRandomIteratorTraits<IteratorA>::value_type TypeA;
53 typedef typename TupleRandomIteratorTraits<IteratorB>::value_type TypeB;
54
55 public: // requiered typedefs (cf std::iterator)
56 typedef boost::tuple<TypeA, TypeB> value_type;
57 typedef ptrdiff_t difference_type;
58 typedef value_type* pointer;
59 typedef boost::tuple<TypeA&, TypeB&> reference;
60 typedef std::random_access_iterator_tag iterator_category;
61 typedef boost::tuple<const TypeA&, const TypeB&> const_reference;
62
63 public:
64 DualRandomIterator() {}
65 DualRandomIterator(IteratorA i, IteratorB j)
66 : m_i(i)
67 , m_j(j)
68 {}
69
70 DualRandomIterator& operator++()
71 {
72 ++m_i;
73 ++m_j;
74 return *this;
75 }
76 DualRandomIterator& operator--()
77 {
78 --m_i;
79 --m_j;
80 return *this;
81 }
82 DualRandomIterator operator++(int)
83 {
84 DualRandomIterator tmp(*this);
85 operator++();
86 return tmp;
87 }
88 DualRandomIterator operator--(int)
89 {
90 DualRandomIterator tmp(*this);
91 operator--();
92 return tmp;
93 }
94
95 bool operator==(const DualRandomIterator& rhs) const { return m_i == rhs.m_i; }
96 bool operator!=(const DualRandomIterator& rhs) const { return m_i != rhs.m_i; }
97 bool operator<(const DualRandomIterator& rhs) const { return m_i < rhs.m_i; }
98
99 reference operator*() { return reference(*m_i, *m_j); }
100
101 difference_type operator-(const DualRandomIterator& rhs) const { return m_i - rhs.m_i; }
102
103 DualRandomIterator& operator+=(const difference_type n)
104 {
105 m_i += n;
106 m_j += n;
107 return *this;
108 }
109 DualRandomIterator& operator-=(const difference_type n)
110 {
111 m_i -= n;
112 m_j -= n;
113 return *this;
114 }
115 DualRandomIterator operator+(const difference_type n) const
116 {
117 return DualRandomIterator(m_i + n, m_j + n);
118 }
119 DualRandomIterator operator-(const difference_type n) const
120 {
121 return DualRandomIterator(m_i - n, m_j - n);
122 }
123
124 private:
125 IteratorA m_i;
126 IteratorB m_j;
127};
128
129/*---------------------------------------------------------------------------*/
130
131template <typename IteratorA, typename IteratorB, typename IteratorC>
132class TripleRandomIterator
133{
134 private:
135 typedef typename TupleRandomIteratorTraits<IteratorA>::value_type TypeA;
136 typedef typename TupleRandomIteratorTraits<IteratorB>::value_type TypeB;
137 typedef typename TupleRandomIteratorTraits<IteratorC>::value_type TypeC;
138
139 public: // requiered typedefs (cf std::iterator)
140 typedef boost::tuple<TypeA, TypeB, TypeC> value_type;
141 typedef ptrdiff_t difference_type;
142 typedef value_type* pointer;
143 typedef boost::tuple<TypeA&, TypeB&, TypeC&> reference;
144 typedef std::random_access_iterator_tag iterator_category;
145 typedef boost::tuple<const TypeA&, const TypeB&, const TypeC&> const_reference;
146
147 public:
148 TripleRandomIterator() {}
149 TripleRandomIterator(IteratorA i, IteratorB j, IteratorC k)
150 : m_i(i)
151 , m_j(j)
152 , m_k(k)
153 {}
154
155 TripleRandomIterator& operator++()
156 {
157 ++m_i;
158 ++m_j;
159 ++m_k;
160 return *this;
161 }
162 TripleRandomIterator& operator--()
163 {
164 --m_i;
165 --m_j;
166 --m_k;
167 return *this;
168 }
169 TripleRandomIterator operator++(int)
170 {
171 TripleRandomIterator tmp(*this);
172 operator++();
173 return tmp;
174 }
175 TripleRandomIterator operator--(int)
176 {
177 TripleRandomIterator tmp(*this);
178 operator--();
179 return tmp;
180 }
181
182 bool operator==(const TripleRandomIterator& rhs) const { return m_i == rhs.m_i; }
183 bool operator!=(const TripleRandomIterator& rhs) const { return m_i != rhs.m_i; }
184 bool operator<(const TripleRandomIterator& rhs) const { return m_i < rhs.m_i; }
185
186 reference operator*() { return reference(*m_i, *m_j, *m_k); }
187
188 difference_type operator-(const TripleRandomIterator& rhs) const
189 {
190 return m_i - rhs.m_i;
191 }
192
193 TripleRandomIterator& operator+=(const difference_type n)
194 {
195 m_i += n;
196 m_j += n;
197 m_k += n;
198 return *this;
199 }
200 TripleRandomIterator& operator-=(const difference_type n)
201 {
202 m_i -= n;
203 m_j -= n;
204 m_k -= n;
205 return *this;
206 }
207 TripleRandomIterator operator+(const difference_type n) const
208 {
209 return TripleRandomIterator(m_i + n, m_j + n, m_k + n);
210 }
211 TripleRandomIterator operator-(const difference_type n) const
212 {
213 return TripleRandomIterator(m_i - n, m_j - n, m_k - n);
214 }
215
216 private:
217 IteratorA m_i;
218 IteratorB m_j;
219 IteratorC m_k;
220};
221
222/*---------------------------------------------------------------------------*/
223
224template <typename TupleIteratorT>
226{
227 bool operator()(const typename TupleIteratorT::const_reference& a,
228 const typename TupleIteratorT::const_reference& b) const
229 {
230 return boost::get<0>(a) < boost::get<0>(b);
231 }
232};
233
234/*---------------------------------------------------------------------------*/
235
236#if 0 // EMBEDDED TEST
237
238#include <boost/tuple/tuple_io.hpp> // pour l'affichage
239#include <iostream>
240#include <list>
241#include <vector>
242
243int main() {
244 int n = 9;
245
246 std::vector<int> a(n);
247 typedef std::vector<int>::iterator IteratorA;
248 for(int i=0;i<n;++i) a[i] = std::abs(n/2-2*i);
249 std::vector<double> b(n);
250 typedef std::vector<double>::iterator IteratorB;
251 for(int i=0;i<n;++i) b[i] = std::abs(n/2-2*i) + 0.5;
252 std::vector<double> c(n);
253 typedef std::vector<double>::iterator IteratorC;
254 for(IteratorC i=c.begin(); i!=c.end();++i) *i = std::abs(n/2-2*std::distance(c.begin(),i)) + 0.5;
255
256// typedef DualRandomIterator<IteratorA, IteratorB> TupleIterator;
257// TupleIterator begin(a.begin(), b.begin());
258// TupleIterator end(a.end(), b.end());
259// FirstIndexComparator<TupleIterator> comparator;
260
262 TupleIterator begin(c.begin(), a.begin(), b.begin());
263 TupleIterator end(c.end(), a.end(), b.end());
265
266 std::sort(begin, end, comparator);
267
268 for(TupleIterator i(begin), ie(end);i!=ie;++i)
269 std::cout << *i << std::endl;
270
271 for(int i=0;i<n;++i)
272 std::cout << "#" << i << " : " << a[i] << " " << b[i] << std::endl;
273
274 TupleIterator finder1 = std::lower_bound(begin, end,
275 TupleIterator::value_type(1,1,1),
276 comparator);
277 std::cout << "Finder1 is " << (*finder1) << "\n";
278
279 TupleIterator finder2 = std::lower_bound(begin, end,
280 TupleIterator::value_type(3,1,1),
281 comparator);
282 std::cout << "Finder2 is " << (*finder2) << "\n";
283}
284#endif /* EMBEDDED TEST */
285
286} // namespace Alien
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17