// @(#)root/table:$Id$
// Author: Valery Fine   09/08/99  (E-mail: fine@bnl.gov)

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TTableDescriptor
#define ROOT_TTableDescriptor

#include "TTable.h"
#include "tableDescriptor.h"

class TClass;
//______________________________________________________________________________
//
// TTableDescriptor - run-time descriptor of the TTable object rows.
//______________________________________________________________________________


class TTableDescriptor : public TTable {
private:
   TTableDescriptor &operator=(const TTableDescriptor &dsc); // Intentionally not implemented.
protected:
   friend class TTable;
   TClass  *fRowClass;                  // TClass defining
                                          // the table row C-structure
   TTableDescriptor *fSecondDescriptor; // shadow descriptor
                                          // to back TTable::Streamer
   static TString fgCommentsName;        // The name of dataset to keep the comments fields
   virtual void Init(TClass *classPtr);
   static void SetCommentsSetName(const char *name=".comments");

public:

   TTableDescriptor(const TTable *parentTable);
   TTableDescriptor(TClass *classPtr);
   TTableDescriptor(const TTableDescriptor &dsc):TTable(dsc),fRowClass(dsc.fRowClass),fSecondDescriptor(0){}
   virtual ~TTableDescriptor();
   virtual  Int_t  AddAt(const void *c);
   virtual  void   AddAt(const void *c, Int_t i);
   virtual  void   AddAt(const tableDescriptor_st &element, const char *comment,Int_t indx);
   virtual  void   AddAt(TDataSet *dataset,Int_t idx=0);
   TString         CreateLeafList() const;
   void            LearnTable(const TTable *parentTable);
   void            LearnTable(TClass *classPtr);
   const Char_t   *ColumnName(Int_t columnIndex)              const;
   Int_t           ColumnByName(const Char_t *columnName=0)   const;
   UInt_t          NumberOfColumns()                          const;
   const UInt_t   *IndexArray(Int_t columnIndex)              const;
   UInt_t          Offset(Int_t columnIndex)                  const;
   Int_t           Offset(const Char_t *columnName=0)         const;
   UInt_t          ColumnSize(Int_t columnIndex)              const;
   Int_t           ColumnSize(const Char_t *columnName=0)     const;
   UInt_t          TypeSize(Int_t columnIndex)                const;
   Int_t           TypeSize(const Char_t *columnName=0)       const;
   UInt_t          Dimensions(Int_t columnIndex)              const;
   Int_t           Dimensions(const Char_t *columnName=0)     const;
   TTable::EColumnType ColumnType(Int_t columnIndex)          const;
   TTable::EColumnType ColumnType(const Char_t *columnName=0) const;
   TClass         *RowClass() const;
   void            SetOffset(UInt_t offset,Int_t column);
   void            SetSize(UInt_t size,Int_t column);
   void            SetTypeSize(UInt_t size,Int_t column);
   void            SetDimensions(UInt_t dim,Int_t column);
   Int_t           Sizeof() const;
   void            SetColumnType(TTable::EColumnType type,Int_t column);
   virtual Int_t   UpdateOffsets(const TTableDescriptor *newDesciptor);

   static          TTableDescriptor *MakeDescriptor(const char *structName);
   TDataSet       *MakeCommentField(Bool_t createFlag=kTRUE);

//    ClassDefTable(TTableDescriptor,tableDescriptor_st)
protected:
   static  TTableDescriptor *fgColDescriptors;
   virtual TTableDescriptor *GetDescriptorPointer() const;
   virtual void SetDescriptorPointer(TTableDescriptor *list);
public:
   typedef tableDescriptor_st* iterator;
   TTableDescriptor() : TTable("TTableDescriptor",sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");}
   TTableDescriptor(const char *name) : TTable(name,sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");}
   TTableDescriptor(Int_t n) : TTable("TTableDescriptor",n,sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");}
   TTableDescriptor(const char *name,Int_t n) : TTable(name,n,sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");}
   tableDescriptor_st *GetTable(Int_t i=0) const { return ((tableDescriptor_st *)GetArray())+i;}
   tableDescriptor_st &operator[](Int_t i){ assert(i>=0 && i < GetNRows()); return *GetTable(i); }
   const tableDescriptor_st &operator[](Int_t i) const { assert(i>=0 && i < GetNRows()); return *((const tableDescriptor_st *)(GetTable(i))); }
   tableDescriptor_st *begin() const  {                      return GetNRows()? GetTable(0):0;}
   tableDescriptor_st *end()   const  {Long_t i = GetNRows(); return          i? GetTable(i):0;}
   static const char *TableDictionary();
   ClassDef(TTableDescriptor,0) // descrpitor defining the internal layout of TTable objects
};

//______________________________________________________________________________
// inline  TTableDescriptor(const TTableDescriptor &dsc) : TTable(dsc), fRowClass(dsc.fRowClass),fSecondDescriptor(0){}
inline  const Char_t *TTableDescriptor::ColumnName(Int_t column)const {return ((tableDescriptor_st *)At(column))->fColumnName;}
inline  UInt_t  TTableDescriptor::Offset(Int_t column)          const {return ((tableDescriptor_st *)At(column))->fOffset;    }
inline  const UInt_t *TTableDescriptor::IndexArray(Int_t column)const {return ((tableDescriptor_st *)At(column))->fIndexArray;}
inline  UInt_t  TTableDescriptor::NumberOfColumns()             const {return  GetNRows();                                      }
inline  UInt_t  TTableDescriptor::ColumnSize(Int_t column)      const {return ((tableDescriptor_st *)At(column))->fSize;      }
inline  UInt_t  TTableDescriptor::TypeSize(Int_t column)        const {return ((tableDescriptor_st *)At(column))->fTypeSize;  }
inline  UInt_t  TTableDescriptor::Dimensions(Int_t column)      const {return ((tableDescriptor_st *)At(column))->fDimensions;}
inline  TTable::EColumnType TTableDescriptor::ColumnType(Int_t column) const {return EColumnType(((tableDescriptor_st *)At(column))->fType);}
inline  TClass *TTableDescriptor::RowClass() const { return fRowClass;}
inline  void    TTableDescriptor::SetOffset(UInt_t offset,Int_t column)  {((tableDescriptor_st *)At(column))->fOffset     = offset;}
inline  void    TTableDescriptor::SetSize(UInt_t size,Int_t column)      {((tableDescriptor_st *)At(column))->fSize       = size;  }
inline  void    TTableDescriptor::SetTypeSize(UInt_t size,Int_t column)  {((tableDescriptor_st *)At(column))->fTypeSize   = size;  }
inline  void    TTableDescriptor::SetDimensions(UInt_t dim,Int_t column) {((tableDescriptor_st *)At(column))->fDimensions = dim;   }
inline  void    TTableDescriptor::SetColumnType(TTable::EColumnType type,Int_t column) {((tableDescriptor_st *)At(column))->fType = type;  }

#endif
 TTableDescriptor.h:1
 TTableDescriptor.h:2
 TTableDescriptor.h:3
 TTableDescriptor.h:4
 TTableDescriptor.h:5
 TTableDescriptor.h:6
 TTableDescriptor.h:7
 TTableDescriptor.h:8
 TTableDescriptor.h:9
 TTableDescriptor.h:10
 TTableDescriptor.h:11
 TTableDescriptor.h:12
 TTableDescriptor.h:13
 TTableDescriptor.h:14
 TTableDescriptor.h:15
 TTableDescriptor.h:16
 TTableDescriptor.h:17
 TTableDescriptor.h:18
 TTableDescriptor.h:19
 TTableDescriptor.h:20
 TTableDescriptor.h:21
 TTableDescriptor.h:22
 TTableDescriptor.h:23
 TTableDescriptor.h:24
 TTableDescriptor.h:25
 TTableDescriptor.h:26
 TTableDescriptor.h:27
 TTableDescriptor.h:28
 TTableDescriptor.h:29
 TTableDescriptor.h:30
 TTableDescriptor.h:31
 TTableDescriptor.h:32
 TTableDescriptor.h:33
 TTableDescriptor.h:34
 TTableDescriptor.h:35
 TTableDescriptor.h:36
 TTableDescriptor.h:37
 TTableDescriptor.h:38
 TTableDescriptor.h:39
 TTableDescriptor.h:40
 TTableDescriptor.h:41
 TTableDescriptor.h:42
 TTableDescriptor.h:43
 TTableDescriptor.h:44
 TTableDescriptor.h:45
 TTableDescriptor.h:46
 TTableDescriptor.h:47
 TTableDescriptor.h:48
 TTableDescriptor.h:49
 TTableDescriptor.h:50
 TTableDescriptor.h:51
 TTableDescriptor.h:52
 TTableDescriptor.h:53
 TTableDescriptor.h:54
 TTableDescriptor.h:55
 TTableDescriptor.h:56
 TTableDescriptor.h:57
 TTableDescriptor.h:58
 TTableDescriptor.h:59
 TTableDescriptor.h:60
 TTableDescriptor.h:61
 TTableDescriptor.h:62
 TTableDescriptor.h:63
 TTableDescriptor.h:64
 TTableDescriptor.h:65
 TTableDescriptor.h:66
 TTableDescriptor.h:67
 TTableDescriptor.h:68
 TTableDescriptor.h:69
 TTableDescriptor.h:70
 TTableDescriptor.h:71
 TTableDescriptor.h:72
 TTableDescriptor.h:73
 TTableDescriptor.h:74
 TTableDescriptor.h:75
 TTableDescriptor.h:76
 TTableDescriptor.h:77
 TTableDescriptor.h:78
 TTableDescriptor.h:79
 TTableDescriptor.h:80
 TTableDescriptor.h:81
 TTableDescriptor.h:82
 TTableDescriptor.h:83
 TTableDescriptor.h:84
 TTableDescriptor.h:85
 TTableDescriptor.h:86
 TTableDescriptor.h:87
 TTableDescriptor.h:88
 TTableDescriptor.h:89
 TTableDescriptor.h:90
 TTableDescriptor.h:91
 TTableDescriptor.h:92
 TTableDescriptor.h:93
 TTableDescriptor.h:94
 TTableDescriptor.h:95
 TTableDescriptor.h:96
 TTableDescriptor.h:97
 TTableDescriptor.h:98
 TTableDescriptor.h:99
 TTableDescriptor.h:100
 TTableDescriptor.h:101
 TTableDescriptor.h:102
 TTableDescriptor.h:103
 TTableDescriptor.h:104
 TTableDescriptor.h:105
 TTableDescriptor.h:106
 TTableDescriptor.h:107
 TTableDescriptor.h:108
 TTableDescriptor.h:109
 TTableDescriptor.h:110
 TTableDescriptor.h:111
 TTableDescriptor.h:112
 TTableDescriptor.h:113
 TTableDescriptor.h:114