#ifndef __JLANG__JOBJECTDEMULTIPLEXER__ #define __JLANG__JOBJECTDEMULTIPLEXER__ #include "JLang/JObjectIterator.hh" #include "JLang/JObjectOutput.hh" #include "JLang/JTypeList.hh" #include "JLang/JNullType.hh" /** * \author mdejong */ namespace JLANG {} namespace JPP { using namespace JLANG; } namespace JLANG { /** * Auxiliary class for demultiplexing object outputs. * * The template argument JDerived_t refers to a list of * multiple object outputs which are processed in parallel.\n * The template argument JBase_t refers to a single object output * which provides for a common interface to the multiple object outputs. * * This class implements the JLANG::JObjectOutput interface. */ template struct JObjectDemultiplexer : public virtual JObjectOutput { /** * Constructor. * * \param output object output */ JObjectDemultiplexer(JObjectOutput& output) : out(output) {} /** * Object output. * * \param object object * \return true if OK; else false */ virtual bool put(const JBase_t& object) override { const JDerived_t* p = dynamic_cast(&object); if (p != NULL) return out.put(*p); else return false; } /** * Pipe operator. * * \param in object demultiplexer * \param out object output */ friend inline void operator|(JObjectIterator& in, JObjectDemultiplexer& out) { while (in.hasNext() && out.put(*in.next())) {} } private: JObjectOutput& out; }; /** * Template specialisation of JObjectDemultiplexer for multiple object outputs. * Implementation of object demultiplexing for multiple data types. * * This class recursively extends the JLANG::JObjectDemultiplexer class * for all data types by deriving from: * - JObjectDemultiplexer; and * - JObjectDemultiplexer. * * This class implements the JLANG::JObjectOutput interface. */ template struct JObjectDemultiplexer > : public JObjectDemultiplexer, public JObjectDemultiplexer, public virtual JObjectOutput { /** * Constructor. * * \param output object output */ template JObjectDemultiplexer(T& output) : JObjectDemultiplexer(output), JObjectDemultiplexer(output) {} /** * Object output. * * \param object object * \return true if OK; else false */ virtual bool put(const JBase_t& object) override { return (static_cast< JObjectDemultiplexer >(*this).put(object) || static_cast< JObjectDemultiplexer >(*this).put(object)); } /** * Pipe operator. * * \param in object demultiplexer * \param out object output */ friend inline void operator|(JObjectIterator& in, JObjectDemultiplexer& out) { while (in.hasNext() && out.put(*in.next())) {} } }; /** * Terminator class of recursive JObjectDemultiplexer class. */ template struct JObjectDemultiplexer > : public JObjectDemultiplexer { /** * Constructor. * * \param output object output */ JObjectDemultiplexer(JObjectOutput& output) : JObjectDemultiplexer(output) {} }; } #endif