Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JPipe.hh
Go to the documentation of this file.
1#ifndef __JLANG__JPIPE__
2#define __JLANG__JPIPE__
3
4#include "JLang/JType.hh"
5#include "JLang/JTypeList.hh"
6#include "JLang/JNullType.hh"
7#include "JLang/JValve.hh"
9#include "JLang/JRegulator.hh"
12
13
14/**
15 * \file
16 *
17 * Implementation of pipe operation for object iterators.
18 * \author mdejong
19 */
20
21namespace JLANG {
22
23 /**
24 * Auxiliary class for object iteration via pipe, i.e.\ operator:
25 * <pre>
26 * .. | ..
27 * </pre>
28 *
29 * A pipe consists of an object iterator, a valve, an object selector and a common regulator.\n
30 * The objects are first passed through a valve which can be opened and closed.\n
31 * The object selector can be used to filter specific objects/values.\n
32 * Finally, the regulator can be used to control the throughput.
33 *
34 * This class implements the JLANG::JObjectIterator interface.
35 */
36 template<class T>
37 class JPipe :
38 public virtual JObjectIterator<T>
39 {
40 public:
41
43
44 /**
45 * Constructor.
46 *
47 * \param input object iterator
48 * \param valve valve
49 * \param selector object selector
50 * \param regulator regulator
51 */
53 const JValve<T>& valve,
55 const JRegulator& regulator) :
56 in (input),
57 valve (valve),
60 {}
61
62
63 /**
64 * Check availability of next element.
65 *
66 * \return true if the iteration has more elements; else false
67 */
68 virtual bool hasNext() override
69 {
70 if (!p.is_valid()) {
71
72 if (valve.is_open()) {
73
74 while (in.hasNext()) {
75
76 p = in.next();
77
78 if (selector.accept(*p)) {
79
80 if (regulator.accept()) {
81 return true;
82 }
83 }
84 }
85 }
86
87 p = NULL; // invalid pointer for next round
88
89 return false;
90
91 } else {
92
93 return true;
94 }
95 }
96
97
98 /**
99 * Get next element.
100 *
101 * \return pointer to element
102 */
103 virtual const pointer_type& next() override
104 {
105 ps = p;
106
107 p.reset();
108
109 return ps;
110 }
111
112
113 /**
114 * Skip items.
115 *
116 * \param ns number of items to skip
117 * \return number of items skipped
118 */
119 virtual skip_type skip(const skip_type ns) override
120 {
121 return in.skip(ns);
122 }
123
124
125 protected:
130
131 private:
134 };
135
136
137 /**
138 * Implementation of object iterator for multiple data types.
139 *
140 * This class recursively defines the JLANG::JObjectIterator interface
141 * for all data types by deriving from:
142 * - JPipe<JHead_t>; and
143 * - JPipe<JTail_t>.
144 */
145 template<class JHead_t, class JTail_t>
146 class JPipe< JTypeList<JHead_t, JTail_t> > :
147 public JPipe<JHead_t>,
148 public JPipe<JTail_t>,
149 public virtual JObjectIterator< JTypeList<JHead_t, JTail_t> >
150 {
151 public:
153
154 /**
155 * Constructor.
156 *
157 * \param input object iterator
158 * \param valve valve
159 * \param selector object selector
160 * \param regulator regulator
161 */
163 const JValve<typelist>& valve,
165 const JRegulator& regulator) :
166 JPipe<JHead_t>(input, valve, selector, regulator),
167 JPipe<JTail_t>(input, valve, selector, regulator)
168 {}
169 };
170
171
172 /**
173 * Terminator class of recursive JPipe class.
174 */
175 template<class JHead_t>
176 class JPipe< JTypeList<JHead_t, JNullType> > :
177 public JPipe<JHead_t>
178 {
179 public:
180 /**
181 * Constructor.
182 *
183 * \param input object iterator
184 * \param valve valve
185 * \param selector object selector
186 * \param regulator regulator
187 */
189 const JValve<JHead_t>& valve,
191 const JRegulator& regulator) :
192 JPipe<JHead_t>(input, valve, selector, regulator)
193 {}
194 };
195
196
197 /**
198 * Auxiliary class for object iteration via multiple pipes, e.g.\ operator:
199 * <pre>
200 * .. | .. | ..
201 * </pre>
202 */
203 template<class T, int N>
205 public JPipe<T>
206 {
207 public:
208 /**
209 * Constructor.
210 *
211 * \param input object iterator
212 */
214 JPipe<T>(input, JValve<T>::getDefault(), JObjectSelector<T>::getDefault(), JRegulator::getDefault())
215 {}
216
217
218 /**
219 * Constructor.
220 *
221 * \param input object iterator
222 * \param valve valve
223 */
225 const JValve<T>& valve) :
226 JPipe<T>(input, valve, JObjectSelector<T>::getDefault(), JRegulator::getDefault())
227 {}
228
229
230 /**
231 * Constructor.
232 *
233 * \param input object iterator
234 * \param selector object selector
235 */
238 JPipe<T>(input, JValve<T>::getDefault(), selector, JRegulator::getDefault())
239 {}
240
241
242 /**
243 * Constructor.
244 *
245 * \param input object iterator
246 * \param regulator regulator
247 */
249 const JRegulator& regulator) :
250 JPipe<T>(input, JValve<T>::getDefault(), JObjectSelector<T>::getDefault(), regulator)
251 {}
252
253
254 /**
255 * Constructor.
256 *
257 * \param input object iterator
258 * \param valve valve
259 * \param selector object selector
260 * \param regulator regulator
261 */
263 const JValve<T>& valve,
265 const JRegulator& regulator) :
266 JPipe<T>(input, valve, selector, regulator)
267 {}
268
269
270 /**
271 * Pipe terminator.
272 *
273 * \param left pipe
274 * \param right object output
275 */
276 friend inline void operator|(JMultiPipe& left, JObjectOutput<T>& right)
277 {
278 left >> right;
279 }
280
281
282 /**
283 * Recursive expansion of multi-pipe.
284 *
285 * \param left multi-pipe
286 * \param right object valve
287 * \return multi-pipe
288 */
289 friend inline JMultiPipe<T, N+1>& operator|(JMultiPipe& left, const JValve<T>& right)
290 {
291 JMultiPipe<T, N+1>::pipe.reset(new JMultiPipe<T, N+1>(left, right));
292
294 }
295
296
297 /**
298 * Recursive expansion of multi-pipe.
299 *
300 * \param left multi-pipe
301 * \param right object selector
302 * \return multi-pipe
303 */
304 friend inline JMultiPipe<T, N+1>& operator|(JMultiPipe& left, const JObjectSelector<T>& right)
305 {
306 JMultiPipe<T, N+1>::pipe.reset(new JMultiPipe<T, N+1>(left, right));
307
309 }
310
311
312 /**
313 * Recursive expansion of multi-pipe.
314 *
315 * \param left multi-pipe
316 * \param right regulator
317 * \return multi-pipe
318 */
319 friend inline JMultiPipe<T, N+1>& operator|(JMultiPipe& left, const JRegulator& right)
320 {
321 JMultiPipe<T, N+1>::pipe.reset(new JMultiPipe<T, N+1>(left, right));
322
324 }
325
326
327 /**
328 * Pipe operator for multiplexing.
329 *
330 * \param left object iterator
331 * \param right data type
332 * \return object multiplexer
333 */
334 template<class JBase_t>
341
342
343 static JSinglePointer< JMultiPipe<T, N> > pipe; //!< Declaration of common pipe
344 };
345
346 /**
347 * Definition of common pipe.
348 */
349 template<class T, int N>
351}
352
353#endif
bool is_valid() const
Check validity of pointer.
Auxiliary class for object iteration via multiple pipes, e.g. operator:
Definition JPipe.hh:206
friend JObjectMultiplexer< T, JBase_t > & operator|(JMultiPipe &left, const JType< JBase_t > &right)
Pipe operator for multiplexing.
Definition JPipe.hh:335
JMultiPipe(JObjectIterator< T > &input)
Constructor.
Definition JPipe.hh:213
JMultiPipe(JObjectIterator< T > &input, const JValve< T > &valve)
Constructor.
Definition JPipe.hh:224
JMultiPipe(JObjectIterator< T > &input, const JRegulator &regulator)
Constructor.
Definition JPipe.hh:248
JMultiPipe(JObjectIterator< T > &input, const JValve< T > &valve, const JObjectSelector< T > &selector, const JRegulator &regulator)
Constructor.
Definition JPipe.hh:262
friend JMultiPipe< T, N+1 > & operator|(JMultiPipe &left, const JValve< T > &right)
Recursive expansion of multi-pipe.
Definition JPipe.hh:289
friend JMultiPipe< T, N+1 > & operator|(JMultiPipe &left, const JObjectSelector< T > &right)
Recursive expansion of multi-pipe.
Definition JPipe.hh:304
static JSinglePointer< JMultiPipe< T, N > > pipe
Declaration of common pipe.
Definition JPipe.hh:343
friend JMultiPipe< T, N+1 > & operator|(JMultiPipe &left, const JRegulator &right)
Recursive expansion of multi-pipe.
Definition JPipe.hh:319
JMultiPipe(JObjectIterator< T > &input, const JObjectSelector< T > &selector)
Constructor.
Definition JPipe.hh:236
friend void operator|(JMultiPipe &left, JObjectOutput< T > &right)
Pipe terminator.
Definition JPipe.hh:276
Interface of object iteration for a single data type.
Auxiliary class for multiplexing object iterators.
Template interface of object output for single data type.
Interface for selection of objects.
JPipe(JObjectIterator< JHead_t > &input, const JValve< JHead_t > &valve, const JObjectSelector< JHead_t > &selector, const JRegulator &regulator)
Constructor.
Definition JPipe.hh:188
JTypeList< JHead_t, JTail_t > typelist
Definition JPipe.hh:152
JPipe(JObjectIterator< typelist > &input, const JValve< typelist > &valve, const JObjectSelector< typelist > &selector, const JRegulator &regulator)
Constructor.
Definition JPipe.hh:162
Auxiliary class for object iteration via pipe, i.e. operator:
Definition JPipe.hh:39
JObjectIterator< T > & in
Definition JPipe.hh:126
pointer_type ps
Definition JPipe.hh:132
virtual skip_type skip(const skip_type ns) override
Skip items.
Definition JPipe.hh:119
pointer_type p
Definition JPipe.hh:133
JPipe(JObjectIterator< T > &input, const JValve< T > &valve, const JObjectSelector< T > &selector, const JRegulator &regulator)
Constructor.
Definition JPipe.hh:52
const JRegulator & regulator
Definition JPipe.hh:129
virtual const pointer_type & next() override
Get next element.
Definition JPipe.hh:103
const JObjectSelector< T > & selector
Definition JPipe.hh:128
JObjectIterator< T >::pointer_type pointer_type
Definition JPipe.hh:42
virtual bool hasNext() override
Check availability of next element.
Definition JPipe.hh:68
const JValve< T > & valve
Definition JPipe.hh:127
virtual void reset() override
Reset pointer.
Definition JPointer.hh:84
Interface for controlling object throughput.
Definition JRegulator.hh:20
virtual bool accept() const
Accept.
Definition JRegulator.hh:34
The template JSinglePointer class can be used to hold a pointer to an object.
Auxiliary class for selection of data type.
Definition JValve.hh:23
Auxiliary classes and methods for language specific functionality.
unsigned int skip_type
Type definition for number of objects to skip.
Auxiliary class for no type definition.
Definition JNullType.hh:19
Type list.
Definition JTypeList.hh:23
Auxiliary class for a type holder.
Definition JType.hh:19