// Copyright (C) 1999 Jean-Marc Valin

#include "BufferedNode.h"
#include "Buffer.h"
#include "Vector.h"

using namespace std;

namespace FD {

class Float2Vect;

DECLARE_NODE(Float2Vect)
/*Node
 *
 * @name Float2Vect
 * @category Vector
 * @description Converts float values to a vector of elements in past and future
 *
 * @input_name INPUT
 * @input_type float
 * @input_description The input float 
 *
 * @output_name OUTPUT
 * @output_type Vector<float>
 * @output_description The vector
 *
 * @parameter_name LOOKAHEAD
 * @parameter_type int
 * @parameter_description Number of elements in the future
 *
 * @parameter_name LOOKBACK
 * @parameter_type int
 * @parameter_description Number of elements in the past
 *
END*/


class Float2Vect : public BufferedNode {
   
   int inputID;
   int outputID;
   int lookAhead;
   int lookBack;

public:
   Float2Vect(string nodeName, ParameterSet params)
      : BufferedNode(nodeName, params)
      , lookAhead(0)
      , lookBack(0)
   {
      inputID = addInput("INPUT");
      outputID = addOutput("OUTPUT");

      if (parameters.exist("LOOKAHEAD"))
	 lookAhead = dereference_cast<int> (parameters.get("LOOKAHEAD"));
      if (parameters.exist("LOOKBACK"))
	 lookBack = dereference_cast<int> (parameters.get("LOOKBACK"));
      inputsCache[inputID].lookAhead = lookAhead;
      inputsCache[inputID].lookBack = lookBack;
   }

   void calculate(int output_id, int count, Buffer &out)
   {
      Vector<float> &output = *Vector<float>::alloc(1 + lookAhead + lookBack);
      out[count] = &output;

      for (int i=-lookBack;i<=lookAhead;i++)
      {
	 if (count+i>=0)
	 {
	    ObjectRef inputValue = getInput(inputID, count+i);
	    output[lookBack+i] = dereference_cast<float> (inputValue);
	    
	 } else {
	    output[lookBack+i] = 0;
	 }
      }
      
   }

      
NO_ORDER_NODE_SPEEDUP(Float2Vect)
};

}//namespace FD


syntax highlighted by Code2HTML, v. 0.9.1