Jpp  18.6.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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"
11 #include "JLang/JSinglePointer.hh"
12 
13 
14 /**
15  * \file
16  *
17  * Implementation of pipe operation for object iterators.
18  * \author mdejong
19  */
20 
21 namespace 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),
58  selector (selector),
59  regulator(regulator)
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:
127  const JValve<T>& valve;
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>
204  class JMultiPipe :
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  */
237  const JObjectSelector<T>& selector) :
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 
293  return *JMultiPipe<T, N+1>::pipe;
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 
308  return *JMultiPipe<T, N+1>::pipe;
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 
323  return *JMultiPipe<T, N+1>::pipe;
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>
336  {
338 
340  }
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
JPipe(JObjectIterator< typelist > &input, const JValve< typelist > &valve, const JObjectSelector< typelist > &selector, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:162
JTypeList< JHead_t, JTail_t > typelist
Definition: JPipe.hh:152
const JObjectSelector< T > & selector
Definition: JPipe.hh:128
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
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
JObjectIterator< T > & in
Definition: JPipe.hh:126
JMultiPipe(JObjectIterator< T > &input, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:248
unsigned int skip_type
Type definition for number of objects to skip.
std::vector< size_t > ns
JMultiPipe(JObjectIterator< T > &input, const JValve< T > &valve, const JObjectSelector< T > &selector, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:262
JObjectIterator< T >::pointer_type pointer_type
Definition: JPipe.hh:42
Auxiliary class for a type holder.
Definition: JType.hh:19
Interface of object iteration for a single data type.
Auxiliary class for multiplexing object iterators.
bool is_valid() const
Check validity of pointer.
Auxiliary class for selection of data type.
JPipe(JObjectIterator< JHead_t > &input, const JValve< JHead_t > &valve, const JObjectSelector< JHead_t > &selector, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:188
Auxiliary class for object iteration via pipe, i.e. operator:
Definition: JPipe.hh:37
Auxiliary class for object iteration via multiple pipes, e.g. operator:
friend JObjectMultiplexer< T, JBase_t > & operator|(JMultiPipe &left, const JType< JBase_t > &right)
Pipe operator for multiplexing.
Definition: JPipe.hh:335
Type list.
Definition: JTypeList.hh:22
The template JSinglePointer class can be used to hold a pointer to an object.
Interface for selection of objects.
virtual bool accept() const
Accept.
Definition: JRegulator.hh:34
const JValve< T > & valve
Definition: JPipe.hh:127
do set_variable OUTPUT_DIRECTORY $WORKDIR T
Auxiliary class for no type definition.
Definition: JNullType.hh:19
virtual bool hasNext() override
Check availability of next element.
Definition: JPipe.hh:68
Interface for controlling object throughput.
Definition: JRegulator.hh:18
virtual skip_type skip(const skip_type ns) override
Skip items.
Definition: JPipe.hh:119
friend void operator|(JMultiPipe &left, JObjectOutput< T > &right)
Pipe terminator.
Definition: JPipe.hh:276
JMultiPipe(JObjectIterator< T > &input)
Constructor.
Definition: JPipe.hh:213
Template interface of object output for single data type.
friend JMultiPipe< T, N+1 > & operator|(JMultiPipe &left, const JValve< T > &right)
Recursive expansion of multi-pipe.
Definition: JPipe.hh:289
pointer_type p
Definition: JPipe.hh:133
virtual const pointer_type & next() override
Get next element.
Definition: JPipe.hh:103
JMultiPipe(JObjectIterator< T > &input, const JValve< T > &valve)
Constructor.
Definition: JPipe.hh:224
pointer_type ps
Definition: JPipe.hh:132
friend JMultiPipe< T, N+1 > & operator|(JMultiPipe &left, const JObjectSelector< T > &right)
Recursive expansion of multi-pipe.
Definition: JPipe.hh:304
JMultiPipe(JObjectIterator< T > &input, const JObjectSelector< T > &selector)
Constructor.
Definition: JPipe.hh:236
virtual void reset() override
Reset pointer.
Definition: JPointer.hh:84