00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "TMemberInspector.h"
00024 #include "TInterpreter.h"
00025 #include "TClassEdit.h"
00026 #include "TClass.h"
00027
00028
00029 class TMemberInspector::TParentBuf {
00030 private:
00031 std::vector<char> fBuf;
00032 Ssiz_t fLen;
00033 public:
00034 TParentBuf(): fBuf(1024), fLen(0) {}
00035 Ssiz_t GetLength() const { return fLen; }
00036 void Append(const char*);
00037 void Remove(Ssiz_t startingAt);
00038 operator const char*() const { return &fBuf[0]; }
00039 };
00040
00041 void TMemberInspector::TParentBuf::Append(const char* add)
00042 {
00043
00044 if (!add || !add[0]) return;
00045 Ssiz_t addlen = strlen(add);
00046 fBuf.reserve(fLen + addlen);
00047 const char* i = add;
00048 while (*i) {
00049 fBuf[fLen++] = *i;
00050 ++i;
00051 }
00052 fBuf[fLen] = 0;
00053 }
00054
00055 void TMemberInspector::TParentBuf::Remove(Ssiz_t startingAt)
00056 {
00057
00058 fLen = startingAt;
00059 fBuf[startingAt] = 0;
00060 }
00061
00062 ClassImp(TMemberInspector)
00063
00064 TMemberInspector::TMemberInspector() {
00065
00066
00067 fParent = new TParentBuf();
00068 }
00069
00070 TMemberInspector::~TMemberInspector() {
00071
00072 delete fParent;
00073 }
00074
00075 const char* TMemberInspector::GetParent() const
00076 {
00077
00078 return *fParent;
00079 }
00080
00081 Ssiz_t TMemberInspector::GetParentLen() const
00082 {
00083
00084 return fParent->GetLength();
00085 }
00086
00087 void TMemberInspector::AddToParent(const char* name)
00088 {
00089
00090 fParent->Append(name);
00091 }
00092
00093 void TMemberInspector::RemoveFromParent(Ssiz_t startingAt)
00094 {
00095
00096 fParent->Remove(startingAt);
00097 }
00098
00099
00100
00101 void TMemberInspector::GenericShowMembers(const char *topClassName, void *obj,
00102 Bool_t transientMember) {
00103
00104
00105
00106
00107
00108
00109
00110
00111 if (transientMember) {
00112 if (!TClassEdit::IsSTLCont(topClassName)) {
00113 ClassInfo_t *b = gInterpreter->ClassInfo_Factory(topClassName);
00114 Bool_t isloaded = gInterpreter->ClassInfo_IsLoaded(b);
00115 gInterpreter->ClassInfo_Delete(b);
00116 if (!isloaded) return;
00117 }
00118 }
00119
00120 TClass *top = TClass::GetClass(topClassName);
00121 if (top) {
00122 top->CallShowMembers(obj, *this);
00123 } else {
00124
00125 }
00126
00127 }
00128
00129
00130 void TMemberInspector::InspectMember(TObject& obj, const char* name) {
00131 InspectMember<TObject>(obj, name);
00132 }
00133
00134 void TMemberInspector::InspectMember(const char* topclassname, void* pobj,
00135 const char* name, Bool_t transient) {
00136 Ssiz_t len = fParent->GetLength();
00137 fParent->Append(name);
00138 GenericShowMembers(topclassname, pobj, transient);
00139 fParent->Remove(len);
00140 }
00141
00142 void TMemberInspector::InspectMember(TClass* cl, void* pobj, const char* name) {
00143 Ssiz_t len = fParent->GetLength();
00144 fParent->Append(name);
00145 cl->CallShowMembers(pobj, *this);
00146 fParent->Remove(len);
00147 }