Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TRealData.cxx
Go to the documentation of this file.
1 // @(#)root/meta:$Id$
2 // Author: Rene Brun 05/03/95
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 #include "TRealData.h"
13 #include "TDataMember.h"
14 #include "TClass.h"
15 #include "TClassEdit.h"
16 #include "TStreamer.h"
17 
18 ClassImp(TRealData);
19 
20 /** \class TRealData
21 The TRealData class manages the effective list of all data members
22 for a given class. For example for an object of class TLine that inherits
23 from TObject and TAttLine, the TRealData object for a line contains the
24 complete list of all data members of the 3 classes.
25 
26 The list of TRealData members in TClass is built when functions like
27 object.Inspect or object.DrawClass are called.
28 */
29 
30 ////////////////////////////////////////////////////////////////////////////////
31 /// RealData default constructor.
32 
33 TRealData::TRealData() : TObject(), fDataMember(0), fThisOffset(-1),
34  fStreamer(0), fIsObject(kFALSE)
35 {
36 }
37 
38 
39 ////////////////////////////////////////////////////////////////////////////////
40 /// Constructor to define one persistent data member.
41 /// datamember is the pointer to the data member descriptor.
42 
43 TRealData::TRealData(const char *name, Long_t offset, TDataMember *datamember)
44  : TObject(), fDataMember(datamember), fThisOffset(offset), fName(name),
45  fStreamer(0), fIsObject(kFALSE)
46 {
47 }
48 
49 ////////////////////////////////////////////////////////////////////////////////
50 /// RealData default destructor.
51 
52 TRealData::~TRealData()
53 {
54  delete fStreamer;
55 }
56 
57 ////////////////////////////////////////////////////////////////////////////////
58 /// Write one persistent data member on output buffer.
59 /// pointer points to the current persistent data member
60 
61 void TRealData::WriteRealData(void *, char *&)
62 {
63 }
64 
65 ////////////////////////////////////////////////////////////////////////////////
66 
67 void TRealData::AdoptStreamer(TMemberStreamer *str)
68 {
69 // fDataMember->SetStreamer(str);
70 // delete fStreamer;
71  fStreamer = str;
72 }
73 
74 ////////////////////////////////////////////////////////////////////////////////
75 /// Return the name of the data member as represented in the list of
76 /// real data.
77 
78 void TRealData::GetName(TString &output, TDataMember *dm)
79 {
80  output.Clear();
81  const char* dmType = dm->GetTypeName();
82  if (TClassEdit::IsStdArray(dmType)) {
83  std::string typeNameBuf;
84  Int_t ndim = dm->GetArrayDim();
85  std::array<Int_t, 5> maxIndices; // 5 is the maximum supported in TStreamerElement::SetMaxIndex
86  TClassEdit::GetStdArrayProperties(dmType,
87  typeNameBuf,
88  maxIndices,
89  ndim);
90  output = dm->GetName();
91  for (Int_t idim = 0; idim < ndim; ++idim) {
92  output += TString::Format("[%d]",maxIndices[idim] );
93  }
94  return;
95  }
96 
97  // keep an empty name if data member is not found
98  if (dm) output = dm->GetName();
99  if (dm->IsaPointer())
100  output = TString("*")+output;
101  else {
102  if (dm && dm->GetArrayDim() > 0) {
103  // in case of array (like fMatrix[2][2] we need to add max index )
104  // this only in case of it os not a pointer
105  for (int idim = 0; idim < dm->GetArrayDim(); ++idim)
106  output += TString::Format("[%d]",dm->GetMaxIndex(idim) );
107  }
108  }
109 }
110 
111 
112 ////////////////////////////////////////////////////////////////////////////////
113 /// Return the associate streamer object.
114 
115 TMemberStreamer *TRealData::GetStreamer() const
116 {
117  return fStreamer; // return fDataMember->GetStreamer();
118 }
119