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