#ifndef MAT_H
#define MAT_H

// Implementation of a homogeneous 2D transform matrix

namespace Salamander
{

template <typename T, typename V>
class Mat
{
public:
	virtual ~Mat() {}

public:
	virtual void setTranslation(const V& translation) = 0;
	virtual V getTranslation() const = 0;

	virtual void setScale(const V& scale) = 0;
	virtual V getScale() const = 0;

	virtual void setRotation(double rotation) = 0;
	virtual double getRotation() const = 0;

	virtual T transpose() const = 0;
	virtual T inverse() const = 0;
	virtual double determinant() const = 0;

	virtual T operator + (const T& rhs) = 0;
	virtual T operator * (const T& rhs) = 0;
	virtual V operator * (const V& rhs) = 0;

protected:
	/*
	** This is an abstract base class. It should be implemented in a dimension-specific form
	** before being used.
	*/
	Mat() {}

};

}

#endif // MAT_H
