Listing 4 TableDataBuffer class

// tdbuf.hpp
#ifndef TDBUF_HPP
#define TDBUF_HPP
#include "tbldata.hpp"

// Buffer class for data tables
template <class cellType> class TableDataBuffer:
       public TableData<cellType>
{
public:
   TableDataBuffer (TableData<cellType> *const prev,
          const int nRows, const int nCols):
          TableData<celllype> (prev),
          NumRows (nRows),
          NumCols (nCols)
   {
      // Allocate the buffer
      TableBuf = new cellType[nRows * nCols];
      assert (TableBur != 0);
      // Allocate storage for row & col headings too.
      RowHeading = new char [nRows * MaxHeadingLen];
      assert (RowHeading != 0);
      ColHeading = new char [nCols * MaxHeadingLen];
      assert (ColHeading != 0);
   }

   virtual ~TableDataBuffer (void)
   {
      delete []TableBuf;
      delete []RowHeading;
      delete []ColHeading;
   }

   virtual const cellType GetCell (const int row,
          const int col)
   {
      ValidateCoord (row, col);
      return (RefCell (row, col));
   }

   virtual void PutCell (const int row, const int col,
          const cellType &value)
   {
      ValidateCoord (row, col);
      RefCell (row, col) = value;
   }

   virtual const int GetNumRows (void) const
   { return (NumRows); }

   virtual const int GetNumCols (void) const
   { return (NumCols); }

   virtual const char &GetRowHeading (const int row)
   {
      ValidateRow (row);
      return (RefRowHeading (row));
   }

   virtual const char &GetColHeading (coast int col)
   {
      ValidateCol (col);
      return (RefColHeading (col));
   }

   virtual void ValidateCoord (const int row,
          const int col) const
   { ValidateRow (row); ValidateCol (col); }

   virtual void ValidateRow (const int row) const
   { assert ( (row >= 0 && row < GetNumRows()) ); }

   virtual void ValidateCol (const int col) const
   { assert ( (col >= 0 && col < GetNumCols()) ); }

protected:
   enum { MaxHeadingLen = 40 };

   cellType &RefCell (int row, int col)
   { return (TableBuf[row * GetNumCols() + col]); }

   char &RefRowHeading (int row)
   { return (RowHeading[row * MaxHeadingLen]); }

   char &RefColHeading (int col)
   { return (ColHeading[col * MaxHeadingLen]); }

private:
   int NumRows, NumCols;
   cellType *TableBuf; // buffer holds all cells
   char *RowHeading;   // array of row headings
   char *ColHeading;   // array of col headings
};
#endif
// End of File