Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JObjectMultiplexer.hh
Go to the documentation of this file.
1#ifndef __JLANG__JOBJECTMULTIPLEXER__
2#define __JLANG__JOBJECTMULTIPLEXER__
3
6#include "JLang/JValve.hh"
7#include "JLang/JTypeList.hh"
8#include "JLang/JNullType.hh"
9#include "JLang/JBaseClass.hh"
11
12
13/**
14 * \author mdejong
15 */
16
17namespace JLANG {}
18namespace JPP { using namespace JLANG; }
19
20namespace 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>
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 */
161
162
163 /**
164 * Get next element.
165 *
166 * \return pointer to element
167 */
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>
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
Auxiliary class to identify common base class in type list.
Interface of object iteration for a single data type.
virtual bool hasNext()=0
Check availability of next element.
virtual const pointer_type & next()=0
Get next element.
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
JSinglePointer< JObjectMultiplexer< JHead_t, JBase_t > > multiplexer_type
virtual const pointer_type & next() override
Get next element.
friend void operator|(JObjectMultiplexer &in, JObjectOutput< JBase_t > &out)
Pipe operator.
virtual bool hasNext() override
Check availability of next element.
JSinglePointer< JObjectMultiplexer< typelist, JBase_t > > multiplexer_type
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
Auxiliary class for multiplexing object iterators.
virtual bool hasNext() override
Check availability of next element.
JValve< JDerived_t > valve_type
JObjectMultiplexer(iterator_type &input, const valve_type &valve=valve_type())
Constructor.
friend void operator|(JObjectMultiplexer &in, JObjectOutput< JBase_t > &out)
Pipe operator.
virtual const pointer_type & next() override
Get next element.
JSinglePointer< JObjectMultiplexer< JDerived_t, JBase_t > > multiplexer_type
static multiplexer_type multiplexer
Multiplexer.
JObjectIterator< JBase_t >::pointer_type pointer_type
JObjectIterator< JDerived_t > iterator_type
Template interface of object output for single data type.
virtual void reset() override
Reset pointer.
Definition JPointer.hh:84
The template JSinglePointer class can be used to hold a pointer to an object.
Auxiliary class for selection of data type.
Definition JValve.hh:23
bool is_open() const
Check if valve is open.
Definition JValve.hh:52
Auxiliary classes and methods for language specific functionality.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary class for no type definition.
Definition JNullType.hh:19
Type list.
Definition JTypeList.hh:23