//# Functional.h: Map a domain object into a range object via operator(). //# Copyright (C) 1995,1996,1999-2001 //# Associated Universities, Inc. Washington DC, USA. //# //# 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; if not, write to the Free Software Foundation, //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. //# //# Correspondence concerning AIPS++ should be addressed as follows: //# Internet email: aips2-request@nrao.edu. //# Postal address: AIPS++ Project Office //# National Radio Astronomy Observatory //# 520 Edgemont Road //# Charlottesville, VA 22903-2475 USA //# //# $Id$ #ifndef CASA_FUNCTIONAL_H #define CASA_FUNCTIONAL_H //# Includes #include namespace casacore { //# NAMESPACE CASACORE - BEGIN //# Forward declaration template class Lattice; // Map a domain object into a range object via operator(). // // // // // The term ``Functional'' was chosen to follow the usage // in Barton and Nackman's ``Scientific and Engineering C++.'' // // // // A Functional is an abstract base class which // encapsulates the mapping of an object of type Domain into an // object of type Range. // This operation is invoked via operator() to make it look like // a function call. // // While these functions are function-like, there is no guarantee // that evaluations of the same parameter will yield the same result // (the implementor of a particular class could, for example, merely choose // to emit a random number). // However implementors of Functional classes are strongly // encouraged to implement (visible) side-effect free semantics in their // classes. // // A Functional object is used in circumstances similar to those // in which a function pointer could be used. An advantage of the // Functional objects is that it is possible to have more than // one of them at the same time. // Another potential advantage (not yet // implemented) is that it will be possible to perform functional // composition at run time, e.g. a=b+c where a,b, and c are // Functionals. // Another advantage is that since the Functional implementations // will in general be templated, the same source code would yield // instantiations for all the numeric types and for specializations like // automatic derivatives. // // To be of greatest utility, a library of functions that do mathematics, // plotting, etc. on Functional objects needs to be developed. // // // // The following simple example shows how you can write a function that uses a // Functional object. // // Double integrate1D(const Functional &f, // Double x1, Double x2, Double dx) { // uInt n = (xend - xstart) / dx; // Double sum = 0.0; // for (uInt i=0; i < n; i++) sum += f(x1 + i*dx) * dx; // return sum; // } // // Obviously this isn't a very serious algorithm! // // // // The specific application that caused the implementation of these // Functional // classes was the creation of the Fitting // module, which needed classes to represent the fitting functions. // // // //
  • Accessible default and copy constructors, assignment operators, // and destructors will almost always also be required. // // // //
  • A copy constructor is absolutely required for Range objects because // operator() returns Range objects by value. //
  • Accessible default constructors, assignment operators, // and destructors will almost always also be required. // // // //
  • For polymorphic access it could be that a clone() function // is needed at this level. // template class Functional { public: //# Constructors // Destructor virtual ~Functional(); //# Operators // Map a Domain x into a Range y value. virtual Range operator()(const Domain &x) const = 0; }; } //# NAMESPACE CASACORE - END #ifndef CASACORE_NO_AUTO_TEMPLATES #include #endif //# CASACORE_NO_AUTO_TEMPLATES #endif