#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