Jpp
JObjectMultiplexer.hh
Go to the documentation of this file.
1 #ifndef __JLANG__JOBJECTMULTIPLEXER__
2 #define __JLANG__JOBJECTMULTIPLEXER__
3 
5 #include "JLang/JObjectOutput.hh"
6 #include "JLang/JValve.hh"
7 #include "JLang/JTypeList.hh"
8 #include "JLang/JNullType.hh"
9 #include "JLang/JBaseClass.hh"
10 #include "JLang/JSinglePointer.hh"
11 
12 
13 /**
14  * \author mdejong
15  */
16 
17 namespace JLANG {}
18 namespace JPP { using namespace JLANG; }
19 
20 namespace JLANG {
21 
22  /**
23  * Auxiliary class for multiplexing object iterators.
24  *
25  * The template argument <tt>JDerived_t</tt> refers to a list of
26  * multiple object iterators which are sequentially processed.\n
27  * The template argument <tt>JBase_t</tt> refers to a single object iterator
28  * which provides for a common interface to the multiple object iterators.
29  *
30  * This class implements the JLANG::JObjectIterator interface.
31  */
32  template<class JDerived_t, class JBase_t = typename JBaseClass<JDerived_t>::data_type>
33  class JObjectMultiplexer :
34  public virtual JObjectIterator<JBase_t>
35  {
36  public:
37 
42 
43 
44  /**
45  * Constructor.
46  *
47  * \param input object iterator
48  * \param valve valve
49  */
51  const valve_type& valve = valve_type()) :
52  valve(valve),
53  in(input)
54  {}
55 
56 
57  /**
58  * Check availability of next element.
59  *
60  * \return true if the valve is open and the iteration has more elements; else false
61  */
62  virtual bool hasNext()
63  {
64  if (valve.is_open())
65  return in.hasNext();
66  else
67  return false;
68  }
69 
70 
71  /**
72  * Get next element.
73  *
74  * \return pointer to element
75  */
76  virtual const pointer_type& next()
77  {
78  ps.reset(in.next());
79 
80  return ps;
81  }
82 
83 
84  /**
85  * Pipe operator.
86  *
87  * \param in object multiplexer
88  * \param out object output
89  */
91  {
92  in >> out;
93  }
94 
96 
98 
99  private:
102  };
103 
104  /**
105  * Multiplexer.
106  */
107  template<class JDerived_t, class JBase_t>
110 
111 
112  /**
113  * Template specialisation of JObjectMultiplexer for multiple object iterators.
114  * Implementation of object multiplexing for multiple data types.
115  *
116  * This class recursively extends the JLANG::JObjectMultiplexer class
117  * for all data types by deriving from:
118  * - JObjectMultiplexer<JHead_t, JBase_t>; and
119  * - JObjectMultiplexer<JTail_t, JBase_t>.
120  *
121  * This class implements the JLANG::JObjectIterator interface.
122  */
123  template<class JHead_t, class JTail_t, class JBase_t>
124  class JObjectMultiplexer<JTypeList<JHead_t, JTail_t>, JBase_t> :
125  public JObjectMultiplexer<JHead_t, JBase_t>,
126  public JObjectMultiplexer<JTail_t, JBase_t>,
127  public virtual JObjectIterator<JBase_t>
128  {
129  public:
130 
136 
137 
138  /**
139  * Constructor.
140  *
141  * \param input object iterator
142  * \param valve valve
143  */
145  const valve_type& valve = valve_type()) :
146  JObjectMultiplexer<JHead_t, JBase_t>(input, valve),
147  JObjectMultiplexer<JTail_t, JBase_t>(input, valve)
148  {}
149 
150 
151  /**
152  * Check availability of next element.
153  *
154  * \return true if the iteration has more elements; else false
155  */
156  virtual bool hasNext()
157  {
160  }
161 
162 
163  /**
164  * Get next element.
165  *
166  * \return pointer to element
167  */
168  virtual const pointer_type& next()
169  {
172  else
174 
175  return ps;
176  }
177 
178 
179  /**
180  * Pipe operator.
181  *
182  * \param in object multiplexer
183  * \param out object output
184  */
186  {
187  in >> out;
188  }
189 
191 
192  private:
194  };
195 
196  /**
197  * Multiplexer.
198  */
199  template<class JHead_t, class JTail_t, class JBase_t>
201  JObjectMultiplexer<JTypeList<JHead_t, JTail_t>, JBase_t>::multiplexer;
202 
203 
204  /**
205  * Terminator class of recursive JObjectMultiplexer class.
206  */
207  template<class JHead_t, class JBase_t>
208  class JObjectMultiplexer<JTypeList<JHead_t, JNullType>, JBase_t> :
209  public JObjectMultiplexer<JHead_t, JBase_t>
210  {
211  public:
212 
217 
218 
219  /**
220  * Constructor.
221  *
222  * \param input object iterator
223  * \param valve valve
224  */
226  const valve_type& valve = valve_type()) :
227  JObjectMultiplexer<JHead_t, JBase_t>(input, valve)
228  {}
229  };
230 }
231 
232 #endif
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::hasNext
virtual bool hasNext()
Check availability of next element.
Definition: JObjectMultiplexer.hh:156
JLANG::JObjectMultiplexer::operator|
friend void operator|(JObjectMultiplexer &in, JObjectOutput< JBase_t > &out)
Pipe operator.
Definition: JObjectMultiplexer.hh:90
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::typelist
JTypeList< JHead_t, JTail_t > typelist
Definition: JObjectMultiplexer.hh:131
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::valve_type
JValve< typelist > valve_type
Definition: JObjectMultiplexer.hh:135
JLANG::JObjectMultiplexer::ps
pointer_type ps
Definition: JObjectMultiplexer.hh:101
JValve.hh
JLANG::JSinglePointer
The template JSinglePointer class can be used to hold a pointer to an object.
Definition: JSinglePointer.hh:24
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JNullType >, JBase_t >::multiplexer_type
JSinglePointer< JObjectMultiplexer< JHead_t, JBase_t > > multiplexer_type
Definition: JObjectMultiplexer.hh:215
JLANG::JObjectMultiplexer::hasNext
virtual bool hasNext()
Check availability of next element.
Definition: JObjectMultiplexer.hh:62
JSinglePointer.hh
JObjectIterator.hh
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JNullType >, JBase_t >::JObjectMultiplexer
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
Definition: JObjectMultiplexer.hh:225
JLANG::JNullType
Auxiliary class for no type definition.
Definition: JNullType.hh:19
JLANG::JObjectMultiplexer::multiplexer_type
JSinglePointer< JObjectMultiplexer< JDerived_t, JBase_t > > multiplexer_type
Definition: JObjectMultiplexer.hh:40
JLANG::JObjectIterator::hasNext
virtual bool hasNext()=0
Check availability of next element.
JLANG::JObjectMultiplexer::pointer_type
JObjectIterator< JBase_t >::pointer_type pointer_type
Definition: JObjectMultiplexer.hh:39
JLANG::JObjectMultiplexer::iterator_type
JObjectIterator< JDerived_t > iterator_type
Definition: JObjectMultiplexer.hh:38
JLANG::JObjectOutput< JBase_t >
JLANG::JObjectMultiplexer::next
virtual const pointer_type & next()
Get next element.
Definition: JObjectMultiplexer.hh:76
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JNullType >, JBase_t >::iterator_type
JObjectIterator< JHead_t > iterator_type
Definition: JObjectMultiplexer.hh:213
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JLANG::JObjectMultiplexer::in
iterator_type & in
Definition: JObjectMultiplexer.hh:100
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::next
virtual const pointer_type & next()
Get next element.
Definition: JObjectMultiplexer.hh:168
JBaseClass.hh
JLANG::JObjectMultiplexer::valve_type
JValve< JDerived_t > valve_type
Definition: JObjectMultiplexer.hh:41
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::ps
pointer_type ps
Definition: JObjectMultiplexer.hh:193
JLANG::JValve< JDerived_t >
JLANG::JObjectMultiplexer
Auxiliary class for multiplexing object iterators.
Definition: JObjectIterator.hh:35
JLANG::JObjectMultiplexer::valve
valve_type valve
Definition: JObjectMultiplexer.hh:95
JLANG::JTypeList
Type list.
Definition: JTypeList.hh:22
JLANG::JObjectMultiplexer::multiplexer
static multiplexer_type multiplexer
Multiplexer.
Definition: JObjectMultiplexer.hh:97
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::pointer_type
JObjectIterator< JBase_t >::pointer_type pointer_type
Definition: JObjectMultiplexer.hh:133
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JNullType >, JBase_t >::pointer_type
JObjectIterator< JBase_t >::pointer_type pointer_type
Definition: JObjectMultiplexer.hh:214
JLANG::JObjectIterator
Interface of object iteration for a single data type.
Definition: JObjectIterator.hh:43
JTypeList.hh
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::multiplexer_type
JSinglePointer< JObjectMultiplexer< typelist, JBase_t > > multiplexer_type
Definition: JObjectMultiplexer.hh:134
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JNullType >, JBase_t >::valve_type
JValve< JHead_t > valve_type
Definition: JObjectMultiplexer.hh:216
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::multiplexer
static multiplexer_type multiplexer
Multiplexer.
Definition: JObjectMultiplexer.hh:190
JNullType.hh
JLANG::JObjectMultiplexer::JObjectMultiplexer
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
Definition: JObjectMultiplexer.hh:50
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::iterator_type
JObjectIterator< typelist > iterator_type
Definition: JObjectMultiplexer.hh:132
JLANG
Auxiliary classes and methods for language specific functionality.
Definition: JAbstractClass.hh:10
JLANG::JObjectIterator::next
virtual const pointer_type & next()=0
Get next element.
JObjectOutput.hh
JLANG::JValve::is_open
bool is_open() const
Check if valve is open.
Definition: JValve.hh:51
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::JObjectMultiplexer
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
Definition: JObjectMultiplexer.hh:144
JLANG::JObjectMultiplexer< JTypeList< JHead_t, JTail_t >, JBase_t >::operator|
friend void operator|(JObjectMultiplexer &in, JObjectOutput< JBase_t > &out)
Pipe operator.
Definition: JObjectMultiplexer.hh:185