// Copyright (C) 2002 Jean-Marc Valin
#include "BufferedNode.h"
#include "CompositeType.h"
using namespace std;
namespace FD {
class AppendComposite;
DECLARE_NODE(AppendComposite)
/*Node
*
* @name AppendComposite
* @category General
* @description Append a objectRef to an existing Composite object.
*
* @input_name COMPOSITE
* @input_type CompositeType
* @input_description Composite object to append
*
* @output_name OUTPUT
* @output_description Create a new composite object.
*
* @parameter_name OVERRIDE
* @parameter_description if true, insertion of new object ref with key existing in given composite will override existing object ref
* @parameter_type bool
* @parameter_value true
*
END*/
class AppendComposite : public BufferedNode {
int outputID;
int inputID;
int paramsID;
bool m_override;
public:
AppendComposite(string nodeName, ParameterSet params)
: BufferedNode(nodeName, params)
{
outputID = addOutput("OUTPUT");
inputID = addInput("COMPOSITE");
if (parameters.exist("OVERRIDE"))
{
m_override = dereference_cast<bool>(parameters.get("OVERRIDE"));
}
else
{
m_override = true;
}
}
int translateInput (string inputName)
{
for (unsigned int i=0; i< inputs.size(); i++) {
if (inputs[i].name == inputName) {
return i;
}
}
return addInput(inputName);
}
void calculate(int output_id, int count, Buffer &out)
{
RCPtr<CompositeType> composite = getInput(inputID, count);
out[count] = composite;
for (unsigned int i=1; i< inputs.size(); i++)
{
ObjectRef in = getInput(i, count);
if (m_override)
{
composite->addField(inputs[i].name, in);
}
else
{
composite->conservativeAddField(inputs[i].name, in);
}
}
}
NO_ORDER_NODE_SPEEDUP(AppendComposite)
};
}//namespace FD
syntax highlighted by Code2HTML, v. 0.9.1