/* Example programs from the book Scientific and Engineering Programming in C++: An Introduction with Advanced Techniques and Examples, Addison-Wesley, 1994. (c) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 1994. ALL RIGHTS RESERVED. See README file for further details. */ #ifndef FunctionAlgebraH #define FunctionAlgebraH #include #include "SciEng/Ptrs.h" #include "Algebra/DivisionAlgebraCategory.h" #include "Function/Functional.h" #include "Function/ZeroFunctional.h" #include "Function/OneFunctional.h" #include "Function/XFunctional.h" #include "Function/ConstantFunctional.h" #include "Function/BinaryFunctional.h" #include "Function/UnaryFunctional.h" #include "Function/CompositionFunctional.h" #include "Function/ParameterFunctional.h" template class FunctionalAlgebra : public virtual IsoFunctional, public DivisionAlgebraCategory< FunctionalAlgebra, Domain > { public: FunctionalAlgebra(const CountedBuiltInPtr& d); // Means a parameter FunctionalAlgebra(const Domain& d); // Means a constant. FunctionalAlgebra(); // Means a variable (x). FunctionalAlgebra(const IsoFunctional& fp); // Means a function to be copied. FunctionalAlgebra(IsoFunctional* just_newed); // Means a function, don't copy. virtual Domain operator()(const Domain& v) const { return (*f)(v); } CloneableObjPtr< IsoFunctional > operator()(const FunctionalAlgebra& inner) const; // DivisionAlgebraCategory User Must Define. FunctionalAlgebra& operator+=(const FunctionalAlgebra& rhs); FunctionalAlgebra& operator-=(const FunctionalAlgebra& rhs); FunctionalAlgebra& operator*=(const FunctionalAlgebra& rhs); FunctionalAlgebra& operator/=(const FunctionalAlgebra& rhs); FunctionalAlgebra& operator*=(const Domain&); FunctionalAlgebra& operator/=(const Domain&); FunctionalAlgebra& setToZero(); FunctionalAlgebra& setToOne(); FunctionalAlgebra& negate(); FunctionalAlgebra& invert(); // Transcendental functions friend FunctionalAlgebra exp(const FunctionalAlgebra&); friend FunctionalAlgebra log(const FunctionalAlgebra&); friend FunctionalAlgebra sqrt(const FunctionalAlgebra&); friend FunctionalAlgebra log10(const FunctionalAlgebra&); friend FunctionalAlgebra sin(const FunctionalAlgebra&); friend FunctionalAlgebra cos(const FunctionalAlgebra&); friend FunctionalAlgebra asin(const FunctionalAlgebra&); friend FunctionalAlgebra acos(const FunctionalAlgebra&); virtual FunctionalAlgebra* clone() const { return new FunctionalAlgebra(*this); } private: CloneableObjPtr< IsoFunctional > f; }; #ifdef XLC_QNOTEMPINC #include "Function/FunctionalAlgebra.c" #endif #endif