// @(#)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.             *
 *************************************************************************/

#include <stdlib.h>

#include "TTableDescriptor.h"
#include "TTable.h"
#include "TClass.h"
#include "TDataMember.h"
#include "TDataType.h"
#include "Ttypes.h"
#include "TInterpreter.h"

#include "TError.h"

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

TTableDescriptor *TTableDescriptor::fgColDescriptors = 0;
// TString TTableDescriptor::fgCommentsName = TTableDescriptor::SetCommentsSetName();
TString TTableDescriptor::fgCommentsName = ".comments";
TableClassImp(TTableDescriptor,tableDescriptor_st)

//___________________________________________________________________
TTableDescriptor *TTableDescriptor::GetDescriptorPointer() const
{
   //return column descriptor
   return fgColDescriptors;
}

//___________________________________________________________________
void TTableDescriptor::SetDescriptorPointer(TTableDescriptor *list)
{
   //set table descriptor
   fgColDescriptors = list;
}

//___________________________________________________________________
void TTableDescriptor::SetCommentsSetName(const char *name)
{
   //set comments name
   fgCommentsName =  name;
}


//______________________________________________________________________________
void TTableDescriptor::Streamer(TBuffer &R__b)
{
   // The custom Streamer for this table
   fSecondDescriptor = 0;
   TTable::Streamer(R__b);
}

//______________________________________________________________________________
TTableDescriptor::TTableDescriptor(const TTable *parentTable)
 : TTable("tableDescriptor",sizeof(tableDescriptor_st)), fRowClass(0),fSecondDescriptor(0)
{
   //to be documented
   if (parentTable) {
      TClass *classPtr = parentTable->GetRowClass();
      Init(classPtr);
   }
   else MakeZombie();
}

//______________________________________________________________________________
TTableDescriptor::TTableDescriptor(TClass *classPtr)
 : TTable("tableDescriptor",sizeof(tableDescriptor_st)),fRowClass(0),fSecondDescriptor(0)
{
   // Create a descriptor of the C-structure defined by TClass
   // TClass *classPtr must be a valid pointer to TClass object for
   // "plain" C_struture only !!!
   Init(classPtr);
}
//______________________________________________________________________________
TTableDescriptor::~TTableDescriptor()
{
   // class destructor
#ifdef NORESTRICTIONS
   if (!IsZombie()) {
      for (Int_t i=0;i<GetNRows();i++) {
         Char_t *name = (Char_t *)ColumnName(i);
         if (name) delete [] name;
         UInt_t  *indxArray = (UInt_t *)IndexArray(i);
         if (indxArray) delete [] indxArray;
      }
   }
#endif
   if (fSecondDescriptor != this) {
      delete fSecondDescriptor;
      fSecondDescriptor = 0;
   }
}

//____________________________________________________________________________
Int_t TTableDescriptor::AddAt(const void *c)
{
   // Append one row pointed by "c" to the descriptor

   if (!c) return -1;
   TDataSet *cmnt = MakeCommentField();
   R__ASSERT(cmnt!=0);

   return TTable::AddAt(c);
}
//____________________________________________________________________________
void  TTableDescriptor::AddAt(const void *c, Int_t i)
{
   //Add one row pointed by "c" to the "i"-th row of the descriptor
   if (c) {
      tableDescriptor_st *element = (tableDescriptor_st *)c;
#ifdef NORESTRICTIONS
      const char *comment = element->fColumnName && element->fColumnName[0] ? element->fColumnName : "N/A";
#else
      const char *comment = element->fColumnName[0] ? element->fColumnName : "N/A";
#endif
      AddAt(*(tableDescriptor_st *)c,comment,i);
   }
}

//____________________________________________________________________________
void  TTableDescriptor::AddAt(TDataSet *dataset,Int_t idx)
{
   // Add one dataset to the descriptor.
   // There is no new implementation here.
   // One needs it to avoid the "hidden method" compilation warning
   TTable::AddAt(dataset,idx);
}

//____________________________________________________________________________
void TTableDescriptor::AddAt(const tableDescriptor_st &element,const char *commentText,Int_t indx)
{
   // Add the descriptor element followed by its commentText
   // at the indx-th position of the descriptor (counted from zero)

   TTable::AddAt(&element,indx);
   TDataSet *cmnt = MakeCommentField();
   R__ASSERT(cmnt!=0);
   TDataSet *comment = new TDataSet(element.fColumnName);
   comment->SetTitle(commentText);
   cmnt->AddAtAndExpand(comment,indx);
}

//____________________________________________________________________________
TString TTableDescriptor::CreateLeafList() const
{
   // Create a list of leaf to be useful for TBranch::TBranch ctor
   const Char_t typeMapTBranch[]="\0FIISDiisbBC";
   Int_t maxRows = NumberOfColumns();
   TString string;
   for (Int_t i=0;i<maxRows;i++){
      if (i) string += ":";
      UInt_t nDim = Dimensions(i);

      UInt_t totalSize = 1;
      UInt_t k = 0;

      if (nDim) {
         const UInt_t *indx = IndexArray(i);
         if (!indx){
            string = "";
            Error("CreateLeafList()","Can not create leaflist for arrays");
            return string;
         }
         for (k=0;k< nDim; k++) totalSize *= indx[k];
      }
      const Char_t *colName = ColumnName(i);
      if (totalSize > 1) {
         for ( k = 0; k < totalSize; k++) {
            Char_t buf[10];
            snprintf(buf,10,"_%d",k);
            string += colName;
            string += buf;
            if (k==0) {
               string += "/";
               string += typeMapTBranch[ColumnType(i)];
            }
            if (k != totalSize -1) string += ":";
         }
      } else {
         string += ColumnName(i);
         string += "/";
         string += typeMapTBranch[ColumnType(i)];
      }
   }
   return string;
}

//______________________________________________________________________________
void TTableDescriptor::Init(TClass *classPtr)
{
   // Create a descriptor of the C-structure defined by TClass
   // TClass *classPtr must be a valid pointer to TClass object for
   // "plain" C_structure only !!!
   fSecondDescriptor = 0;
   SetType("tableDescriptor");
   if (classPtr) {
      fRowClass = classPtr; // remember my row class
      SetName(classPtr->GetName());
      LearnTable(classPtr);
   }
   else
      MakeZombie();
}
//____________________________________________________________________________
void TTableDescriptor::LearnTable(const TTable *parentTable)
{
   //to be documented
   if (!parentTable) {
      MakeZombie();
      return;
   }
   LearnTable(parentTable->GetRowClass());
}

//____________________________________________________________________________
void TTableDescriptor::LearnTable(TClass *classPtr)
{
//
//  LearnTable() creates an array of the descriptors for elements of the row
//
// It creates a descriptor of the C-structure defined by TClass
// TClass *classPtr must be a valid pointer to TClass object for
// "plain" C-structure only !!!
//
//  This is to introduce an artificial restriction demanded by STAR database group
//
//    1. the name may be 31 symbols at most
//    2. the number the dimension is 3 at most
//
//  To lift this restriction one has to provide -DNORESTRICTIONS CPP symbol and
//  recompile code (and debug code NOW!)
//

   if (!classPtr) return;

   if (!(classPtr->GetNdata())) return;

   Char_t *varname;

   tableDescriptor_st elementDescriptor;

   ReAllocate(classPtr->GetListOfDataMembers()->GetSize());
   Int_t columnIndex = 0;
   TIter next(classPtr->GetListOfDataMembers());
   TDataMember *member = 0;
   while ( (member = (TDataMember *) next()) ) {
      memset(&elementDescriptor,0,sizeof(tableDescriptor_st));
      varname = (Char_t *) member->GetName();
#ifdef NORESTRICTIONS
//  This is remove to introduce an artificial restriction demanded by STAR infrastructure group
                                             elementDescriptor.fColumnName = StrDup(varname);
#else
                                             elementDescriptor.fColumnName[0] = '\0';
         strncat(elementDescriptor.fColumnName,varname,sizeof(elementDescriptor.fColumnName)-1);
#endif
    // define index
      if (member->IsaPointer() ) {
         elementDescriptor.fTypeSize = sizeof(void *);
         const char *typeName = member->GetTypeName();
         elementDescriptor.fType = TTable::GetTypeId(typeName);
      } else {
         TDataType *memberType = member->GetDataType();
         R__ASSERT(memberType!=0);
         elementDescriptor.fTypeSize = memberType->Size();
         elementDescriptor.fType = TTable::GetTypeId(memberType->GetTypeName());
      }
      Int_t globalIndex = 1;
      if (elementDescriptor.fType != kNAN) {
         Int_t dim = 0;
         if ( (dim = member->GetArrayDim()) ) {
                                              elementDescriptor.fDimensions = dim;
#ifdef NORESTRICTIONS
                                              elementDescriptor.fIndexArray = new UInt_t(dim);
#else
            UInt_t maxDim = sizeof(elementDescriptor.fIndexArray)/sizeof(UInt_t);
            if (UInt_t(dim) > maxDim) {
               Error("LearnTable","Too many dimenstions - %d", dim);
               dim =  maxDim;
            }
#endif
            for( Int_t indx=0; indx < dim; indx++ ){
                                             elementDescriptor.fIndexArray[indx] = member->GetMaxIndex(indx);
               globalIndex *= elementDescriptor.fIndexArray[indx];
            }
         }
      }
      else Error("LearnTable","Wrong data type for <%s> structure",classPtr->GetName());
      elementDescriptor.fSize   =  globalIndex * (elementDescriptor.fTypeSize);
      elementDescriptor.fOffset = member->GetOffset();
      AddAt(elementDescriptor,member->GetTitle(),columnIndex); columnIndex++;
   }
}

//______________________________________________________________________________
TTableDescriptor *TTableDescriptor::MakeDescriptor(const char *structName)
{
   ///////////////////////////////////////////////////////////
   //
   // MakeDescriptor(const char *structName) - static method
   //                structName - the name of the C structure
   //                             to create descriptor of
   // return a new instance of the TTableDescriptor or 0
   // if the "structName is not present with the dictionary
   //
   ///////////////////////////////////////////////////////////
   TTableDescriptor *dsc = 0;
   TClass *cl = TClass::GetClass(structName, kTRUE);
//    TClass *cl = new TClass(structName,1,0,0);
   R__ASSERT(cl!=0);
   dsc = new TTableDescriptor(cl);
   return dsc;
}
//______________________________________________________________________________
TDataSet *TTableDescriptor::MakeCommentField(Bool_t createFlag){
   // Instantiate a comment dataset if any
   TDataSet *comments = FindByName(fgCommentsName.Data());
   if (!comments && createFlag)
      comments =  new TDataSet(fgCommentsName.Data(),this,kTRUE);
   return comments;
}
//______________________________________________________________________________
Int_t TTableDescriptor::UpdateOffsets(const TTableDescriptor *newDescriptor)
{
  //                  "Schema evolution"
  // Method updates the offsets with a new ones from another descriptor
  //
   Int_t maxColumns = NumberOfColumns();
   Int_t mismathes = 0;

   if (   (UInt_t(maxColumns) == newDescriptor->NumberOfColumns())
      && (memcmp(GetArray(),newDescriptor->GetArray(),sizeof(tableDescriptor_st)*GetNRows()) == 0)
     ) return mismathes; // everything fine for sure !

  // Something wrong here, we have to check things piece by piece
   for (Int_t colCounter=0; colCounter < maxColumns; colCounter++) {
      Int_t colNewIndx = newDescriptor->ColumnByName(ColumnName(colCounter));
      // look for analog
      EColumnType newType = colNewIndx >=0 ? newDescriptor->ColumnType(colNewIndx): kNAN;
#ifdef __STAR__
      if (newType == kInt)       newType = kLong;
      else if (newType == kUInt) newType = kULong;
#endif
      if ( colNewIndx >=0
          && Dimensions(colCounter) == newDescriptor->Dimensions(colNewIndx)
          && ColumnType(colCounter) == newType) {
         Bool_t same = kFALSE;
         if ( Dimensions(colCounter)) {
            for (UInt_t d = 0; d < Dimensions(colCounter); d++) {
               if (IndexArray(colCounter)[d] != newDescriptor->IndexArray(colNewIndx)[d]){  same = kTRUE; break; }
            }
         }
         SetOffset(newDescriptor->Offset(colNewIndx),colCounter);
         if (colNewIndx != colCounter) {
            Printf("Schema evolution: \t%d column of the \"%s\" table has been moved to %d-th column\n",
                   colCounter,ColumnName(colCounter),colNewIndx);
            mismathes++;
         } else if (same) {
            Printf("Schema evolution: \t%d column \"%s\" size has been changed\n",
                   colNewIndx, ColumnName(colCounter));
            mismathes++;
         }
      } else {
         Printf("Schema evolution: \t%d column \"%s\" of %d type has been lost\n",
                colCounter,ColumnName(colCounter),ColumnType(colCounter));
         Printf(" Indx = %d, name = %s \n", colNewIndx, ColumnName(colCounter));
         SetOffset(UInt_t(-1),colCounter);
         mismathes++;
      }
   }
   if (!mismathes && UInt_t(maxColumns) != newDescriptor->NumberOfColumns()) {
      mismathes++;
      Printf("Warning: One extra column has been introduced\n");
   }
   return mismathes;
}

//____________________________________________________________________________
Int_t TTableDescriptor::ColumnByName(const Char_t *columnName) const
{
 // Find the column index but the column name
   const tableDescriptor_st *elementDescriptor = ((TTableDescriptor *)this)->GetTable();
   Int_t i = -1;
   if (!elementDescriptor) return i;
   Int_t nRows = GetNRows();
   char *bracket = 0;
   if (nRows) {
      char *name = StrDup(columnName);
      if ((bracket = strchr(name,'[')) )  *bracket = 0;
      for (i=0; i < nRows; i++,elementDescriptor++)
         if (strcmp(name,elementDescriptor->fColumnName) == 0) break;
      delete [] name;
   }
   if (i==nRows) i = -1;
   // Check array
   if (bracket && !Dimensions(i)) {
      i = -1;
      Warning("ColumnByName","%s column contains a scalar value",columnName);
   }
   return i;
}

//____________________________________________________________________________
Int_t TTableDescriptor::Offset(const Char_t *columnName) const
{
  // Return offset of the column defined by "columnName"
  // Take in account index if provided
  // Can not handle multidimensional indeces yet.

   Int_t offset = -1;
   if (columnName) {
      Int_t indx = ColumnByName(columnName);
      if (indx >= 0 ) {
         offset = Offset(indx);
         const char *openBracket = 0;
         if ( (openBracket = strchr(columnName,'['))  )
            offset += atoi(openBracket+1)*TypeSize(indx);
      }
   }
   return offset;
}

//____________________________________________________________________________
Int_t TTableDescriptor::ColumnSize(const Char_t *columnName) const
{
   //to be documented
   Int_t indx = ColumnByName(columnName);
   if (indx >= 0 ) indx = ColumnSize(indx);
   return indx;
}

//____________________________________________________________________________
Int_t TTableDescriptor::TypeSize(const Char_t *columnName) const
{
   //to be documented
   Int_t indx = ColumnByName(columnName);
   if (indx >= 0 ) indx = TypeSize(indx);
   return indx;
}

//____________________________________________________________________________
Int_t TTableDescriptor::Dimensions(const Char_t *columnName) const
{
   //to be documented
   Int_t indx = ColumnByName(columnName);
   if (indx >= 0 ) indx = Dimensions(indx);
   return indx;
}

//____________________________________________________________________________
TTable::EColumnType TTableDescriptor::ColumnType(const Char_t *columnName) const
{
   //to be documented
   Int_t indx = ColumnByName(columnName);
   if (indx >= 0 ) indx = ColumnType(indx);
   return EColumnType(indx);
}
//____________________________________________________________________________
Int_t   TTableDescriptor::Sizeof() const
{
   //to be documented
   Int_t fullRowSize = 0;
   if (RowClass() ) fullRowSize = RowClass()->Size();
   else {
      // Calculate the size myslef.
      Int_t iLastRows = GetNRows()-1;
      if (iLastRows >=0) fullRowSize = Offset(iLastRows)  + ColumnSize(iLastRows);
   }
   return fullRowSize;
}

 TTableDescriptor.cxx:1
 TTableDescriptor.cxx:2
 TTableDescriptor.cxx:3
 TTableDescriptor.cxx:4
 TTableDescriptor.cxx:5
 TTableDescriptor.cxx:6
 TTableDescriptor.cxx:7
 TTableDescriptor.cxx:8
 TTableDescriptor.cxx:9
 TTableDescriptor.cxx:10
 TTableDescriptor.cxx:11
 TTableDescriptor.cxx:12
 TTableDescriptor.cxx:13
 TTableDescriptor.cxx:14
 TTableDescriptor.cxx:15
 TTableDescriptor.cxx:16
 TTableDescriptor.cxx:17
 TTableDescriptor.cxx:18
 TTableDescriptor.cxx:19
 TTableDescriptor.cxx:20
 TTableDescriptor.cxx:21
 TTableDescriptor.cxx:22
 TTableDescriptor.cxx:23
 TTableDescriptor.cxx:24
 TTableDescriptor.cxx:25
 TTableDescriptor.cxx:26
 TTableDescriptor.cxx:27
 TTableDescriptor.cxx:28
 TTableDescriptor.cxx:29
 TTableDescriptor.cxx:30
 TTableDescriptor.cxx:31
 TTableDescriptor.cxx:32
 TTableDescriptor.cxx:33
 TTableDescriptor.cxx:34
 TTableDescriptor.cxx:35
 TTableDescriptor.cxx:36
 TTableDescriptor.cxx:37
 TTableDescriptor.cxx:38
 TTableDescriptor.cxx:39
 TTableDescriptor.cxx:40
 TTableDescriptor.cxx:41
 TTableDescriptor.cxx:42
 TTableDescriptor.cxx:43
 TTableDescriptor.cxx:44
 TTableDescriptor.cxx:45
 TTableDescriptor.cxx:46
 TTableDescriptor.cxx:47
 TTableDescriptor.cxx:48
 TTableDescriptor.cxx:49
 TTableDescriptor.cxx:50
 TTableDescriptor.cxx:51
 TTableDescriptor.cxx:52
 TTableDescriptor.cxx:53
 TTableDescriptor.cxx:54
 TTableDescriptor.cxx:55
 TTableDescriptor.cxx:56
 TTableDescriptor.cxx:57
 TTableDescriptor.cxx:58
 TTableDescriptor.cxx:59
 TTableDescriptor.cxx:60
 TTableDescriptor.cxx:61
 TTableDescriptor.cxx:62
 TTableDescriptor.cxx:63
 TTableDescriptor.cxx:64
 TTableDescriptor.cxx:65
 TTableDescriptor.cxx:66
 TTableDescriptor.cxx:67
 TTableDescriptor.cxx:68
 TTableDescriptor.cxx:69
 TTableDescriptor.cxx:70
 TTableDescriptor.cxx:71
 TTableDescriptor.cxx:72
 TTableDescriptor.cxx:73
 TTableDescriptor.cxx:74
 TTableDescriptor.cxx:75
 TTableDescriptor.cxx:76
 TTableDescriptor.cxx:77
 TTableDescriptor.cxx:78
 TTableDescriptor.cxx:79
 TTableDescriptor.cxx:80
 TTableDescriptor.cxx:81
 TTableDescriptor.cxx:82
 TTableDescriptor.cxx:83
 TTableDescriptor.cxx:84
 TTableDescriptor.cxx:85
 TTableDescriptor.cxx:86
 TTableDescriptor.cxx:87
 TTableDescriptor.cxx:88
 TTableDescriptor.cxx:89
 TTableDescriptor.cxx:90
 TTableDescriptor.cxx:91
 TTableDescriptor.cxx:92
 TTableDescriptor.cxx:93
 TTableDescriptor.cxx:94
 TTableDescriptor.cxx:95
 TTableDescriptor.cxx:96
 TTableDescriptor.cxx:97
 TTableDescriptor.cxx:98
 TTableDescriptor.cxx:99
 TTableDescriptor.cxx:100
 TTableDescriptor.cxx:101
 TTableDescriptor.cxx:102
 TTableDescriptor.cxx:103
 TTableDescriptor.cxx:104
 TTableDescriptor.cxx:105
 TTableDescriptor.cxx:106
 TTableDescriptor.cxx:107
 TTableDescriptor.cxx:108
 TTableDescriptor.cxx:109
 TTableDescriptor.cxx:110
 TTableDescriptor.cxx:111
 TTableDescriptor.cxx:112
 TTableDescriptor.cxx:113
 TTableDescriptor.cxx:114
 TTableDescriptor.cxx:115
 TTableDescriptor.cxx:116
 TTableDescriptor.cxx:117
 TTableDescriptor.cxx:118
 TTableDescriptor.cxx:119
 TTableDescriptor.cxx:120
 TTableDescriptor.cxx:121
 TTableDescriptor.cxx:122
 TTableDescriptor.cxx:123
 TTableDescriptor.cxx:124
 TTableDescriptor.cxx:125
 TTableDescriptor.cxx:126
 TTableDescriptor.cxx:127
 TTableDescriptor.cxx:128
 TTableDescriptor.cxx:129
 TTableDescriptor.cxx:130
 TTableDescriptor.cxx:131
 TTableDescriptor.cxx:132
 TTableDescriptor.cxx:133
 TTableDescriptor.cxx:134
 TTableDescriptor.cxx:135
 TTableDescriptor.cxx:136
 TTableDescriptor.cxx:137
 TTableDescriptor.cxx:138
 TTableDescriptor.cxx:139
 TTableDescriptor.cxx:140
 TTableDescriptor.cxx:141
 TTableDescriptor.cxx:142
 TTableDescriptor.cxx:143
 TTableDescriptor.cxx:144
 TTableDescriptor.cxx:145
 TTableDescriptor.cxx:146
 TTableDescriptor.cxx:147
 TTableDescriptor.cxx:148
 TTableDescriptor.cxx:149
 TTableDescriptor.cxx:150
 TTableDescriptor.cxx:151
 TTableDescriptor.cxx:152
 TTableDescriptor.cxx:153
 TTableDescriptor.cxx:154
 TTableDescriptor.cxx:155
 TTableDescriptor.cxx:156
 TTableDescriptor.cxx:157
 TTableDescriptor.cxx:158
 TTableDescriptor.cxx:159
 TTableDescriptor.cxx:160
 TTableDescriptor.cxx:161
 TTableDescriptor.cxx:162
 TTableDescriptor.cxx:163
 TTableDescriptor.cxx:164
 TTableDescriptor.cxx:165
 TTableDescriptor.cxx:166
 TTableDescriptor.cxx:167
 TTableDescriptor.cxx:168
 TTableDescriptor.cxx:169
 TTableDescriptor.cxx:170
 TTableDescriptor.cxx:171
 TTableDescriptor.cxx:172
 TTableDescriptor.cxx:173
 TTableDescriptor.cxx:174
 TTableDescriptor.cxx:175
 TTableDescriptor.cxx:176
 TTableDescriptor.cxx:177
 TTableDescriptor.cxx:178
 TTableDescriptor.cxx:179
 TTableDescriptor.cxx:180
 TTableDescriptor.cxx:181
 TTableDescriptor.cxx:182
 TTableDescriptor.cxx:183
 TTableDescriptor.cxx:184
 TTableDescriptor.cxx:185
 TTableDescriptor.cxx:186
 TTableDescriptor.cxx:187
 TTableDescriptor.cxx:188
 TTableDescriptor.cxx:189
 TTableDescriptor.cxx:190
 TTableDescriptor.cxx:191
 TTableDescriptor.cxx:192
 TTableDescriptor.cxx:193
 TTableDescriptor.cxx:194
 TTableDescriptor.cxx:195
 TTableDescriptor.cxx:196
 TTableDescriptor.cxx:197
 TTableDescriptor.cxx:198
 TTableDescriptor.cxx:199
 TTableDescriptor.cxx:200
 TTableDescriptor.cxx:201
 TTableDescriptor.cxx:202
 TTableDescriptor.cxx:203
 TTableDescriptor.cxx:204
 TTableDescriptor.cxx:205
 TTableDescriptor.cxx:206
 TTableDescriptor.cxx:207
 TTableDescriptor.cxx:208
 TTableDescriptor.cxx:209
 TTableDescriptor.cxx:210
 TTableDescriptor.cxx:211
 TTableDescriptor.cxx:212
 TTableDescriptor.cxx:213
 TTableDescriptor.cxx:214
 TTableDescriptor.cxx:215
 TTableDescriptor.cxx:216
 TTableDescriptor.cxx:217
 TTableDescriptor.cxx:218
 TTableDescriptor.cxx:219
 TTableDescriptor.cxx:220
 TTableDescriptor.cxx:221
 TTableDescriptor.cxx:222
 TTableDescriptor.cxx:223
 TTableDescriptor.cxx:224
 TTableDescriptor.cxx:225
 TTableDescriptor.cxx:226
 TTableDescriptor.cxx:227
 TTableDescriptor.cxx:228
 TTableDescriptor.cxx:229
 TTableDescriptor.cxx:230
 TTableDescriptor.cxx:231
 TTableDescriptor.cxx:232
 TTableDescriptor.cxx:233
 TTableDescriptor.cxx:234
 TTableDescriptor.cxx:235
 TTableDescriptor.cxx:236
 TTableDescriptor.cxx:237
 TTableDescriptor.cxx:238
 TTableDescriptor.cxx:239
 TTableDescriptor.cxx:240
 TTableDescriptor.cxx:241
 TTableDescriptor.cxx:242
 TTableDescriptor.cxx:243
 TTableDescriptor.cxx:244
 TTableDescriptor.cxx:245
 TTableDescriptor.cxx:246
 TTableDescriptor.cxx:247
 TTableDescriptor.cxx:248
 TTableDescriptor.cxx:249
 TTableDescriptor.cxx:250
 TTableDescriptor.cxx:251
 TTableDescriptor.cxx:252
 TTableDescriptor.cxx:253
 TTableDescriptor.cxx:254
 TTableDescriptor.cxx:255
 TTableDescriptor.cxx:256
 TTableDescriptor.cxx:257
 TTableDescriptor.cxx:258
 TTableDescriptor.cxx:259
 TTableDescriptor.cxx:260
 TTableDescriptor.cxx:261
 TTableDescriptor.cxx:262
 TTableDescriptor.cxx:263
 TTableDescriptor.cxx:264
 TTableDescriptor.cxx:265
 TTableDescriptor.cxx:266
 TTableDescriptor.cxx:267
 TTableDescriptor.cxx:268
 TTableDescriptor.cxx:269
 TTableDescriptor.cxx:270
 TTableDescriptor.cxx:271
 TTableDescriptor.cxx:272
 TTableDescriptor.cxx:273
 TTableDescriptor.cxx:274
 TTableDescriptor.cxx:275
 TTableDescriptor.cxx:276
 TTableDescriptor.cxx:277
 TTableDescriptor.cxx:278
 TTableDescriptor.cxx:279
 TTableDescriptor.cxx:280
 TTableDescriptor.cxx:281
 TTableDescriptor.cxx:282
 TTableDescriptor.cxx:283
 TTableDescriptor.cxx:284
 TTableDescriptor.cxx:285
 TTableDescriptor.cxx:286
 TTableDescriptor.cxx:287
 TTableDescriptor.cxx:288
 TTableDescriptor.cxx:289
 TTableDescriptor.cxx:290
 TTableDescriptor.cxx:291
 TTableDescriptor.cxx:292
 TTableDescriptor.cxx:293
 TTableDescriptor.cxx:294
 TTableDescriptor.cxx:295
 TTableDescriptor.cxx:296
 TTableDescriptor.cxx:297
 TTableDescriptor.cxx:298
 TTableDescriptor.cxx:299
 TTableDescriptor.cxx:300
 TTableDescriptor.cxx:301
 TTableDescriptor.cxx:302
 TTableDescriptor.cxx:303
 TTableDescriptor.cxx:304
 TTableDescriptor.cxx:305
 TTableDescriptor.cxx:306
 TTableDescriptor.cxx:307
 TTableDescriptor.cxx:308
 TTableDescriptor.cxx:309
 TTableDescriptor.cxx:310
 TTableDescriptor.cxx:311
 TTableDescriptor.cxx:312
 TTableDescriptor.cxx:313
 TTableDescriptor.cxx:314
 TTableDescriptor.cxx:315
 TTableDescriptor.cxx:316
 TTableDescriptor.cxx:317
 TTableDescriptor.cxx:318
 TTableDescriptor.cxx:319
 TTableDescriptor.cxx:320
 TTableDescriptor.cxx:321
 TTableDescriptor.cxx:322
 TTableDescriptor.cxx:323
 TTableDescriptor.cxx:324
 TTableDescriptor.cxx:325
 TTableDescriptor.cxx:326
 TTableDescriptor.cxx:327
 TTableDescriptor.cxx:328
 TTableDescriptor.cxx:329
 TTableDescriptor.cxx:330
 TTableDescriptor.cxx:331
 TTableDescriptor.cxx:332
 TTableDescriptor.cxx:333
 TTableDescriptor.cxx:334
 TTableDescriptor.cxx:335
 TTableDescriptor.cxx:336
 TTableDescriptor.cxx:337
 TTableDescriptor.cxx:338
 TTableDescriptor.cxx:339
 TTableDescriptor.cxx:340
 TTableDescriptor.cxx:341
 TTableDescriptor.cxx:342
 TTableDescriptor.cxx:343
 TTableDescriptor.cxx:344
 TTableDescriptor.cxx:345
 TTableDescriptor.cxx:346
 TTableDescriptor.cxx:347
 TTableDescriptor.cxx:348
 TTableDescriptor.cxx:349
 TTableDescriptor.cxx:350
 TTableDescriptor.cxx:351
 TTableDescriptor.cxx:352
 TTableDescriptor.cxx:353
 TTableDescriptor.cxx:354
 TTableDescriptor.cxx:355
 TTableDescriptor.cxx:356
 TTableDescriptor.cxx:357
 TTableDescriptor.cxx:358
 TTableDescriptor.cxx:359
 TTableDescriptor.cxx:360
 TTableDescriptor.cxx:361
 TTableDescriptor.cxx:362
 TTableDescriptor.cxx:363
 TTableDescriptor.cxx:364
 TTableDescriptor.cxx:365
 TTableDescriptor.cxx:366
 TTableDescriptor.cxx:367
 TTableDescriptor.cxx:368
 TTableDescriptor.cxx:369
 TTableDescriptor.cxx:370
 TTableDescriptor.cxx:371
 TTableDescriptor.cxx:372
 TTableDescriptor.cxx:373
 TTableDescriptor.cxx:374
 TTableDescriptor.cxx:375
 TTableDescriptor.cxx:376
 TTableDescriptor.cxx:377
 TTableDescriptor.cxx:378
 TTableDescriptor.cxx:379
 TTableDescriptor.cxx:380
 TTableDescriptor.cxx:381
 TTableDescriptor.cxx:382
 TTableDescriptor.cxx:383
 TTableDescriptor.cxx:384
 TTableDescriptor.cxx:385
 TTableDescriptor.cxx:386
 TTableDescriptor.cxx:387
 TTableDescriptor.cxx:388
 TTableDescriptor.cxx:389
 TTableDescriptor.cxx:390
 TTableDescriptor.cxx:391
 TTableDescriptor.cxx:392
 TTableDescriptor.cxx:393
 TTableDescriptor.cxx:394
 TTableDescriptor.cxx:395
 TTableDescriptor.cxx:396
 TTableDescriptor.cxx:397
 TTableDescriptor.cxx:398
 TTableDescriptor.cxx:399
 TTableDescriptor.cxx:400
 TTableDescriptor.cxx:401
 TTableDescriptor.cxx:402
 TTableDescriptor.cxx:403
 TTableDescriptor.cxx:404
 TTableDescriptor.cxx:405
 TTableDescriptor.cxx:406
 TTableDescriptor.cxx:407
 TTableDescriptor.cxx:408
 TTableDescriptor.cxx:409
 TTableDescriptor.cxx:410
 TTableDescriptor.cxx:411
 TTableDescriptor.cxx:412
 TTableDescriptor.cxx:413
 TTableDescriptor.cxx:414
 TTableDescriptor.cxx:415
 TTableDescriptor.cxx:416
 TTableDescriptor.cxx:417
 TTableDescriptor.cxx:418
 TTableDescriptor.cxx:419
 TTableDescriptor.cxx:420
 TTableDescriptor.cxx:421
 TTableDescriptor.cxx:422
 TTableDescriptor.cxx:423
 TTableDescriptor.cxx:424
 TTableDescriptor.cxx:425
 TTableDescriptor.cxx:426
 TTableDescriptor.cxx:427
 TTableDescriptor.cxx:428
 TTableDescriptor.cxx:429
 TTableDescriptor.cxx:430
 TTableDescriptor.cxx:431
 TTableDescriptor.cxx:432
 TTableDescriptor.cxx:433
 TTableDescriptor.cxx:434
 TTableDescriptor.cxx:435
 TTableDescriptor.cxx:436
 TTableDescriptor.cxx:437
 TTableDescriptor.cxx:438
 TTableDescriptor.cxx:439
 TTableDescriptor.cxx:440
 TTableDescriptor.cxx:441
 TTableDescriptor.cxx:442
 TTableDescriptor.cxx:443
 TTableDescriptor.cxx:444
 TTableDescriptor.cxx:445
 TTableDescriptor.cxx:446
 TTableDescriptor.cxx:447
 TTableDescriptor.cxx:448
 TTableDescriptor.cxx:449
 TTableDescriptor.cxx:450
 TTableDescriptor.cxx:451
 TTableDescriptor.cxx:452
 TTableDescriptor.cxx:453
 TTableDescriptor.cxx:454
 TTableDescriptor.cxx:455
 TTableDescriptor.cxx:456
 TTableDescriptor.cxx:457
 TTableDescriptor.cxx:458
 TTableDescriptor.cxx:459
 TTableDescriptor.cxx:460
 TTableDescriptor.cxx:461
 TTableDescriptor.cxx:462
 TTableDescriptor.cxx:463
 TTableDescriptor.cxx:464
 TTableDescriptor.cxx:465
 TTableDescriptor.cxx:466
 TTableDescriptor.cxx:467
 TTableDescriptor.cxx:468
 TTableDescriptor.cxx:469
 TTableDescriptor.cxx:470
 TTableDescriptor.cxx:471
 TTableDescriptor.cxx:472
 TTableDescriptor.cxx:473
 TTableDescriptor.cxx:474
 TTableDescriptor.cxx:475
 TTableDescriptor.cxx:476
 TTableDescriptor.cxx:477
 TTableDescriptor.cxx:478
 TTableDescriptor.cxx:479
 TTableDescriptor.cxx:480
 TTableDescriptor.cxx:481