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