/* 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 BinaryFunctionalH #define BinaryFunctionalH #include "Function/Functional.h" #include "SciEng/Ptrs.h" template class BinaryFunctional { public: BinaryFunctional( const CloneableObjPtr >& lhs, const CloneableObjPtr >& rhs ): the_lhs(lhs), the_rhs(rhs) { } const IsoFunctional& lhs() const { return *the_lhs; } const IsoFunctional& rhs() const { return *the_rhs; } private: CloneableObjPtr< IsoFunctional > the_lhs; CloneableObjPtr< IsoFunctional > the_rhs; }; template class AddFunctional : public virtual IsoFunctional, private BinaryFunctional { public: AddFunctional( const CloneableObjPtr< IsoFunctional >& lhs, const CloneableObjPtr< IsoFunctional >& rhs ): BinaryFunctional(lhs, rhs){ } virtual Domain operator()(const Domain& v) const { return lhs()(v) + rhs()(v);} virtual AddFunctional* clone() const { return new AddFunctional(*this); } }; template class SubtractFunctional : public virtual IsoFunctional, private BinaryFunctional { public: SubtractFunctional( const CloneableObjPtr< IsoFunctional >& lhs, const CloneableObjPtr< IsoFunctional >& rhs ): BinaryFunctional(lhs,rhs){ } virtual Domain operator()(const Domain& v) const { Domain s = lhs()(v); s -= rhs()(v); return s; } virtual SubtractFunctional* clone() const { return new SubtractFunctional(*this); } }; template class MultiplyFunctional : public virtual IsoFunctional, private BinaryFunctional { public: MultiplyFunctional( const CloneableObjPtr< IsoFunctional >& lhs, const CloneableObjPtr< IsoFunctional >& rhs ): BinaryFunctional(lhs,rhs){ } MultiplyFunctional(const CloneableObjPtr< IsoFunctional >& lhs, Domain rhs): BinaryFunctional( lhs, new ConstantFunctional(rhs) ) { } virtual Domain operator()(const Domain& v) const { Domain s = lhs()(v); s *= rhs()(v); return s; } virtual MultiplyFunctional* clone() const { return new MultiplyFunctional(*this); } }; template class DivideFunctional : public virtual IsoFunctional, private BinaryFunctional { public: DivideFunctional( const CloneableObjPtr< IsoFunctional >& lhs, const CloneableObjPtr< IsoFunctional >& rhs ): BinaryFunctional(lhs,rhs){ } DivideFunctional(const CloneableObjPtr< IsoFunctional >& lhs, Domain rhs): BinaryFunctional( lhs, new ConstantFunctional(rhs) ) { } virtual Domain operator()(const Domain& v) const { Domain s = lhs()(v); s /= rhs()(v); return s; } virtual DivideFunctional* clone() const { return new DivideFunctional(*this); } }; #endif