ROOT logo
//*-- Author : Manuel Sanchez
//*-- Modified : 2/04/98
//*-- Modified : 29/10/99 R. Holzmann
//*-- Copyright : GENP

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////
//HMatrixCatIter
//
//   This is a HIterator for HMatrixCategory.
//
////////////////////////////////////////////
using namespace std;
#include "hmatrixcatiter.h"
#include "hdebug.h"
#include <iostream> 
#include <iomanip>

ClassImp(HMatrixCatIter) //;

  HMatrixCatIter::HMatrixCatIter(void) {
    //Default constructor. Never call
    fCategory=NULL;
    fSizes=NULL;
    fCursor=0;
    fDir=kIterForward;
    //    Reset();
}

HMatrixCatIter::HMatrixCatIter(HMatrixCategory *cat,Bool_t dir) {
  //Allocates a new HIterator pointing to the category cat and iterating in the direction
  //dir
  fCategory=cat;
  fSizes=cat->fIndexTable->getDimensions();
  fCursor=0;
  fDir=dir;
  //  Reset();
}

HMatrixCatIter::~HMatrixCatIter(void) {
  //Destructor
}

TCollection *HMatrixCatIter::GetCollection(void) const {
  //Returns the internal collection where the category stores data
  return fCategory->fData;
}

TObject *HMatrixCatIter::Next(void) {
  //Advances to next object and returns a pointer to it.
  //Returns NULL when reaches the end
  TObject *r=NULL;
  Int_t i;
  if (fDir==kIterForward) {
    if (fCursor < fEnd ) {
      r=fCategory->fData->At(fCategory->fIndexTable->getIndex(fCursor));
      fAntCursor=fCursor;
      do {
	fCursor++;
	//gDebuger->message("cursor=%i end=%i",fCursor,fEnd);
      } while ( (fCursor<fEnd) && 
		(i=fCategory->fIndexTable->getIndex(fCursor))<0);
    } else r=NULL;
  } else {
    if (fCursor > fBegin ) {
      r=fCategory->fData->At(fCategory->fIndexTable->getIndex(fCursor));
      fAntCursor=fCursor;
      do {
	fCursor--;
      } while ( (fCursor>fBegin) && 
		(i=fCategory->fIndexTable->getIndex(fCursor))<0);
    } else r=NULL;
  }
  return r;
}

void HMatrixCatIter::Reset(void) {
  //Points the iterator to the first object in the category
#if DEBUG_LEVEL>2
  gDebuger->enterFunc("HMatrixCatIter::Reset");
#endif
  Int_t i=0;
  fSizes=fCategory->fIndexTable->getDimensions(); // ptr fSizes changes on read
  if (fDir==kIterForward) {
    fCursor=0;
    fBegin=0;
    fEnd=fCategory->fIndexTable->getEntries();
    fCurrentLoc.setNIndex(fSizes->fN);
    for (i=0;i<fSizes->fN;i++) fCurrentLoc[i]=0;

    while ( (fCursor<fEnd) && 
	    (i=fCategory->fIndexTable->getIndex(fCursor))<0) {
      fCursor++;
    }
    fBegin=fAntCursor=fCursor;
  } else {
    Int_t i;
    fCursor=fCategory->fIndexTable->getEntries()-1;
    fBegin=fCursor;
    fEnd=-1;
    fCurrentLoc.setNIndex(fSizes->GetSize());
    for (i=0;i<fSizes->GetSize();i++) {
      fCurrentLoc.setIndex(i,fSizes->At(i)-1);
    }
    while ( (fCursor>fBegin) && 
	      (i=fCategory->fIndexTable->getIndex(fCursor))<0) {
      fCursor--;
    }
    fBegin=fAntCursor=fCursor;
  }
#if DEBUG_LEVEL>2
  gDebuger->leaveFunc("HMatrixCatIter::Reset");
#endif
}

Bool_t HMatrixCatIter::gotoLocation(HLocation &loc) {
  //Points the iterator to the object given in the location loc
#if DEBUG_LEVEL>2
  gDebuger->enterFunc("HMatrixCatIter::gotoLocation");
#endif
  Int_t i=0;
  if (loc.getNIndex()==0) {
    Reset();
  } else {
    fCurrentLoc.readIndexes(loc);
    fCursor=fCurrentLoc.getLinearIndex(fSizes);
    fBegin=fCursor;
    ++loc;
    fEnd=loc.getLinearIndex(fSizes);
    if (fEnd>fCategory->fIndexTable->getEntries()) {
	fEnd=fCategory->fIndexTable->getEntries();
    }
    --loc;
    if (fCursor>=fCategory->fIndexTable->getEntries()) return kFALSE;
    if (fDir==kIterForward) {
      fCursor=fBegin;
      while ( (fCursor<fEnd) && 
	      (i=fCategory->fIndexTable->getIndex(fCursor))<0) {
	fCursor++;
      } 
      fBegin=fAntCursor=fCursor;
    } else {
      fCursor=fEnd;
      while ( (fCursor>fBegin) && 
	      (i=fCategory->fIndexTable->getIndex(fCursor))<0) {
	fCursor--;
      }
      fEnd=fAntCursor=fCursor;
    }
  }
  return kTRUE;
}

HLocation &HMatrixCatIter::getLocation(void) {
  //Gets the location of the currently pointed object.
  Int_t prod=1;
  Int_t i=0;
  for (i=fCurrentLoc.getNIndex()-1;i>-1;i--) {
    fCurrentLoc[i]=(fAntCursor/prod) % fSizes->fArray[i];
    prod*=fSizes->fArray[i];
  }
  return fCurrentLoc;
}
  
 hmatrixcatiter.cc:1
 hmatrixcatiter.cc:2
 hmatrixcatiter.cc:3
 hmatrixcatiter.cc:4
 hmatrixcatiter.cc:5
 hmatrixcatiter.cc:6
 hmatrixcatiter.cc:7
 hmatrixcatiter.cc:8
 hmatrixcatiter.cc:9
 hmatrixcatiter.cc:10
 hmatrixcatiter.cc:11
 hmatrixcatiter.cc:12
 hmatrixcatiter.cc:13
 hmatrixcatiter.cc:14
 hmatrixcatiter.cc:15
 hmatrixcatiter.cc:16
 hmatrixcatiter.cc:17
 hmatrixcatiter.cc:18
 hmatrixcatiter.cc:19
 hmatrixcatiter.cc:20
 hmatrixcatiter.cc:21
 hmatrixcatiter.cc:22
 hmatrixcatiter.cc:23
 hmatrixcatiter.cc:24
 hmatrixcatiter.cc:25
 hmatrixcatiter.cc:26
 hmatrixcatiter.cc:27
 hmatrixcatiter.cc:28
 hmatrixcatiter.cc:29
 hmatrixcatiter.cc:30
 hmatrixcatiter.cc:31
 hmatrixcatiter.cc:32
 hmatrixcatiter.cc:33
 hmatrixcatiter.cc:34
 hmatrixcatiter.cc:35
 hmatrixcatiter.cc:36
 hmatrixcatiter.cc:37
 hmatrixcatiter.cc:38
 hmatrixcatiter.cc:39
 hmatrixcatiter.cc:40
 hmatrixcatiter.cc:41
 hmatrixcatiter.cc:42
 hmatrixcatiter.cc:43
 hmatrixcatiter.cc:44
 hmatrixcatiter.cc:45
 hmatrixcatiter.cc:46
 hmatrixcatiter.cc:47
 hmatrixcatiter.cc:48
 hmatrixcatiter.cc:49
 hmatrixcatiter.cc:50
 hmatrixcatiter.cc:51
 hmatrixcatiter.cc:52
 hmatrixcatiter.cc:53
 hmatrixcatiter.cc:54
 hmatrixcatiter.cc:55
 hmatrixcatiter.cc:56
 hmatrixcatiter.cc:57
 hmatrixcatiter.cc:58
 hmatrixcatiter.cc:59
 hmatrixcatiter.cc:60
 hmatrixcatiter.cc:61
 hmatrixcatiter.cc:62
 hmatrixcatiter.cc:63
 hmatrixcatiter.cc:64
 hmatrixcatiter.cc:65
 hmatrixcatiter.cc:66
 hmatrixcatiter.cc:67
 hmatrixcatiter.cc:68
 hmatrixcatiter.cc:69
 hmatrixcatiter.cc:70
 hmatrixcatiter.cc:71
 hmatrixcatiter.cc:72
 hmatrixcatiter.cc:73
 hmatrixcatiter.cc:74
 hmatrixcatiter.cc:75
 hmatrixcatiter.cc:76
 hmatrixcatiter.cc:77
 hmatrixcatiter.cc:78
 hmatrixcatiter.cc:79
 hmatrixcatiter.cc:80
 hmatrixcatiter.cc:81
 hmatrixcatiter.cc:82
 hmatrixcatiter.cc:83
 hmatrixcatiter.cc:84
 hmatrixcatiter.cc:85
 hmatrixcatiter.cc:86
 hmatrixcatiter.cc:87
 hmatrixcatiter.cc:88
 hmatrixcatiter.cc:89
 hmatrixcatiter.cc:90
 hmatrixcatiter.cc:91
 hmatrixcatiter.cc:92
 hmatrixcatiter.cc:93
 hmatrixcatiter.cc:94
 hmatrixcatiter.cc:95
 hmatrixcatiter.cc:96
 hmatrixcatiter.cc:97
 hmatrixcatiter.cc:98
 hmatrixcatiter.cc:99
 hmatrixcatiter.cc:100
 hmatrixcatiter.cc:101
 hmatrixcatiter.cc:102
 hmatrixcatiter.cc:103
 hmatrixcatiter.cc:104
 hmatrixcatiter.cc:105
 hmatrixcatiter.cc:106
 hmatrixcatiter.cc:107
 hmatrixcatiter.cc:108
 hmatrixcatiter.cc:109
 hmatrixcatiter.cc:110
 hmatrixcatiter.cc:111
 hmatrixcatiter.cc:112
 hmatrixcatiter.cc:113
 hmatrixcatiter.cc:114
 hmatrixcatiter.cc:115
 hmatrixcatiter.cc:116
 hmatrixcatiter.cc:117
 hmatrixcatiter.cc:118
 hmatrixcatiter.cc:119
 hmatrixcatiter.cc:120
 hmatrixcatiter.cc:121
 hmatrixcatiter.cc:122
 hmatrixcatiter.cc:123
 hmatrixcatiter.cc:124
 hmatrixcatiter.cc:125
 hmatrixcatiter.cc:126
 hmatrixcatiter.cc:127
 hmatrixcatiter.cc:128
 hmatrixcatiter.cc:129
 hmatrixcatiter.cc:130
 hmatrixcatiter.cc:131
 hmatrixcatiter.cc:132
 hmatrixcatiter.cc:133
 hmatrixcatiter.cc:134
 hmatrixcatiter.cc:135
 hmatrixcatiter.cc:136
 hmatrixcatiter.cc:137
 hmatrixcatiter.cc:138
 hmatrixcatiter.cc:139
 hmatrixcatiter.cc:140
 hmatrixcatiter.cc:141
 hmatrixcatiter.cc:142
 hmatrixcatiter.cc:143
 hmatrixcatiter.cc:144
 hmatrixcatiter.cc:145
 hmatrixcatiter.cc:146
 hmatrixcatiter.cc:147
 hmatrixcatiter.cc:148
 hmatrixcatiter.cc:149
 hmatrixcatiter.cc:150
 hmatrixcatiter.cc:151
 hmatrixcatiter.cc:152
 hmatrixcatiter.cc:153
 hmatrixcatiter.cc:154
 hmatrixcatiter.cc:155
 hmatrixcatiter.cc:156
 hmatrixcatiter.cc:157
 hmatrixcatiter.cc:158
 hmatrixcatiter.cc:159
 hmatrixcatiter.cc:160
 hmatrixcatiter.cc:161
 hmatrixcatiter.cc:162
 hmatrixcatiter.cc:163
 hmatrixcatiter.cc:164