1 // @(#)root/table:$Id$ 2 // Author: Valery Fine 09/08/99 (E-mail: fine@bnl.gov) 3 4 /************************************************************************* 5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * 6 * All rights reserved. * 7 * * 8 * For the licensing terms see $ROOTSYS/LICENSE. * 9 * For the list of contributors see $ROOTSYS/README/CREDITS. * 10 *************************************************************************/ 11 12 #ifndef ROOT_TTableDescriptor 13 #define ROOT_TTableDescriptor 14 15 #include "TTable.h" 16 #include "tableDescriptor.h" 17 18 class TClass; 19 //______________________________________________________________________________ 20 // 21 // TTableDescriptor - run-time descriptor of the TTable object rows. 22 //______________________________________________________________________________ 23 24 25 class TTableDescriptor : public TTable { 26 private: 27 TTableDescriptor &operator=(const TTableDescriptor &dsc); // Intentionally not implemented. 28 protected: 29 friend class TTable; 30 TClass *fRowClass; // TClass defining 31 // the table row C-structure 32 TTableDescriptor *fSecondDescriptor; // shadow descriptor 33 // to back TTable::Streamer 34 static TString fgCommentsName; // The name of dataset to keep the comments fields 35 virtual void Init(TClass *classPtr); 36 static void SetCommentsSetName(const char *name=".comments"); 37 38 public: 39 40 TTableDescriptor(const TTable *parentTable); 41 TTableDescriptor(TClass *classPtr); 42 TTableDescriptor(const TTableDescriptor &dsc):TTable(dsc),fRowClass(dsc.fRowClass),fSecondDescriptor(0){} 43 virtual ~TTableDescriptor(); 44 virtual Int_t AddAt(const void *c); 45 virtual void AddAt(const void *c, Int_t i); 46 virtual void AddAt(const tableDescriptor_st &element, const char *comment,Int_t indx); 47 virtual void AddAt(TDataSet *dataset,Int_t idx=0); 48 TString CreateLeafList() const; 49 void LearnTable(const TTable *parentTable); 50 void LearnTable(TClass *classPtr); 51 const Char_t *ColumnName(Int_t columnIndex) const; 52 Int_t ColumnByName(const Char_t *columnName=0) const; 53 UInt_t NumberOfColumns() const; 54 const UInt_t *IndexArray(Int_t columnIndex) const; 55 UInt_t Offset(Int_t columnIndex) const; 56 Int_t Offset(const Char_t *columnName=0) const; 57 UInt_t ColumnSize(Int_t columnIndex) const; 58 Int_t ColumnSize(const Char_t *columnName=0) const; 59 UInt_t TypeSize(Int_t columnIndex) const; 60 Int_t TypeSize(const Char_t *columnName=0) const; 61 UInt_t Dimensions(Int_t columnIndex) const; 62 Int_t Dimensions(const Char_t *columnName=0) const; 63 TTable::EColumnType ColumnType(Int_t columnIndex) const; 64 TTable::EColumnType ColumnType(const Char_t *columnName=0) const; 65 TClass *RowClass() const; 66 void SetOffset(UInt_t offset,Int_t column); 67 void SetSize(UInt_t size,Int_t column); 68 void SetTypeSize(UInt_t size,Int_t column); 69 void SetDimensions(UInt_t dim,Int_t column); 70 Int_t Sizeof() const; 71 void SetColumnType(TTable::EColumnType type,Int_t column); 72 virtual Int_t UpdateOffsets(const TTableDescriptor *newDesciptor); 73 74 static TTableDescriptor *MakeDescriptor(const char *structName); 75 TDataSet *MakeCommentField(Bool_t createFlag=kTRUE); 76 77 // ClassDefTable(TTableDescriptor,tableDescriptor_st) 78 protected: 79 static TTableDescriptor *fgColDescriptors; 80 virtual TTableDescriptor *GetDescriptorPointer() const; 81 virtual void SetDescriptorPointer(TTableDescriptor *list); 82 public: 83 typedef tableDescriptor_st* iterator; 84 TTableDescriptor() : TTable("TTableDescriptor",sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");} 85 TTableDescriptor(const char *name) : TTable(name,sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");} 86 TTableDescriptor(Int_t n) : TTable("TTableDescriptor",n,sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");} 87 TTableDescriptor(const char *name,Int_t n) : TTable(name,n,sizeof(tableDescriptor_st)), fRowClass(0), fSecondDescriptor(0) {SetType("tableDescriptor_st");} 88 tableDescriptor_st *GetTable(Int_t i=0) const { return ((tableDescriptor_st *)GetArray())+i;} 89 tableDescriptor_st &operator[](Int_t i){ assert(i>=0 && i < GetNRows()); return *GetTable(i); } 90 const tableDescriptor_st &operator[](Int_t i) const { assert(i>=0 && i < GetNRows()); return *((const tableDescriptor_st *)(GetTable(i))); } 91 tableDescriptor_st *begin() const { return GetNRows()? GetTable(0):0;} 92 tableDescriptor_st *end() const {Long_t i = GetNRows(); return i? GetTable(i):0;} 93 static const char *TableDictionary(); 94 ClassDef(TTableDescriptor,0) // descrpitor defining the internal layout of TTable objects 95 }; 96 97 //______________________________________________________________________________ 98 // inline TTableDescriptor(const TTableDescriptor &dsc) : TTable(dsc), fRowClass(dsc.fRowClass),fSecondDescriptor(0){} 99 inline const Char_t *TTableDescriptor::ColumnName(Int_t column)const {return ((tableDescriptor_st *)At(column))->fColumnName;} 100 inline UInt_t TTableDescriptor::Offset(Int_t column) const {return ((tableDescriptor_st *)At(column))->fOffset; } 101 inline const UInt_t *TTableDescriptor::IndexArray(Int_t column)const {return ((tableDescriptor_st *)At(column))->fIndexArray;} 102 inline UInt_t TTableDescriptor::NumberOfColumns() const {return GetNRows(); } 103 inline UInt_t TTableDescriptor::ColumnSize(Int_t column) const {return ((tableDescriptor_st *)At(column))->fSize; } 104 inline UInt_t TTableDescriptor::TypeSize(Int_t column) const {return ((tableDescriptor_st *)At(column))->fTypeSize; } 105 inline UInt_t TTableDescriptor::Dimensions(Int_t column) const {return ((tableDescriptor_st *)At(column))->fDimensions;} 106 inline TTable::EColumnType TTableDescriptor::ColumnType(Int_t column) const {return EColumnType(((tableDescriptor_st *)At(column))->fType);} 107 inline TClass *TTableDescriptor::RowClass() const { return fRowClass;} 108 inline void TTableDescriptor::SetOffset(UInt_t offset,Int_t column) {((tableDescriptor_st *)At(column))->fOffset = offset;} 109 inline void TTableDescriptor::SetSize(UInt_t size,Int_t column) {((tableDescriptor_st *)At(column))->fSize = size; } 110 inline void TTableDescriptor::SetTypeSize(UInt_t size,Int_t column) {((tableDescriptor_st *)At(column))->fTypeSize = size; } 111 inline void TTableDescriptor::SetDimensions(UInt_t dim,Int_t column) {((tableDescriptor_st *)At(column))->fDimensions = dim; } 112 inline void TTableDescriptor::SetColumnType(TTable::EColumnType type,Int_t column) {((tableDescriptor_st *)At(column))->fType = type; } 113 114 #endif 115