Jpp  16.0.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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() override
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() override
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() override
157  {
160  }
161 
162 
163  /**
164  * Get next element.
165  *
166  * \return pointer to element
167  */
168  virtual const pointer_type& next() override
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
virtual bool hasNext() override
Check availability of next element.
JSinglePointer< JObjectMultiplexer< JDerived_t, JBase_t > > multiplexer_type
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
JObjectIterator< JDerived_t > iterator_type
static multiplexer_type multiplexer
Multiplexer.
friend void operator|(JObjectMultiplexer &in, JObjectOutput< JBase_t > &out)
Pipe operator.
Interface of object iteration for a single data type.
Auxiliary class for multiplexing object iterators.
Auxiliary class to identify common base class in type list.
JObjectIterator< JBase_t >::pointer_type pointer_type
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
JValve< JDerived_t > valve_type
Type list.
Definition: JTypeList.hh:22
The template JSinglePointer class can be used to hold a pointer to an object.
JSinglePointer< JObjectMultiplexer< typelist, JBase_t > > multiplexer_type
virtual const pointer_type & next()=0
Get next element.
Auxiliary class for no type definition.
Definition: JNullType.hh:19
virtual bool hasNext()=0
Check availability of next element.
virtual const pointer_type & next() override
Get next element.
virtual bool hasNext() override
Check availability of next element.
friend void operator|(JObjectMultiplexer &in, JObjectOutput< JBase_t > &out)
Pipe operator.
bool is_open() const
Check if valve is open.
Definition: JValve.hh:51
virtual const pointer_type & next() override
Get next element.
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
JSinglePointer< JObjectMultiplexer< JHead_t, JBase_t > > multiplexer_type