/** \file Functors.h */ #ifndef AMDIS_FUNCTORS_H #define AMDIS_FUNCTORS_H #include "AbstractFunction.h" namespace AMDiS { template struct Id : public AbstractFunction { T operator()(const T &v) const { return v; } }; template struct Const : public AbstractFunction { Const(T1 val_) : val(val_) {} T1 operator()(const T2 &v) const { return val; } private: T1 val; }; template struct Factor : public AbstractFunction { Factor(double fac_) : fac(fac_) {} T operator()(const T& x) const { return fac*x; }; private: double fac; }; template struct Add : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return v1+v2; } }; template struct AddFactor : public BinaryAbstractFunction { AddFactor(double factor_ = 1.0) : factor(factor_) {} T operator()(const T &v1, const T &v2) const { return v1 + factor*v2; } private: double factor; }; template struct Subtract : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return v1-v2; } }; template struct AddScal : public AbstractFunction { AddScal(T scal_) : scal(scal_) {} T operator()(const T &v) const { return v+scal; } private: T scal; }; template struct Mult : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return v1*v2; } }; template struct Mult2 : public BinaryAbstractFunction { T1 operator()(const T2 &v1, const T3 &v2) const { return v1*v2; } }; template struct MultScal : public AbstractFunction { MultScal(T scal_) : scal(scal_) {} T operator()(const T &v) const { return v*scal; } private: T scal; }; template struct Max : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return std::max(v1,v2); } }; template struct Min : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return std::min(v1,v2); } }; template struct Diff : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return abs(v1-v2); } }; template struct L1Diff : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return abs(v1-v2); } }; template struct L2Diff : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return sqr(v1-v2); } }; template struct Abs : public AbstractFunction { T operator()(const T &v) const { return abs(v); } }; template struct Signum : public AbstractFunction { T operator()(const T &v) const { return (v>0.0?1.0:(v<0.0?-1.0:0.0)); } }; template struct Sqr : public AbstractFunction { T operator()(const T &v) const { return sqr(v); } }; template struct Sqrt : public AbstractFunction { T operator()(const T &v) const { return sqrt(v); } }; template struct Pow : public AbstractFunction { Pow(double p_) : p(p_) {} T operator()(const T &v) const { return pow(v,p); } private: double p; }; template struct Norm2 : public AbstractFunction { T1 operator()(const T2 &v) const { return sqrt(v*v); } }; template struct Norm2Sqr : public AbstractFunction { T1 operator()(const T2 &v) const { return v*v; } }; template struct Norm2_comp2 : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return sqrt(sqr(v1)+sqr(v2)); } }; template struct Norm2Sqr_comp2 : public BinaryAbstractFunction { T operator()(const T &v1, const T &v2) const { return sqr(v1)+sqr(v2); } }; template struct Norm2_comp3 : public TertiaryAbstractFunction { T operator()(const T &v1, const T &v2, const T &v3) const { return sqrt(sqr(v1)+sqr(v2)+sqr(v3)); } }; template struct Norm2Sqr_comp3 : public TertiaryAbstractFunction { T operator()(const T &v1, const T &v2, const T &v3) const { return sqr(v1)+sqr(v2)+sqr(v3); } }; template struct Vec1WorldVec : public AbstractFunction,T> { WorldVector operator()(const T &v0) const { WorldVector result; result[0]=v0; return result; } }; template struct Vec2WorldVec : public BinaryAbstractFunction,T,T> { WorldVector operator()(const T &v0, const T &v1) const { WorldVector result; result[0]=v0; result[1]=v1; return result; } }; template struct Vec3WorldVec : public TertiaryAbstractFunction,T,T,T> { WorldVector operator()(const T &v0, const T &v1, const T &v2) const { WorldVector result; result[0]=v0; result[1]=v1; result[2]=v2; return result; } }; struct FadeOut : public TertiaryAbstractFunction { double operator()(const double &v, const double &dist, const double &mean) const { return dist*mean+(1.0-dist)*v; } }; } #endif // AMDIS_FUNCTORS_H