ROOT logo
using namespace std;
#include "TROOT.h"
#include "TClass.h"
#include <fstream> 
#include "hobjtable.h"

ClassImp(HObjTable)

HObjTable::HObjTable()
{
  m_nNIndexes = 0;
  m_pIndexTab = NULL;
  m_fData = NULL;
  m_pNullObject = NULL;
}

HObjTable::~HObjTable() {
    if (m_pNullObject) delete m_pNullObject;
    clearTab();
}

void HObjTable::setSizes(Int_t nNIndexes, Int_t *pSizes)
{
  clearTab();
  m_nNIndexes = nNIndexes;
  m_pIndexTab = new Int_t[m_nNIndexes];

  for(Int_t i = 0; i < nNIndexes; i++)
     m_pIndexTab[i] = pSizes[i];
}

void HObjTable::set(Int_t nNIndexes,...)
{
  Int_t *pTab = new Int_t[nNIndexes];

  va_list ap;
  va_start (ap, nNIndexes);

  for(Int_t i = 0; i < nNIndexes; i++)
      pTab[i]=va_arg(ap,Int_t);

  setSizes(nNIndexes, pTab);

  va_end(ap);

  delete [] pTab;
}

void HObjTable::setCellClassName(const Char_t* pszName)
{
  strncpy(m_szClassName, pszName, sizeof(m_szClassName));
  if (m_pNullObject) delete m_pNullObject;
  m_pNullObject = (TObject*)gROOT->GetClass(m_szClassName)->New();
}

Char_t* HObjTable::getCellClassName()
{
  return m_szClassName;
}

void HObjTable::clearTab()
{
  if (m_pIndexTab)
  {
    delete [] m_pIndexTab;
    m_pIndexTab = NULL;
    m_nNIndexes = 0;
  }

  if (m_fData)
  {
    deleteTab();
    delete m_fData;
    m_fData = NULL;
  }
}  

void HObjTable::deleteTab()
{
  if (m_nNIndexes > 1)
    for(Int_t i = 0; i < m_pIndexTab[0]; i++)
    {
      HObjTable* objtab = (HObjTable*)getObject(i);
      if (objtab) objtab->deleteTab();       
    }
  
  if(m_nNIndexes)
    m_fData->Delete();
}

Int_t HObjTable::makeObjTable()
{
  Int_t i;
  HLocation loc;

  if (!m_pIndexTab)
    return 0;

  loc.set(1, m_pIndexTab[0]);

  if(m_nNIndexes == 1)
      m_fData = new TClonesArray(m_szClassName, m_pIndexTab[0]);
  else {
      m_fData = new TClonesArray("HObjTable", m_pIndexTab[0]);
      for(i = 0; i < m_pIndexTab[0]; i++)
      {
        
        loc[0] = i;
        HObjTable *pObjTabSlot = (HObjTable*)getSlot(loc);
        makeSubObjTable(m_nNIndexes - 1, m_pIndexTab + 1, pObjTabSlot);
      }
  }

  return m_fData ? 1 : 0;
}
 
HObjTable* HObjTable::makeSubObjTable(Int_t nNIndexes, Int_t *pSizes, TObject* pObj)
{
  HObjTable *fObjTab;

  fObjTab = new(pObj) HObjTable;
  fObjTab->setSizes(nNIndexes, pSizes);
  fObjTab->setCellClassName(m_szClassName);
  fObjTab->makeObjTable();

  return fObjTab;
}  
     

TObject *&HObjTable::getSlot(Int_t nIndx)
{
  return (m_fData->operator[](nIndx));
}

TObject *&HObjTable::getSlot(HLocation &aLoc) {
 HLocation aLoc1;

  if (aLoc.getNIndex() == 1)
     return getSlot(aLoc[0]); 

 aLoc1.setNIndex(aLoc.getNIndex() - 1);
 for (Int_t i = 0; i < aLoc1.getNIndex(); i++)
   aLoc1[i] = aLoc[i + 1];

 HObjTable* pTab = (HObjTable*)getObject(aLoc[0]);

 return pTab->getSlot(aLoc1);
}

TObject* HObjTable::getObject(Int_t nIndx)
{
/*
  if (nIndx < m_nNIndexes) {
     cerr << "ERROR: Table SIZE = " << m_nNIndexes << " Index = " << nIndx << endl;
     return m_pNullObject;
  }
*/
//  TObject* pObj = (TObject *)m_fData->At(nIndx);
  TObject* pObj = (TObject *)(*m_fData)[nIndx];
  return (pObj) ? pObj : m_pNullObject;
}

TObject* HObjTable::getObject(HLocation &aLoc) {
 HLocation aLoc1;

 if (aLoc.getNIndex() == 1)
   return getObject(aLoc[0]); 

 aLoc1.setNIndex(aLoc.getNIndex() - 1);
 for (Int_t i = 0; i < aLoc1.getNIndex(); i++)
   aLoc1[i] = aLoc[i + 1];

 HObjTable* pTab = (HObjTable*)getObject(aLoc[0]);

 return (TObject *)pTab->getObject(aLoc1);
}

TClonesArray *HObjTable::getClones(HLocation &aLoc) {
 return m_fData;
}

//______________________________________________________________________________
void HObjTable::Streamer(TBuffer &R__b)
{
   // Stream an object of class HObjTable.

   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
      clearTab();
      TObject::Streamer(R__b);
      R__b >> m_nNIndexes;
      m_pIndexTab = new Int_t[m_nNIndexes];
      R__b.ReadFastArray(m_pIndexTab, m_nNIndexes);
      R__b >> m_pNullObject;
      R__b.ReadStaticArray(m_szClassName);
      if(m_nNIndexes == 1)
          m_fData = new TClonesArray(m_szClassName, m_pIndexTab[0]);
      else 
          m_fData = new TClonesArray("HObjTable", m_pIndexTab[0]);
      m_fData->Streamer(R__b);
   } else {
      R__b.WriteVersion(HObjTable::IsA());
      TObject::Streamer(R__b);
      R__b << m_nNIndexes;
      R__b.WriteFastArray(m_pIndexTab, m_nNIndexes);
      R__b << m_pNullObject;
      R__b.WriteArray(m_szClassName, 40);
      m_fData->Streamer(R__b);
   }
}

 hobjtable.cc:1
 hobjtable.cc:2
 hobjtable.cc:3
 hobjtable.cc:4
 hobjtable.cc:5
 hobjtable.cc:6
 hobjtable.cc:7
 hobjtable.cc:8
 hobjtable.cc:9
 hobjtable.cc:10
 hobjtable.cc:11
 hobjtable.cc:12
 hobjtable.cc:13
 hobjtable.cc:14
 hobjtable.cc:15
 hobjtable.cc:16
 hobjtable.cc:17
 hobjtable.cc:18
 hobjtable.cc:19
 hobjtable.cc:20
 hobjtable.cc:21
 hobjtable.cc:22
 hobjtable.cc:23
 hobjtable.cc:24
 hobjtable.cc:25
 hobjtable.cc:26
 hobjtable.cc:27
 hobjtable.cc:28
 hobjtable.cc:29
 hobjtable.cc:30
 hobjtable.cc:31
 hobjtable.cc:32
 hobjtable.cc:33
 hobjtable.cc:34
 hobjtable.cc:35
 hobjtable.cc:36
 hobjtable.cc:37
 hobjtable.cc:38
 hobjtable.cc:39
 hobjtable.cc:40
 hobjtable.cc:41
 hobjtable.cc:42
 hobjtable.cc:43
 hobjtable.cc:44
 hobjtable.cc:45
 hobjtable.cc:46
 hobjtable.cc:47
 hobjtable.cc:48
 hobjtable.cc:49
 hobjtable.cc:50
 hobjtable.cc:51
 hobjtable.cc:52
 hobjtable.cc:53
 hobjtable.cc:54
 hobjtable.cc:55
 hobjtable.cc:56
 hobjtable.cc:57
 hobjtable.cc:58
 hobjtable.cc:59
 hobjtable.cc:60
 hobjtable.cc:61
 hobjtable.cc:62
 hobjtable.cc:63
 hobjtable.cc:64
 hobjtable.cc:65
 hobjtable.cc:66
 hobjtable.cc:67
 hobjtable.cc:68
 hobjtable.cc:69
 hobjtable.cc:70
 hobjtable.cc:71
 hobjtable.cc:72
 hobjtable.cc:73
 hobjtable.cc:74
 hobjtable.cc:75
 hobjtable.cc:76
 hobjtable.cc:77
 hobjtable.cc:78
 hobjtable.cc:79
 hobjtable.cc:80
 hobjtable.cc:81
 hobjtable.cc:82
 hobjtable.cc:83
 hobjtable.cc:84
 hobjtable.cc:85
 hobjtable.cc:86
 hobjtable.cc:87
 hobjtable.cc:88
 hobjtable.cc:89
 hobjtable.cc:90
 hobjtable.cc:91
 hobjtable.cc:92
 hobjtable.cc:93
 hobjtable.cc:94
 hobjtable.cc:95
 hobjtable.cc:96
 hobjtable.cc:97
 hobjtable.cc:98
 hobjtable.cc:99
 hobjtable.cc:100
 hobjtable.cc:101
 hobjtable.cc:102
 hobjtable.cc:103
 hobjtable.cc:104
 hobjtable.cc:105
 hobjtable.cc:106
 hobjtable.cc:107
 hobjtable.cc:108
 hobjtable.cc:109
 hobjtable.cc:110
 hobjtable.cc:111
 hobjtable.cc:112
 hobjtable.cc:113
 hobjtable.cc:114
 hobjtable.cc:115
 hobjtable.cc:116
 hobjtable.cc:117
 hobjtable.cc:118
 hobjtable.cc:119
 hobjtable.cc:120
 hobjtable.cc:121
 hobjtable.cc:122
 hobjtable.cc:123
 hobjtable.cc:124
 hobjtable.cc:125
 hobjtable.cc:126
 hobjtable.cc:127
 hobjtable.cc:128
 hobjtable.cc:129
 hobjtable.cc:130
 hobjtable.cc:131
 hobjtable.cc:132
 hobjtable.cc:133
 hobjtable.cc:134
 hobjtable.cc:135
 hobjtable.cc:136
 hobjtable.cc:137
 hobjtable.cc:138
 hobjtable.cc:139
 hobjtable.cc:140
 hobjtable.cc:141
 hobjtable.cc:142
 hobjtable.cc:143
 hobjtable.cc:144
 hobjtable.cc:145
 hobjtable.cc:146
 hobjtable.cc:147
 hobjtable.cc:148
 hobjtable.cc:149
 hobjtable.cc:150
 hobjtable.cc:151
 hobjtable.cc:152
 hobjtable.cc:153
 hobjtable.cc:154
 hobjtable.cc:155
 hobjtable.cc:156
 hobjtable.cc:157
 hobjtable.cc:158
 hobjtable.cc:159
 hobjtable.cc:160
 hobjtable.cc:161
 hobjtable.cc:162
 hobjtable.cc:163
 hobjtable.cc:164
 hobjtable.cc:165
 hobjtable.cc:166
 hobjtable.cc:167
 hobjtable.cc:168
 hobjtable.cc:169
 hobjtable.cc:170
 hobjtable.cc:171
 hobjtable.cc:172
 hobjtable.cc:173
 hobjtable.cc:174
 hobjtable.cc:175
 hobjtable.cc:176
 hobjtable.cc:177
 hobjtable.cc:178
 hobjtable.cc:179
 hobjtable.cc:180
 hobjtable.cc:181
 hobjtable.cc:182
 hobjtable.cc:183
 hobjtable.cc:184
 hobjtable.cc:185
 hobjtable.cc:186
 hobjtable.cc:187
 hobjtable.cc:188
 hobjtable.cc:189
 hobjtable.cc:190
 hobjtable.cc:191
 hobjtable.cc:192
 hobjtable.cc:193
 hobjtable.cc:194
 hobjtable.cc:195
 hobjtable.cc:196
 hobjtable.cc:197
 hobjtable.cc:198
 hobjtable.cc:199
 hobjtable.cc:200
 hobjtable.cc:201
 hobjtable.cc:202
 hobjtable.cc:203
 hobjtable.cc:204
 hobjtable.cc:205
 hobjtable.cc:206
 hobjtable.cc:207
 hobjtable.cc:208
 hobjtable.cc:209
 hobjtable.cc:210
 hobjtable.cc:211