// This is a part of the Object Oriented Mathematical Library
// Copyright (C) 1999-2008 Renishaw plc
//
// This source file is the confidential property of Renishaw plc.
// Reproduction or transmission in whole or in part, in any form or
// by any means, electronic, mechanical or otherwise, is prohibited
// without the prior written consent of the copyright owner.
//
// objmath.h


// ========================================================================================================================
#ifndef __OBJMATH_H__
#define __OBJMATH_H__


// ========================================================================================================================
#include "OOMathsExport.h"

////////////////////////////////////////////////////////////////////////////////
// object model (1) - math library class hierarchy

class CMaObject;              // root object

   class CMaAlgebra;             // algebraic objects
      class CMaInterval;
//    class CMaVector; (note: implemented in CMaGeometry for efficiency)
      class CMaMatrix;
      class CMaComplex;
      class CMaComplexPolar;
      class CMaComplexVector;
      class CMaComplexMatrix;
      class CMaPolynomial;
      class CMaChebyshevPolynomial;
      class CMaChebyshevPolynomialExpression;
      class CMaAlgEqu;
      class CMaLinearEquSys;

   class CMaTrigonometry;        // trigonometric objects
      class CMaCosineCurve;
      class CMaSineCurve;
      class CMaTriag;
      class CMaTriagEqu;
      class CMaTriagPolynomial;

   class CMaGeometry;            // geometric objects
      class CMaCartesianCoord;      // Cartesian coordinate system
      class CMaPoint;
      class CMaVector;
      class CMaCurve;
         class CMaLine;             // line
         class CMaCircle;           // conic
         class CMaEllipse;
         class CMaHyperbola;
         class CMaParabola;
         class CMaPolyline;         // bounded
         class CMaLineSegment;
         class CMaCircularArc;
         class CMaCompositeCurve;
         class CMaSimplifiedCurve;
         class CMaBsplineCurve;
         class CMaPCurve;           // curve on surface
      class CMaSurface;
         class CMaPlane;            // plane
         class CMaCylSurf;          // quadric
         class CMaConSurf;
         class CMaSphSurf;
         class CMaTorSurf;          // quartic
         class CMaBsplineSurf;      // bounded

   class CMaNumericalAnalysis;   // numerical methods
      class CMaIntegral;            // integration 1D
      class CMaIntegral2D;          // integration 2D
      class CMaIntegral3D;          // integration 3D
      class CMaInterpolation;       // interpolation/extrapolation 1D
      class CMaInterpolation2D;     // interpolation 2D

////////////////////////////////////////////////////////////////////////////////
// object model (2) - math library non CMaObject classes

class CMaIntArray;            // array of integer numbers
class CMaDoubleArray;         // array of double numbers
class CMaComplexArray;        // array of complex numbers
class CMaComplexPolarArray;   // array of polar complex numbers
class CMaObjArray;            // array of object-pointers
class CMaPointArray;          // array of points
class CMaPointMatrix;         // matrix of points

class CMaException;           // exceptions

////////////////////////////////////////////////////////////////////////////////
// object model (3) - math library global values and variables

// objfloat.h
// objvalue.h

// ========================================================================================================================
////////////////////////////////////////////////////////////////////////////////
// CMaObject - math library root object (abstract base class)

class OOMATHS_API CMaObject
{
public:
// object types

   enum EMaObjectType {
      // root
         MaObject,
      // algebra
         MaInterval, MaMatrix, MaComplex, MaComplexPolar, MaComplexVector, MaComplexMatrix,
         MaPolynomial, MaChebyshevPolynomial, MaChebyshevPolynomialExpression,
         MaAlgEqu, MaLinearEquSys,
      // trigonometry
         MaCosineCurve, MaSineCurve, MaTriag, MaTriagEqu, MaTriagPolynomial,
      // linear geometry          
         MaPoint, MaVector, MaCartesianCoord,
         MaLine, MaPlane,
      // curve
         MaCircle, MaEllipse, MaHyperbola, MaParabola,
         MaPolyline, MaBsplineCurve,
         MaPCurve,
         MaLineSegment, MaCircularArc, MaCompositeCurve, MaSimplifiedCurve,
      // surface
         MaCylSurf, MaConSurf, MaSphSurf, MaTorSurf,
         MaBsplineSurf,
      // numerical methods
         MaIntegral, MaIntegral2D, MaIntegral3D,
         MaInterpolation, MaInterpolation2D
   };

// destructor
   virtual ~CMaObject();

// attribute
   EMaObjectType GetType() const;

protected:
// constructor
   CMaObject();

// implementation
   EMaObjectType m_nObjectType;
};

// ========================================================================================================================

#endif // __OBJMATH_H__
// ========================================================================================================================
