#ifndef TRAJECT_H
#define TRAJECT_H
// array indices
typedef enum  _CoordIndex  
				{ DT=0  					// delta time 
				, X, Y, Z                   // translation
				, ROLL, PITCH, YAW          // rotation
				, COORD_SIZE } CoordIndex;  // 

#define NUM_AXES 6

// by convention, element 0 is temporal and elements 1..COORD_SIZE-1 are spatial
class Coordinate{
	double coordinate[COORD_SIZE];
	static Coordinate temp;
public:
	double& operator[](int index) {
		return coordinate[index];
	}
	Coordinate& operator +(Coordinate c);
	Coordinate& operator -(Coordinate c);
	Coordinate& operator *(double d);
	Coordinate& operator /(double d);
	Coordinate& operator =(double d);
	friend Coordinate& operator *(double d, Coordinate c);
	
	Coordinate(){}
	Coordinate(	double val);
	Coordinate(	double val[COORD_SIZE]);
	Coordinate(	double deltaT
			, 	double x, double y, double z	// translation
			, 	double r, double p, double w    // roll-pitch-yaw
	); 

};




class Trajectory {
	int numcoords;
	Coordinate *coord;

	friend class SPFA_Model;
	friend class controller;
public:
	Trajectory& scale(float scaleFactor);
	Trajectory& operator *= (float scaleFactor) { scale(scaleFactor); }
	Coordinate& operator [] (int index) { return  coord[index]; }
	Trajectory& readFile (char* filename);
	int         writeFile(char* filename);
	bool		allocate(int newNumCoords);
	int         getNumCoords() const { return numcoords; };

	Trajectory();
	Trajectory(int numOfCoords);
	Trajectory(char* filename);
	~Trajectory();
};

// utility functions defined in traject.cpp
void scaleTrajectory(Trajectory *t, float scalefactor);

#endif	// #ifndef TRAJECT_H
