Listing 1

// MatBase.h  
// Martin E. Scolnick   
//
#ifndef _MATBASE_H
#define _MATBASE_H

#include "MatDefs.h"
#include "VEC.h"

using namespace std;

template<class T>
class MatBase
{
protected:
   size_t   dim1;
   size_t   dim2;
   VVEC(T)  dat0;    // vector of row or col vector<T>'s
   VVEC(T)  dat1;    // alternate container
   VVEC(T)* curDatP; // points to dat0 or dat1
   MatBase(const size_t nRows, const size_t nCols);
   MatBase(const size_t nRows, const size_t nCols, const MatBase& m);
public:
   void  ToggleData()
         {curDatP = (curDatP==&dat0) ? &dat1 : &dat0;}
   VVEC(T)& GetCurData(){return *curDatP;}
   VVEC(T)& GetAltData()
            {return (curDatP==&dat0) ? dat1 : dat0;}
};
template<class T> inline
MatBase<T>::MatBase(const size_t d1, const size_t d2)
 : dim1(d1), dim2(d2), 
   dat0(d1), dat1(d1), curDatP(&dat0)
{
   VVEC_I(T) curCol_vi = dat0.begin();
   VVEC_I(T) altCol_vi = dat1.begin();
   VVEC_I(T) curColEnd_vi = dat0.end();
   while(curCol_vi != curColEnd_vi)
   {
      (*curCol_vi++).resize(d2);
      (*altCol_vi++).resize(d2);
   }
}
template<class T> inline
MatBase<T>::MatBase(const size_t d1, const size_t d2, const MatBase& m)
 : dim1(d1), dim2(d2),  
   dat0(m.dat0), dat1(m.dat1), 
   curDatP(m.curDatP==&m.dat0 ? &dat0 : &dat1){}

#endif // _MATBASE_H