/////////////////////////////////////////////////////////////////////// // Math Type Library // $Id: calculator.h,v 1.1 2002/04/20 06:39:18 cparpart Exp $ // (defines the interface for the function calculator) // // Copyright (c) 2002 by Christian Parpart // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public License // along with this library; see the file COPYING.LIB. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /////////////////////////////////////////////////////////////////////// #ifndef libmath_calculator_h #define libmath_calculator_h #include #include #include #include namespace math { template class TFunction; template class TLibrary; /** * ECalcError gets thrown whenever any error during function calculation * occurs. This may be e.g. a recursion error. */ class ECalcError : public EMath { public: ECalcError(const std::string& AReason) : EMath(AReason) {} }; /** * TCalculator calculates functions results using given function and * a library to use. You may also specify the recursion limit. */ template class TCalculator : protected TNodeVisitor { public: /// calculates the functions result using given values. static T calculate(const TFunction& AFunction, const T& AParam, const TLibrary& ALibrary, unsigned ARecursionLimit = 64); private: T FParam; const TLibrary& FLibrary; std::map FRecursions; unsigned FLimit; T FResult; private: /// creates a calculator TCalculator(const TFunction& AFunction, const T& AParam, const TLibrary& ALibrary, unsigned ALimit); /// calculates partial expression T calculate(const TNode *AExpression); virtual void visit(TNumberNode *); virtual void visit(TSymbolNode *); virtual void visit(TParamNode *); virtual void visit(TPlusNode *); virtual void visit(TNegNode *); virtual void visit(TMulNode *); virtual void visit(TDivNode *); virtual void visit(TPowNode *); virtual void visit(TSqrtNode *); virtual void visit(TSinNode *); virtual void visit(TCosNode *); virtual void visit(TTanNode *); virtual void visit(TLnNode *); virtual void visit(TFuncNode *); virtual void visit(TIfNode *); virtual void visit(TEquNode *); virtual void visit(TUnEquNode *); virtual void visit(TGreaterNode *); virtual void visit(TLessNode *); virtual void visit(TGreaterEquNode *); virtual void visit(TLessEquNode *); }; } // namespace math #include #endif