1
0
mirror of https://github.com/aportelli/LatAnalyze.git synced 2024-11-14 01:45:35 +00:00

function classes: const calls and fonction pointer support

This commit is contained in:
Antonin Portelli 2014-02-12 18:32:08 +00:00
parent 74c11a1da3
commit 4659cdb607
6 changed files with 110 additions and 98 deletions

View File

@ -27,30 +27,39 @@ using namespace Latan;
/****************************************************************************** /******************************************************************************
* Compiled double function implementation * * Compiled double function implementation *
******************************************************************************/ ******************************************************************************/
// constructor/destructor ////////////////////////////////////////////////////// // constructor /////////////////////////////////////////////////////////////////
CompiledDoubleFunction::CompiledDoubleFunction(const unsigned nArg) CompiledDoubleFunction::CompiledDoubleFunction(const unsigned nArg)
: DoubleFunction(nArg) : DoubleFunction(nArg)
{} {
interpreter_ = new MathInterpreter;
context_ = new RunContext;
}
CompiledDoubleFunction::CompiledDoubleFunction(const unsigned nArg, CompiledDoubleFunction::CompiledDoubleFunction(const unsigned nArg,
const string &code) const string &code)
: DoubleFunction(nArg) : DoubleFunction(nArg)
{ {
interpreter_ = new MathInterpreter;
context_ = new RunContext;
setCode(code); setCode(code);
} }
// destructor //////////////////////////////////////////////////////////////////
CompiledDoubleFunction::~CompiledDoubleFunction(void) CompiledDoubleFunction::~CompiledDoubleFunction(void)
{} {
delete interpreter_;
delete context_;
}
// access ////////////////////////////////////////////////////////////////////// // access //////////////////////////////////////////////////////////////////////
void CompiledDoubleFunction::setCode(const string &code) void CompiledDoubleFunction::setCode(const string &code)
{ {
interpreter_.setCode(code); interpreter_->setCode(code);
StdMath::addStdMathFunc(context_.fTable); StdMath::addStdMathFunc(context_->fTable);
} }
// function call /////////////////////////////////////////////////////////////// // function call ///////////////////////////////////////////////////////////////
double CompiledDoubleFunction::operator()(vector<double> &arg) double CompiledDoubleFunction::evaluate(const vector<double> &arg) const
{ {
double result; double result;
@ -62,13 +71,13 @@ double CompiledDoubleFunction::operator()(vector<double> &arg)
} }
for (unsigned int i = 0; i < getNArg(); ++i) for (unsigned int i = 0; i < getNArg(); ++i)
{ {
context_.vTable["x_" + strFrom(i)] = arg[i]; context_->vTable["x_" + strFrom(i)] = arg[i];
} }
interpreter_(context_); (*interpreter_)(*context_);
if (!context_.dStack.empty()) if (!context_->dStack.empty())
{ {
result = context_.dStack.top(); result = context_->dStack.top();
context_.dStack.pop(); context_->dStack.pop();
} }
else else
{ {
@ -82,7 +91,8 @@ double CompiledDoubleFunction::operator()(vector<double> &arg)
// IO ////////////////////////////////////////////////////////////////////////// // IO //////////////////////////////////////////////////////////////////////////
ostream &Latan::operator<<(ostream &out, CompiledDoubleFunction &f) ostream &Latan::operator<<(ostream &out, CompiledDoubleFunction &f)
{ {
out << f.interpreter_; f.interpreter_->compile();
out << *(f.interpreter_);
return out; return out;
} }

View File

@ -35,22 +35,22 @@ BEGIN_NAMESPACE
class CompiledDoubleFunction: public DoubleFunction class CompiledDoubleFunction: public DoubleFunction
{ {
public: public:
// constructor/destructor // constructors
explicit CompiledDoubleFunction(const unsigned nArg); explicit CompiledDoubleFunction(const unsigned nArg);
explicit CompiledDoubleFunction(const unsigned nArg, explicit CompiledDoubleFunction(const unsigned nArg,
const std::string &code); const std::string &code);
// destructor
virtual ~CompiledDoubleFunction(void); virtual ~CompiledDoubleFunction(void);
// access // access
void setCode(const std::string &code); void setCode(const std::string &code);
// function call // function call
using DoubleFunction::operator(); virtual double evaluate(const std::vector<double> &arg) const;
virtual double operator()(std::vector<double> &arg);
// IO // IO
friend std::ostream &operator<<(std::ostream &out, friend std::ostream &operator<<(std::ostream &out,
CompiledDoubleFunction &f); CompiledDoubleFunction &f);
private: private:
MathInterpreter interpreter_; MathInterpreter* interpreter_;
RunContext context_; RunContext* context_;
}; };
END_NAMESPACE END_NAMESPACE

View File

@ -61,27 +61,38 @@ unsigned int Function::getNArg(void) const
/****************************************************************************** /******************************************************************************
* DoubleFunction implementation * * DoubleFunction implementation *
******************************************************************************/ ******************************************************************************/
DoubleFunction::DoubleFunction(const unsigned nArg) DoubleFunction::DoubleFunction(const unsigned nArg, vecFunc *f)
: Function(nArg), buffer_(nArg) : Function(nArg)
{} , f_(f)
{
buffer_ = new vector<double>(nArg);
}
DoubleFunction::~DoubleFunction(void) DoubleFunction::~DoubleFunction(void)
{} {
delete buffer_;
}
double DoubleFunction::operator()(std::stack<double> &arg) double DoubleFunction::evaluate(const std::vector<double> &arg) const
{
std::cout << "double()" << endl;
return f_(arg);
}
double DoubleFunction::operator()(std::stack<double> &arg) const
{ {
for (unsigned int i = 0; i < getNArg(); ++i) for (unsigned int i = 0; i < getNArg(); ++i)
{ {
buffer_[getNArg() - i - 1] = arg.top(); (*buffer_)[getNArg() - i - 1] = arg.top();
arg.pop(); arg.pop();
} }
return (*this)(buffer_); return this->evaluate(*buffer_);
} }
double DoubleFunction::operator()(const double x0, ...) double DoubleFunction::operator()(const double x0, ...) const
{ {
buffer_[0] = x0; (*buffer_)[0] = x0;
if (getNArg() > 1) if (getNArg() > 1)
{ {
va_list va; va_list va;
@ -89,10 +100,10 @@ double DoubleFunction::operator()(const double x0, ...)
va_start(va, x0); va_start(va, x0);
for (unsigned int i = 1; i < getNArg(); ++i) for (unsigned int i = 1; i < getNArg(); ++i)
{ {
buffer_[i] = va_arg(va, double); (*buffer_)[i] = va_arg(va, double);
} }
va_end(va); va_end(va);
} }
return (*this)(buffer_); return this->evaluate(*buffer_);
} }

View File

@ -47,16 +47,19 @@ private:
******************************************************************************/ ******************************************************************************/
class DoubleFunction: public Function class DoubleFunction: public Function
{ {
private:
typedef double vecFunc(const std::vector<double> &);
public: public:
// constructor/destructor // constructor/destructor
explicit DoubleFunction(const unsigned nArg); explicit DoubleFunction(const unsigned nArg, vecFunc *f = NULL);
virtual ~DoubleFunction(void); virtual ~DoubleFunction(void);
// function call // function call
virtual double operator()(std::vector<double> &arg) = 0; virtual double evaluate(const std::vector<double> &arg) const;
double operator()(std::stack<double> &arg); double operator()(std::stack<double> &arg) const;
double operator()(const double x0, ...); double operator()(const double x0, ...) const;
private: private:
std::vector<double> buffer_; std::vector<double> *buffer_;
vecFunc *f_;
}; };
END_NAMESPACE END_NAMESPACE

View File

@ -27,58 +27,54 @@ using namespace Latan;
* Standard C functions * * Standard C functions *
******************************************************************************/ ******************************************************************************/
#define DEF_STD_FUNC_1ARG(name, funcName) \ #define DEF_STD_FUNC_1ARG(name) \
name##Function::name##Function(void): DoubleFunction(1) {}\ static double name##VecFunc(const vector<double> &arg)\
name##Function::~name##Function(void) {}\
double name##Function::operator()(std::vector<double> &arg)\
{\ {\
return funcName(arg[0]);\ return (name)(arg[0]);\
}\ }\
name##Function STDMATH_NAMESPACE::funcName; DoubleFunction STDMATH_NAMESPACE::name(1, &name##VecFunc);
#define DEF_STD_FUNC_2ARG(name, funcName) \ #define DEF_STD_FUNC_2ARG(name) \
name##Function::name##Function(void): DoubleFunction(2) {}\ static double name##VecFunc(const vector<double> &arg)\
name##Function::~name##Function(void) {}\
double name##Function::operator()(std::vector<double> &arg)\
{\ {\
return funcName(arg[0], arg[1]);\ return (name)(arg[0], arg[1]);\
}\ }\
name##Function STDMATH_NAMESPACE::funcName; DoubleFunction STDMATH_NAMESPACE::name(2, &name##VecFunc);
// Trigonometric functions // Trigonometric functions
DEF_STD_FUNC_1ARG(Cos, cos) DEF_STD_FUNC_1ARG(cos)
DEF_STD_FUNC_1ARG(Sin, sin) DEF_STD_FUNC_1ARG(sin)
DEF_STD_FUNC_1ARG(Tan, tan) DEF_STD_FUNC_1ARG(tan)
DEF_STD_FUNC_1ARG(ACos, acos) DEF_STD_FUNC_1ARG(acos)
DEF_STD_FUNC_1ARG(ASin, asin) DEF_STD_FUNC_1ARG(asin)
DEF_STD_FUNC_1ARG(ATan, atan) DEF_STD_FUNC_1ARG(atan)
DEF_STD_FUNC_2ARG(ATan2, atan2) DEF_STD_FUNC_2ARG(atan2)
// Hyperbolic functions // Hyperbolic functions
DEF_STD_FUNC_1ARG(Cosh, cosh) DEF_STD_FUNC_1ARG(cosh)
DEF_STD_FUNC_1ARG(Sinh, sinh) DEF_STD_FUNC_1ARG(sinh)
DEF_STD_FUNC_1ARG(Tanh, tanh) DEF_STD_FUNC_1ARG(tanh)
// Exponential and logarithmic functions // Exponential and logarithmic functions
DEF_STD_FUNC_1ARG(Exp, exp) DEF_STD_FUNC_1ARG(exp)
DEF_STD_FUNC_1ARG(Log, log) DEF_STD_FUNC_1ARG(log)
// Power functions // Power functions
DEF_STD_FUNC_2ARG(Pow, pow) DEF_STD_FUNC_2ARG(pow)
DEF_STD_FUNC_1ARG(Sqrt, sqrt) DEF_STD_FUNC_1ARG(sqrt)
// Rounding and remainder functions // Rounding and remainder functions
DEF_STD_FUNC_1ARG(Ceil, ceil) DEF_STD_FUNC_1ARG(ceil)
DEF_STD_FUNC_1ARG(Floor, floor) DEF_STD_FUNC_1ARG(floor)
DEF_STD_FUNC_2ARG(FMod, fmod) DEF_STD_FUNC_2ARG(fmod)
// Minimum, maximum, difference functions // Minimum, maximum, difference functions
DEF_STD_FUNC_2ARG(FDim, fdim) DEF_STD_FUNC_2ARG(fdim)
DEF_STD_FUNC_2ARG(FMax, fmax) DEF_STD_FUNC_2ARG(fmax)
DEF_STD_FUNC_2ARG(FMin, fmin) DEF_STD_FUNC_2ARG(fmin)
// Absolute value // Absolute value
DEF_STD_FUNC_1ARG(Abs, abs) DEF_STD_FUNC_1ARG(fabs)
#define ADD_FUNC(func) fTable[#func] = &STDMATH_NAMESPACE::func #define ADD_FUNC(func) fTable[#func] = &STDMATH_NAMESPACE::func
void STDMATH_NAMESPACE::addStdMathFunc(FunctionTable &fTable) void STDMATH_NAMESPACE::addStdMathFunc(FunctionTable &fTable)
@ -110,5 +106,5 @@ void STDMATH_NAMESPACE::addStdMathFunc(FunctionTable &fTable)
ADD_FUNC(fmax); ADD_FUNC(fmax);
ADD_FUNC(fmin); ADD_FUNC(fmin);
// Absolute value // Absolute value
ADD_FUNC(abs); ADD_FUNC(fabs);
} }

View File

@ -32,54 +32,46 @@ BEGIN_NAMESPACE
******************************************************************************/ ******************************************************************************/
#define STDMATH_NAMESPACE StdMath #define STDMATH_NAMESPACE StdMath
#define DECL_STD_FUNC(name, funcName) \ #define DECL_STD_FUNC(name) \
class name##Function: public DoubleFunction\
{\
public:\
name##Function(void);\
virtual ~name##Function(void);\
using DoubleFunction::operator();\
virtual double operator()(std::vector<double> &arg);\
};\
namespace STDMATH_NAMESPACE\ namespace STDMATH_NAMESPACE\
{\ {\
extern name##Function funcName;\ extern DoubleFunction name;\
} }
// Trigonometric functions // Trigonometric functions
DECL_STD_FUNC(Cos, cos) DECL_STD_FUNC(cos)
DECL_STD_FUNC(Sin, sin) DECL_STD_FUNC(sin)
DECL_STD_FUNC(Tan, tan) DECL_STD_FUNC(tan)
DECL_STD_FUNC(ACos, acos) DECL_STD_FUNC(acos)
DECL_STD_FUNC(ASin, asin) DECL_STD_FUNC(asin)
DECL_STD_FUNC(ATan, atan) DECL_STD_FUNC(atan)
DECL_STD_FUNC(ATan2, atan2) DECL_STD_FUNC(atan2)
// Hyperbolic functions // Hyperbolic functions
DECL_STD_FUNC(Cosh, cosh) DECL_STD_FUNC(cosh)
DECL_STD_FUNC(Sinh, sinh) DECL_STD_FUNC(sinh)
DECL_STD_FUNC(Tanh, tanh) DECL_STD_FUNC(tanh)
// Exponential and logarithmic functions // Exponential and logarithmic functions
DECL_STD_FUNC(Exp, exp) DECL_STD_FUNC(exp)
DECL_STD_FUNC(Log, log) DECL_STD_FUNC(log)
// Power functions // Power functions
DECL_STD_FUNC(Pow, pow) DECL_STD_FUNC(pow)
DECL_STD_FUNC(Sqrt, sqrt) DECL_STD_FUNC(sqrt)
// Rounding and remainder functions // Rounding and remainder functions
DECL_STD_FUNC(Ceil, ceil) DECL_STD_FUNC(ceil)
DECL_STD_FUNC(Floor, floor) DECL_STD_FUNC(floor)
DECL_STD_FUNC(FMod, fmod) DECL_STD_FUNC(fmod)
// Minimum, maximum, difference functions // Minimum, maximum, difference functions
DECL_STD_FUNC(FDim, fdim) DECL_STD_FUNC(fdim)
DECL_STD_FUNC(FMax, fmax) DECL_STD_FUNC(fmax)
DECL_STD_FUNC(FMin, fmin) DECL_STD_FUNC(fmin)
// Absolute value // Absolute value
DECL_STD_FUNC(Abs, abs) DECL_STD_FUNC(fabs)
// Add standard math functions to a table for the math compiler // Add standard math functions to a table for the math compiler
namespace STDMATH_NAMESPACE namespace STDMATH_NAMESPACE