// @(#)root/star:$Name:  $Id: TGenericTable.cxx,v 1.3 2003/01/27 20:41:36 brun Exp $
// Author: Valery Fine(fine@bnl.gov)   30/06/2001
// Copyright(c) 2001 [BNL] Brookhaven National Laboratory, Valeri Fine  (fine@bnl.gov). All right reserved",
 
#include "TGenericTable.h"

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TGenericTable                                                       //
//                                                                      //
//  This is the class to represent the array of C-struct                //
//  defined at run-time                                                 //
//                                                                      //
//   Example: see $ROOTSYS/star/demo/staff.C                            //
//   -------                                                            //
// !{
// !//   example of macro to read data from an ascii file and
// !//   create a root file with an histogram and an ntuple.
// !//   A'la the famous ROOT/PAW staff data example 
// !//   ( see PAW - Long write up, CERN, page33. )
// !
// !   gROOT->Reset();
// !   gSystem->Load("libRootKernel");
// !
// !   struct staff_t {
// !                Int_t cat;
// !                Int_t division;
// !                Int_t flag;
// !                Int_t age;
// !                Int_t service;
// !                Int_t children;
// !                Int_t grade;
// !                Int_t step;
// !                Int_t nation;
// !                Int_t hrweek;
// !                Int_t cost;
// !    };
// !
// !   staff_t staff;
// !
// !   // open ASCII data file
// !   FILE *fp = fopen("staff.dat","r");
// !
// !   char line[81];
// !
// !   // Create the generic table for 1000 rows (it may grow then)
// !   TGenericTable *allStaff = new TGenericTable("staff_t","Staff-data",1000);
// !
// !   // Fill the memory resident table 
// !   while (fgets(&line,80,fp)) {
// !      sscanf(&line[0] ,"%d%d%d%d", &staff.cat,&staff.division,&staff.flag,&staff.age);
// !      sscanf(&line[13],"%d%d%d%d", &staff.service,&staff.children,&staff.grade,&staff.step);
// !      sscanf(&line[24],"%d%d%d",   &staff.nation,&staff.hrweek,&staff.cost);
// !      allStaff->AddAt(&staff);
// !   }
// !   fclose(fp);
// !   // Delete unused space;
// !   allStaff->Purge();
// !
// !   allStaff->Print(0,10);
// !
// !//  Create ROOT file
// !   TFile *f = new TFile("aptuple.root","RECREATE");
// !          allStaff->Write();
// !   f->Write();
// !
// !   // We should close  TFile otherwise all histograms we create below
// !   // may be written to the file too occasionaly
// !   f->Close();
// !
// !//  Create ROOT Browser
// !   new TBrowser("staff",allStaff);
// !
// !//  Create couple of the histograms
// !   TCanvas *canva = new TCanvas("Staff","CERN Population",600,600);
// !   canva->Divide(1,2);
// !
// !
// !// one can use 2 meta variable: 
// !//  n$ - the total number of the rows in the table
// !//  i$ - stands for the current row index i = [0 -> (n$-1)]
// !
// !   gStyle->SetHistFillColor(10);
// !   gStyle->SetHistFillStyle(3013);
// !   canva->cd(1);
// !   allStaff->Draw("age");
// !   canva->Update();
// !   canva->cd(2);
// !   allStaff->Draw("cost");
// !   canva->Update();
// !}
//
//////////////////////////////////////////////////////////////////////////

  ClassImp(TGenericTable) 
  TableClassStreamerImp(TGenericTable)

// Create TGenericTable by TTableDescriptor pointer
//______________________________________________________________________________
TGenericTable::TGenericTable(const TTableDescriptor &dsc, const Text_t *name) : TTable(name,dsc.Sizeof()),fColDescriptors(0) 
{ 
  ///////////////////////////////////////////////////////////
  //
  //   Create TGenericTable by TTableDescriptor pointer:
  //
  //   dsc   - Pointer to the table descriptor
  //   name  - The name of this object
  //
  ///////////////////////////////////////////////////////////

  // Create a private copy of the descriptor provided;
   SetDescriptorPointer(new TTableDescriptor(dsc));
   SetGenericType();
}     
//______________________________________________________________________________
TGenericTable::TGenericTable(const TTableDescriptor &dsc, Int_t n) : TTable("TGenericTable",n,dsc.Sizeof()),fColDescriptors(0)  
{
  ///////////////////////////////////////////////////////////
  //
  //   Create TGenericTable by TTableDescriptor pointer:
  //
  //   dsc   - Pointer to the table descriptor
  //   name  - "TGenericTable"
  //   n     - The initial number of allocated rows
  //
  ///////////////////////////////////////////////////////////

  // Create a provate copy of the descriptor provided;
   SetDescriptorPointer(new TTableDescriptor(dsc));
   SetGenericType();
}     

//______________________________________________________________________________
TGenericTable::TGenericTable(const TTableDescriptor &dsc,const Text_t *name,Int_t n) : TTable(name,n,dsc.Sizeof()),fColDescriptors(0)
{
  ///////////////////////////////////////////////////////////
  //
  //   Create TGenericTable by TTableDescriptor pointer:
  //
  //   dsc   - Pointer to the table descriptor
  //   name  - The name of this object
  //   n     - The initial number of allocated rows
  //
  ///////////////////////////////////////////////////////////

  // Create a provate copy of the descriptor provided;
   SetDescriptorPointer(new TTableDescriptor(dsc));
   SetGenericType();
}     

// Create TGenericTable by C structure name provided
//______________________________________________________________________________
TGenericTable::TGenericTable(const char *structName, const Text_t *name) : TTable(name,-1),fColDescriptors(0) 
{
  ///////////////////////////////////////////////////////////
  //
  //  Create TGenericTable by C structure name provided:
  //
  //   dsc   - Pointer to the table descriptor
  //   name  - The name of this object
  //   n     - The initial number of allocated rows
  //
  ///////////////////////////////////////////////////////////
  TTableDescriptor *dsc = TTableDescriptor::MakeDescriptor(structName);
  if (dsc) {
    SetDescriptorPointer(dsc);
    fSize = dsc->Sizeof();
  } 
  if ( !dsc || !fSize) Warning("TGenericTable","Wrong table format");
  SetGenericType();
}     
//______________________________________________________________________________
TGenericTable::TGenericTable(const char *structName, Int_t n) : TTable("TGenericTable",-1),fColDescriptors(0)
{
  ///////////////////////////////////////////////////////////
  //
  //  Create TGenericTable by C structure name provided:
  //
  //   dsc   - Pointer to the table descriptor
  //   name  - The name of this object
  //   n     - The initial number of allocated rows
  //
  ///////////////////////////////////////////////////////////

  TTableDescriptor *dsc = TTableDescriptor::MakeDescriptor(structName);
  if (dsc) {
    SetDescriptorPointer(dsc);
    fSize = dsc->Sizeof();
  } 
  if ( !dsc || !fSize) Warning("TGenericTable","Wrong table format");
  if (n > 0) Set(n);
  SetGenericType();
}     
//______________________________________________________________________________
TGenericTable::TGenericTable(const char *structName, const Text_t *name,Int_t n) : TTable(name,-1),fColDescriptors(0)
{
  ///////////////////////////////////////////////////////////
  //
  //   Create TGenericTable by C structure name provided:
  //
  //   dsc   - Pointer to the table descriptor
  //   name  - The name of this object
  //   n     - The initial number of allocated rows
  //
  ///////////////////////////////////////////////////////////
	
  TTableDescriptor *dsc = TTableDescriptor::MakeDescriptor(structName);
  if (dsc) {
    SetDescriptorPointer(dsc);
    fSize = dsc->Sizeof();
  } 
  if ( !dsc || !fSize) Warning("TGenericTable","Wrong table format dsc=0x%x, size=%d",dsc,fSize);
  if (n > 0) Set(n);
  SetGenericType();
}     

//______________________________________________________________________________
TGenericTable::~TGenericTable()
{
  delete fColDescriptors;
}
