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(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;
  HObjTable* pObjTab;

  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);
        pObjTab = 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);
   }
}


Last change: Sat May 22 13:04:49 2010
Last generated: 2010-05-22 13:04

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.