Jpp  17.2.0
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  struct 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 
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  struct JPipe< JTypeList<JHead_t, JNullType> > :
177  public JPipe<JHead_t>
178  {
179  /**
180  * Constructor.
181  *
182  * \param input object iterator
183  * \param valve valve
184  * \param selector object selector
185  * \param regulator regulator
186  */
188  const JValve<JHead_t>& valve,
190  const JRegulator& regulator) :
191  JPipe<JHead_t>(input, valve, selector, regulator)
192  {}
193  };
194 
195 
196  /**
197  * Auxiliary class for object iteration via multiple pipes, e.g.\ operator:
198  * <pre>
199  * .. | .. | ..
200  * </pre>
201  */
202  template<class T, int N>
203  struct JMultiPipe :
204  public JPipe<T>
205  {
206  /**
207  * Constructor.
208  *
209  * \param input object iterator
210  */
212  JPipe<T>(input, JValve<T>::getDefault(), JObjectSelector<T>::getDefault(), JRegulator::getDefault())
213  {}
214 
215 
216  /**
217  * Constructor.
218  *
219  * \param input object iterator
220  * \param valve valve
221  */
223  const JValve<T>& valve) :
224  JPipe<T>(input, valve, JObjectSelector<T>::getDefault(), JRegulator::getDefault())
225  {}
226 
227 
228  /**
229  * Constructor.
230  *
231  * \param input object iterator
232  * \param selector object selector
233  */
235  const JObjectSelector<T>& selector) :
236  JPipe<T>(input, JValve<T>::getDefault(), selector, JRegulator::getDefault())
237  {}
238 
239 
240  /**
241  * Constructor.
242  *
243  * \param input object iterator
244  * \param regulator regulator
245  */
247  const JRegulator& regulator) :
248  JPipe<T>(input, JValve<T>::getDefault(), JObjectSelector<T>::getDefault(), regulator)
249  {}
250 
251 
252  /**
253  * Constructor.
254  *
255  * \param input object iterator
256  * \param valve valve
257  * \param selector object selector
258  * \param regulator regulator
259  */
261  const JValve<T>& valve,
263  const JRegulator& regulator) :
264  JPipe<T>(input, valve, selector, regulator)
265  {}
266 
267 
268  /**
269  * Pipe terminator.
270  *
271  * \param left pipe
272  * \param right object output
273  */
274  friend inline void operator|(JMultiPipe& left, JObjectOutput<T>& right)
275  {
276  left >> right;
277  }
278 
279 
280  /**
281  * Recursive expansion of multi-pipe.
282  *
283  * \param left multi-pipe
284  * \param right object valve
285  * \return multi-pipe
286  */
287  friend inline JMultiPipe<T, N+1>& operator|(JMultiPipe& left, const JValve<T>& right)
288  {
289  JMultiPipe<T, N+1>::pipe.reset(new JMultiPipe<T, N+1>(left, right));
290 
291  return *JMultiPipe<T, N+1>::pipe;
292  }
293 
294 
295  /**
296  * Recursive expansion of multi-pipe.
297  *
298  * \param left multi-pipe
299  * \param right object selector
300  * \return multi-pipe
301  */
302  friend inline JMultiPipe<T, N+1>& operator|(JMultiPipe& left, const JObjectSelector<T>& right)
303  {
304  JMultiPipe<T, N+1>::pipe.reset(new JMultiPipe<T, N+1>(left, right));
305 
306  return *JMultiPipe<T, N+1>::pipe;
307  }
308 
309 
310  /**
311  * Recursive expansion of multi-pipe.
312  *
313  * \param left multi-pipe
314  * \param right regulator
315  * \return multi-pipe
316  */
317  friend inline JMultiPipe<T, N+1>& operator|(JMultiPipe& left, const JRegulator& right)
318  {
319  JMultiPipe<T, N+1>::pipe.reset(new JMultiPipe<T, N+1>(left, right));
320 
321  return *JMultiPipe<T, N+1>::pipe;
322  }
323 
324 
325  /**
326  * Pipe operator for multiplexing.
327  *
328  * \param left object iterator
329  * \param right data type
330  * \return object multiplexer
331  */
332  template<class JBase_t>
334  {
336 
338  }
339 
340 
341  static JSinglePointer< JMultiPipe<T, N> > pipe; //!< Declaration of common pipe
342  };
343 
344  /**
345  * Definition of common pipe.
346  */
347  template<class T, int N>
349 }
350 
351 #endif
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:341
friend JMultiPipe< T, N+1 > & operator|(JMultiPipe &left, const JRegulator &right)
Recursive expansion of multi-pipe.
Definition: JPipe.hh:317
JObjectIterator< T > & in
Definition: JPipe.hh:126
JMultiPipe(JObjectIterator< T > &input, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:246
unsigned int skip_type
Type definition for number of objects to skip.
JMultiPipe(JObjectIterator< T > &input, const JValve< T > &valve, const JObjectSelector< T > &selector, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:260
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.
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:333
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.
Interface for controlling object throughput.
Definition: JRegulator.hh:18
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
JPipe(JObjectIterator< typelist > &input, const JValve< typelist > &valve, const JObjectSelector< typelist > &selector, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:162
virtual skip_type skip(const skip_type ns) override
Skip items.
Definition: JPipe.hh:119
JTypeList< JHead_t, JTail_t > typelist
Definition: JPipe.hh:152
JPipe(JObjectIterator< JHead_t > &input, const JValve< JHead_t > &valve, const JObjectSelector< JHead_t > &selector, const JRegulator &regulator)
Constructor.
Definition: JPipe.hh:187
friend void operator|(JMultiPipe &left, JObjectOutput< T > &right)
Pipe terminator.
Definition: JPipe.hh:274
virtual bool accept() const
Accept.
Definition: JRegulator.hh:33
JMultiPipe(JObjectIterator< T > &input)
Constructor.
Definition: JPipe.hh:211
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:287
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:222
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:302
JMultiPipe(JObjectIterator< T > &input, const JObjectSelector< T > &selector)
Constructor.
Definition: JPipe.hh:234
virtual void reset() override
Reset pointer.
Definition: JPointer.hh:84