/* ----------------------------------------------------------------- */
/* 'ZAlgebraClass.h'									    */
/* Linear Algebra- Header- File							    */
/* 													    */
/* 	last modified 07/04/2003								    */
/* 	see ZAlgebraClass.cc for implementations				    */
/* 	maximum number of elements 16 (4x4), 					    */
/* 	this means: NO DYNAMIC RAM ALLOCATION!					    */
/* 													    */
/* 													    */
/* 	(C) Jochen Zimmermann								    */
/* ----------------------------------------------------------------- */

//avoid redefinition during static binding
#ifndef ZLA
#define ZLA

#include "ZHeaders.h"
/*
//needed headers, included via ZHeaders.h
#include "eyebot.h" 
#include "fastmath.h"
#include "ZHeaders.h"
*/



class LinearAlgebra
{
	friend class DenavitHartenberg;	
	/*DenavitHartenberg inherits this but also needs outbound access 
	for overloaded operator = in DenavitHartenberg::operator=() */
  	
    public:	
	LinearAlgebra();	
	/*standart constructor for initialisations*/
	
	LinearAlgebra(double* data, int wrows=4, int wcolumns=4);
	/*constructor with initialisation-data*/
	
	LinearAlgebra(const LinearAlgebra& tocopy);
	/*copy-constructor*/
	
	
	LinearAlgebra  operator * (double scalar);
	/*multiplies calling instance (matrix or vector) by scalar and 
	returns the result without changing calling instance*/
	
	LinearAlgebra  operator *=(double scalar);
	/*multiplies calling instance (matrix or vector) by scalar and 
	stzores the result in the calling instance*/
	
	LinearAlgebra  operator * (const  LinearAlgebra& lag);
	/*multiplies calling instance with lag, determines wether a 
	matrix-matrix-, matrix-vector-, or vector-vector-multiplication
	has to be performed, returns the result without changing the 
	calling instance*/
	
	LinearAlgebra  operator *=(const  LinearAlgebra& lag);
	/*multiplies calling instance with lag, determines wether a 
	matrix-matrix-, matrix-vector-, or vector-vector-multiplication
	has to be performed, returns the result in the calling instance*/
	
	LinearAlgebra  operator + (const  LinearAlgebra& lag);
	/*adds lag to the calling instance and checks if the addition can 
	be performed in a reasonable way, returns the without changing 
	the calling instance*/ 
	
	LinearAlgebra  operator +=(const  LinearAlgebra& lag);
	/*adds lag to the calling instance and checks if the addition can 
	be performed in a reasonable way, returns the result in the calling 
	instance*/ 
	
	LinearAlgebra  operator - (const  LinearAlgebra& lag);
	/*subtracts lag from the calling instance and checks if the 
	addition can be performed in a reasonable way, returns the result
	without changing the calling instance*/ 
	
	LinearAlgebra  operator -=(const  LinearAlgebra& lag);
	/*subtracts lag from the calling instance and checks if the 
	addition can be performed in a reasonable way, returns the result
	in the calling instance*/ 
	
	LinearAlgebra Equals(double* data, int wrows=4, int wcolumns=4);
	/*copies the passed data to the calling instance*/
	
	LinearAlgebra Plus(double* data, int wrows=4, int wcolumns=4);
	/*adds the passed data to the calling instance and checks if the 
	addition can be performed in a reasonable way, returns the without 
	changing the calling instance*/ 
	
	void   GetData(double* data,int wrows=4,int wcolumn=4,int firstrow=1, int firstcolumn=1);
	/*returns the private members in passed buffer data, by the chosen range*/
	
	double Absolute();
	/*returns the absolute of a vector if calling instance is a vector, 
	returns the determinant of a matrix if the calling instance is a matrix*/
	
	double Det();
	/*returns the determinant of a matrix if the calling instance is a matrix*/
	
	bool   IsMatrix();
	/*returns wether the calling instance is a matrix or not*/
	
	bool   IsVector();
	/*returns wether the calling instance is a vector or not*/
	
	int    GetRows();
	/*returns the number of rows in calling instance*/
	
	int    GetColumns();
	/*returns the number of columns in calling instance*/
	
	//int   OwnSqrt(double x); 
	/*returns sqrt of x*/
	
	
    protected:
    
    	int 	
    	rows,
    	/*actual number of rows*/
    		
    	columns;
    	/*actual number of columns*/
    		
    	double matrix[4][4];
    	/*buffer for matrix data*/

//  private:
//	static const unsigned short sqrtlookup[360];
	/*look-up table for OwnSqrt*/
    	
};

#endif

