Listing 3: Polynomial template class

// poly.h - polynomial template class
//
#include <stdexcept>
#include <vector>
#include <memory>
#include <function>
#include <stdlib>

template<class T>
class polynomial {
   public:
      ~polynomial();
      // constructors
      // initializes the constant term
      polynomial( const T& x0 = T(0.0) );
      // initializes from an array of coefficients
      polynomial( unsigned nc, const T *init );
      // copy constructor
      polynomial( const polynomial<T>& cp );

      // evaluate the function for a given x
      T operator()( const T& x ) const;
      // chain a polynomial
      polynomial<T> operator()( const polynomial<T>& P ) const;
      // access coefficient array
      T& operator[](int);
      const T& operator[](int) const;

      // equality
      bool operator==( const polynomial<T>& A ) const;
      bool operator!() const {
         return *this == polynomial<T>(0.0);
      }

      // assignment
      polynomial<T>& operator=( const polynomial<T>& cp );

      polynomial<T>& operator+=( const polynomial<T>& P );
      polynomial<T> operator+( const polynomial<T>& P ) const {
         return polynomial<T>(*this) += P;
      }
      polynomial<T>& operator-=( const polynomial<T>& P );
      polynomial<T> operator-( const polynomial<T>& P ) const {
         return polynomial<T>(*this) -= P;
      }
      polynomial<T> operator-() const;
      polynomial<T> operator+() const {
         return *this;
      }
      // same as multiplying by x ^ i
      polynomial<T> operator<<( int i ) const {
         return polynomial<T>(*this) <<= i;
      }
      // same as multiplying by x ^ -i
      polynomial<T> operator>> ( int i ) const {
         return operator<<(-i);
      }
      polynomial<T>& operator<<=( int i ) {
         ofs-=i;
         return *this;
      }
      polynomial<T>& operator>>=( int i ) {
         return operator<<=(-i);
      }
      polynomial<T> operator*( const polynomial<T>& P ) const;
      polynomial<T>& operator*=( const polynomial<T>& P ) {
         return *this = (*this * P);
      }
      polynomial<T> operator/( const polynomial<T>& D ) const;
      polynomial<T>& operator/=( const polynomial<T>& D ) {
         return *this = operator/(D);
      }

      // returns the deriviative function
      polynomial<T> derivative() const;

      // returns the integral function for the interval from c to x
      polynomial<T> integral( const T& c ) const;

      int upper() const;
      int lower() const;

   private:
      std::vector<T> C;
      unsigned n;   // number of elements in array
      int ofs;      // array offset
      const T T0;   // additive identity of template parameter
};

//not shown: implementation of constructors, destructor, operators
// derivative()const, integral (const T & c) const,
// -- mb
// ...

//not shown: integral(const T& c) const, inserters -- mb
// ...
/* End of File */