1 // @(#)root/table:$Id$
2 // Author: Valery Fine(fine@mail.cern.ch) 03/07/98
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_TTable
13 #define ROOT_TTable
14
15 //////////////////////////////////////////////////////////////////////////
16 // //
17 // TTable //
18 // //
19 // It is a base class to create a "wrapper" class //
20 // holding the plain C-structure array //
21 // (1 element of the structure per element) //
22 // //
23 //////////////////////////////////////////////////////////////////////////
24
25 #ifdef __CINT__
26 #pragma Ccomment on
27 #endif
28
29 #include "Ttypes.h"
30 #include "TDataSet.h"
31 #include "tableDescriptor.h"
32 #ifndef ROOT_TCut
33 # include "TCut.h"
34 #endif
35
36 # ifndef ROOT_Riosfwd
37 # include "Riosfwd.h"
38 # endif
39
40 #ifndef __CINT__
41 # include <string.h>
42 # include <assert.h>
43 #endif
44
45 #include <vector>
46
47 class TTableDescriptor;
48 class TH1;
49 class TTableMap;
50 typedef TTableMap* Ptr_t;
51
52 class TTable : public TDataSet {
53 friend class TDataSet;
54 friend class St_XDFFile;
55 protected:
56 Long_t fSize; // Size of the one element (row) of the table
57
58 protected:
59
60 Int_t fN; //Number of array elements
61 Char_t *fTable; // Array of (fN*fSize) longs
62 Long_t fMaxIndex; // The used capacity of this array
63
64 Bool_t BoundsOk(const char *where, Int_t at) const;
65 Bool_t OutOfBoundsError(const char *where, Int_t i) const;
66
67 void CopyStruct(Char_t *dest, const Char_t *src);
68 Char_t *Create();
69 virtual void Clear(Option_t *opt="");
70 virtual void Delete(Option_t *opt="");
71 virtual Bool_t EntryLoop(const Char_t *exprFileName,Int_t &action, TObject *obj, Int_t nentries=1000000000, Int_t firstentry=0, Option_t *option="");
72 Int_t SetfN(Long_t len);
73 void SetTablePointer(void *table);
74 void SetUsedRows(Int_t n);
75 virtual void SetType(const char *const type);
76 void StreamerHeader(TBuffer &b,Version_t version=3);
77 void StreamerTable(TBuffer &b,Version_t version=3);
78 virtual TTableDescriptor *GetDescriptorPointer() const;
79 virtual void SetDescriptorPointer(TTableDescriptor *list);
80
81 void ReAlloc(Int_t newsize);
82 static const char *TableDictionary(const char *className,const char *structName,TTableDescriptor *&ColDescriptors);
83
84 public:
85
86 enum EColumnType {kNAN, kFloat, kInt, kLong, kShort, kDouble, kUInt
87 ,kULong, kUShort, kUChar, kChar, kPtr, kBool
88 ,kEndColumnType };
89 enum ETableBits {
90 kIsNotOwn = BIT(23) // if the TTable wrapper doesn't own the STAF table
91 // As result of the Update() method for example
92 };
93 static const char *fgTypeName[kEndColumnType];
94 TTable(const char *name=0, Int_t size=0);
95 TTable(const char *name, Int_t n,Int_t size);
96 TTable(const char *name, Int_t n, Char_t *array,Int_t size);
97 TTable(const char *name, const char *type, Int_t n, Char_t *array, Int_t size);
98 TTable(const TTable &table);
99 TTable &operator=(const TTable &rhs);
100 virtual ~TTable();
101
102 virtual void Adopt(Int_t n, void *array);
103 virtual Int_t AddAt(const void *c);
104 virtual void AddAt(const void *c, Int_t i);
105 virtual void AddAt(TDataSet *dataset,Int_t idx=0);
106 virtual Long_t AppendRows(const void *row, UInt_t nRows);
107 virtual void AsString(void *buf, EColumnType type, Int_t width, ostream &out) const;
108 const void *At(Int_t i) const;
109 virtual void Browse(TBrowser *b);
110 virtual void CopySet(TTable &array);
111 Int_t CopyRows(const TTable *srcTable,Long_t srcRow=0, Long_t dstRow=0, Long_t nRows=0, Bool_t expand=kFALSE);
112 virtual void DeleteRows(Long_t indx,UInt_t nRows=1);
113 virtual void Draw(Option_t *opt);
114 virtual TH1 *Draw(TCut varexp, TCut selection, Option_t *option=""
115 ,Int_t nentries=1000000000, Int_t firstentry=0);
116 virtual TH1 *Draw(const char *varexp, const char *selection, Option_t *option=""
117 ,Int_t nentries=1000000000, Int_t firstentry=0); // *MENU*
118 void *GetArray() const ;
119 virtual TClass *GetRowClass() const ;
120 Int_t GetSize() const { return fN; }
121 virtual Long_t GetNRows() const;
122 virtual Long_t GetRowSize() const;
123 virtual Long_t GetTableSize() const;
124 virtual TTableDescriptor *GetTableDescriptors() const;
125 virtual TTableDescriptor *GetRowDescriptors() const;
126 virtual const Char_t *GetType() const;
127 virtual void Fit(const char *formula ,const char *varexp, const char *selection="",Option_t *option="" ,Option_t *goption=""
128 ,Int_t nentries=1000000000, Int_t firstentry=0); // *MENU*
129
130 virtual Long_t HasData() const { return 1; }
131 virtual Long_t InsertRows(const void *rows, Long_t indx, UInt_t nRows=1);
132 virtual Bool_t IsFolder() const;
133 Int_t NaN();
134 static TTable *New(const Char_t *name, const Char_t *type, void *array, UInt_t size);
135 virtual Char_t *MakeExpression(const Char_t *expressions[],Int_t nExpressions);
136 virtual Char_t *Print(Char_t *buf,Int_t n) const ;
137 virtual void Print(Option_t *opt="") const;
138 virtual const Char_t *Print(Int_t row, Int_t rownumber=10,
139 const Char_t *colfirst="", const Char_t *collast="") const; // *MENU*
140 virtual void PrintContents(Option_t *opt="") const;
141 virtual const Char_t *PrintHeader() const; // *MENU*
142 virtual void Project(const char *hname, const char *varexp, const char *selection="", Option_t *option=""
143 ,Int_t nentries=1000000000, Int_t firstentry=0);
144
145 virtual Int_t Purge(Option_t *opt="");
146
147 void *ReAllocate(Int_t newsize);
148 void *ReAllocate();
149 virtual void SavePrimitive(ostream &out, Option_t *option = "");
150 virtual void Set(Int_t n);
151 virtual void Set(Int_t n, Char_t *array);
152 virtual void SetNRows(Int_t n);
153 virtual void Reset(Int_t c=0);
154 virtual void ResetMap(Bool_t wipe=kTRUE);
155 virtual void Update();
156 virtual void Update(TDataSet *set,UInt_t opt=0);
157 void *operator[](Int_t i);
158 const void *operator[](Int_t i) const;
159
160
161 // ---- Table descriptor service ------
162
163 virtual Int_t GetColumnIndex(const Char_t *columnName) const;
164 virtual const Char_t *GetColumnName(Int_t columnIndex) const;
165 virtual const UInt_t *GetIndexArray(Int_t columnIndex) const;
166 virtual UInt_t GetNumberOfColumns() const;
167 virtual UInt_t GetOffset(Int_t columnIndex) const;
168 virtual Int_t GetOffset(const Char_t *columnName=0) const;
169 virtual UInt_t GetColumnSize(Int_t columnIndex) const;
170 virtual Int_t GetColumnSize(const Char_t *columnName=0) const;
171 virtual UInt_t GetTypeSize(Int_t columnIndex) const;
172 virtual Int_t GetTypeSize(const Char_t *columnName=0) const ;
173 virtual UInt_t GetDimensions(Int_t columnIndex) const;
174 virtual Int_t GetDimensions(const Char_t *columnName=0) const ;
175 virtual EColumnType GetColumnType(Int_t columnIndex) const;
176 virtual EColumnType GetColumnType(const Char_t *columnName=0) const;
177 virtual const Char_t *GetColumnComment(Int_t columnIndex) const;
178
179 static const char *GetTypeName(EColumnType type);
180 static EColumnType GetTypeId(const char *typeName);
181
182 // Table index iterator:
183 class iterator {
184 public:
185 typedef std::vector<Long_t>::iterator vec_iterator;
186 typedef std::vector<Long_t>::const_iterator vec_const_iterator;
187 private:
188 Long_t fRowSize;
189 const TTable *fThisTable;
190 vec_iterator fCurrentRow;
191 public:
192 iterator(): fRowSize(0), fThisTable(0) {;}
193 iterator(const TTable &table, vec_iterator &arowPtr) :
194 fRowSize(table.GetRowSize()), fThisTable(&table), fCurrentRow(arowPtr) {;}
195 iterator(const TTable &table, vec_const_iterator &arowPtr) :
196 fRowSize(table.GetRowSize()), fThisTable(&table),
197 fCurrentRow(*(std::vector<Long_t>::iterator *)(void *)&arowPtr) {;}
198 //fCurrentRow(* const_cast<vector<Long_t>::iterator *>(&arowPtr) ) {;}
199 iterator(const iterator& iter) : fRowSize (iter.fRowSize), fThisTable(iter.fThisTable),fCurrentRow(iter.fCurrentRow){}
200 iterator &operator=(const iterator& iter) { fRowSize = iter.fRowSize; fThisTable = iter.fThisTable; fCurrentRow=iter.fCurrentRow; return *this; }
201 void operator++() { ++fCurrentRow; }
202 void operator++(int) { fCurrentRow++; }
203 void operator--() { --fCurrentRow; }
204 void operator--(int) { fCurrentRow--; }
205 iterator operator+(Int_t idx) { std::vector<Long_t>::iterator addition = fCurrentRow+idx; return iterator(*fThisTable,addition); }
206 iterator operator-(Int_t idx) { std::vector<Long_t>::iterator subtraction = fCurrentRow-idx; return iterator(*fThisTable,subtraction); }
207 void operator+=(Int_t idx) { fCurrentRow+=idx; }
208 void operator-=(Int_t idx) { fCurrentRow-=idx; }
209 void *rowPtr() const { return (void *)(((const char *)fThisTable->GetArray()) + (*fCurrentRow)*fRowSize ); }
210 operator void *() const { return rowPtr(); }
211 Int_t operator-(const iterator &it) const { return (*fCurrentRow)-(*(it.fCurrentRow)); }
212 Long_t operator *() const { return *fCurrentRow; }
213 Bool_t operator==(const iterator &t) const { return ( (fCurrentRow == t.fCurrentRow) && (fThisTable == t.fThisTable) ); }
214 Bool_t operator!=(const iterator &t) const { return !operator==(t); }
215
216 const TTable &Table() const { return *fThisTable;}
217 const Long_t &RowSize() const { return fRowSize;}
218 #ifndef __CINT__
219 const std::vector<Long_t>::iterator &Row() const { return fCurrentRow;}
220 #endif
221 };
222
223 #ifndef __CINT__
224 // pointer iterator
225 // This create an iterator to iterate over all table column of the
226 // type provided.
227 // For example" piterator(table,kPtr) is to iterate over
228 // all cells of (TTableMap *) type
229
230 class piterator {
231 private:
232 std::vector<ULong_t> fPtrs;
233 UInt_t fCurrentRowIndex;
234 UInt_t fCurrentColIndex;
235 UInt_t fRowSize;
236 const Char_t *fCurrentRowPtr;
237 void **fCurrentColPtr;
238
239 protected:
240 void **column() {return fCurrentColPtr = (void **)(fCurrentRowPtr + fPtrs[fCurrentColIndex]);}
241
242 public:
243 piterator(const TTable *t=0,EColumnType type=kPtr);
244 piterator(const piterator& iter);
245 void operator=(const piterator& iter);
246
247 void operator++();
248 void operator++(int);
249 void operator--();
250 void operator--(int);
251
252 // operator const char *() const;
253 void **operator *();
254
255 Bool_t operator==(const piterator &t) const;
256 Bool_t operator!=(const piterator &t) const;
257
258 UInt_t Row() const;
259 UInt_t Column() const;
260
261 void MakeEnd(UInt_t lastRowIndex);
262 }; // class iterator over pointers
263
264 piterator pbegin(){ return piterator(this); }
265 piterator pend(){ piterator pLast(this); pLast.MakeEnd(GetNRows()); return pLast; }
266 #endif
267 static const char *TableDictionary() { return 0; };
268 ClassDef(TTable,4) // vector of the C structures
269 };
270
271 //________________________________________________________________________
272 inline void TTable::AddAt(TDataSet *dataset,Int_t idx)
273 { TDataSet::AddAt(dataset,idx); }
274
275 //________________________________________________________________________
276 inline Bool_t TTable::BoundsOk(const char *where, Int_t at) const
277 {
278 return (at < 0 || at >= fN)
279 ? OutOfBoundsError(where, at)
280 : kTRUE;
281 }
282
283 //________________________________________________________________________
284 inline void *TTable::GetArray() const { return (void *)fTable;}
285
286 //________________________________________________________________________
287 inline void TTable::Print(Option_t *) const { Print((Char_t *)0,Int_t(0)); }
288
289 //________________________________________________________________________
290 inline void TTable::SetUsedRows(Int_t n) { fMaxIndex = n;}
291 //________________________________________________________________________
292 inline void TTable::SetNRows(Int_t n) {SetUsedRows(n);}
293 // ULong_t &operator(){ return GetTable();}
294
295 //________________________________________________________________________
296 inline void *TTable::operator[](Int_t i)
297 {
298 if (!BoundsOk("TTable::operator[]", i))
299 i = 0;
300 return (void *)(fTable+i*fSize);
301 }
302
303 //________________________________________________________________________
304 inline const void *TTable::operator[](Int_t i) const
305 {
306 if (!BoundsOk("TTable::operator[]", i))
307 i = 0;
308 return (const void *)(fTable+i*fSize);
309 }
310
311 //________________________________________________________________________
312 inline void TTable::Draw(Option_t *opt)
313 { Draw(opt, "", "", 1000000000, 0); }
314
315 #ifndef __CINT__
316 //________________________________________________________________________________________________________________
317 inline TTable::piterator::piterator(const piterator& iter) :
318 fPtrs (iter.fPtrs),
319 fCurrentRowIndex(iter.fCurrentRowIndex),
320 fCurrentColIndex(iter.fCurrentColIndex),
321 fRowSize(iter.fRowSize),
322 fCurrentRowPtr(iter.fCurrentRowPtr),
323 fCurrentColPtr(iter.fCurrentColPtr)
324 {}
325 //________________________________________________________________________________________________________________
326 inline void TTable::piterator::operator=(const piterator& iter){
327 fPtrs = iter.fPtrs;
328 fCurrentRowIndex = iter.fCurrentRowIndex;
329 fCurrentColIndex = iter.fCurrentColIndex;
330 fRowSize = iter.fRowSize;
331 fCurrentRowPtr = iter.fCurrentRowPtr;
332 fCurrentColPtr = iter.fCurrentColPtr;
333 }
334 //________________________________________________________________________________________________________________
335 inline void TTable::piterator::operator++()
336 {
337 ++fCurrentColIndex;
338 if (fCurrentColIndex >= fPtrs.size()) {
339 fCurrentColIndex = 0;
340 ++fCurrentRowIndex;
341 fCurrentRowPtr += fRowSize;
342 }
343 column();
344 }
345 //________________________________________________________________________________________________________________
346 inline void TTable::piterator::operator++(int) { operator++(); }
347 //________________________________________________________________________________________________________________
348 inline void TTable::piterator::operator--()
349 {
350 if (fCurrentColIndex > 0) {
351 fCurrentColIndex--;
352 fCurrentColIndex = fPtrs.size()-1;
353 --fCurrentRowIndex;
354 fCurrentRowPtr -= fRowSize;
355 } else {
356 fCurrentColIndex--;
357 }
358 column();
359 }
360 //________________________________________________________________________________________________________________
361 inline void TTable::piterator::operator--(int) { operator--(); }
362 //________________________________________________________________________________________________________________
363 // inline TTable::piterator::operator const char *() const { return fCurrentColPtr; }
364 //________________________________________________________________________________________________________________
365 inline void **TTable::piterator::operator *() { return fCurrentColPtr; }
366 //________________________________________________________________________________________________________________
367 inline Bool_t TTable::piterator::operator==(const piterator &t) const {
368 return (
369 (fCurrentRowIndex== t.fCurrentRowIndex)
370 && (fCurrentColIndex == t.fCurrentColIndex)
371 // && (fCurrentRowPtr == t.fCurrentRowPtr )
372 // && (fCurrentColPtr == t.fCurrentColPtr )
373 );
374 }
375 //________________________________________________________________________________________________________________
376 inline Bool_t TTable::piterator::operator!=(const piterator &t) const { return !operator==(t); }
377 //________________________________________________________________________________________________________________
378 inline void TTable::piterator::MakeEnd(UInt_t lastRowIndex){fCurrentColIndex = 0; fCurrentRowIndex = lastRowIndex;}
379 //________________________________________________________________________________________________________________
380 inline UInt_t TTable::piterator::Row() const { return fCurrentRowIndex;}
381 //________________________________________________________________________________________________________________
382 inline UInt_t TTable::piterator::Column() const { return fCurrentColIndex;}
383 #endif
(4) Event include_recursion: |
#include file "/afs/rhic.bnl.gov/star/ROOT/5.34.30/.sl64_gcc482/root/include/TTable.h" includes itself: TTable.h -> TTableDescriptor.h -> TTable.h |
Also see events: |
[include_recursion][primary_file][caretline] |
384 #include "TTableDescriptor.h"
385
386 #endif
387