TMemberInspector.cxx

Go to the documentation of this file.
00001 // @(#)root/base:$Id: TMemberInspector.cxx 35394 2010-09-17 19:40:12Z pcanal $
00002 // Author: Fons Rademakers   15/07/96
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // TMemberInspector                                                     //
00015 //                                                                      //
00016 // Abstract base class for accessing the datamembers of a class.        //
00017 // Classes derived from this class can be given as argument to the      //
00018 // ShowMembers() methods of ROOT classes. This feature facilitates      //
00019 // the writing of class browsers and inspectors.                        //
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    // Add "add" to string
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    // Remove characters starting at "startingAt"
00058    fLen = startingAt;
00059    fBuf[startingAt] = 0;
00060 }
00061 
00062 ClassImp(TMemberInspector)
00063 
00064 TMemberInspector::TMemberInspector() {
00065    // Construct a member inspector
00066 
00067    fParent = new TParentBuf();
00068 }
00069 
00070 TMemberInspector::~TMemberInspector() {
00071    // Destruct a member inspector
00072    delete fParent;
00073 }
00074 
00075 const char* TMemberInspector::GetParent() const
00076 {
00077    // Get the parent string.
00078    return *fParent;
00079 }
00080 
00081 Ssiz_t TMemberInspector::GetParentLen() const
00082 {
00083    // Get the length of the parent string.
00084    return fParent->GetLength();
00085 }
00086 
00087 void TMemberInspector::AddToParent(const char* name)
00088 {
00089    // Append "name" to the parent string.
00090    fParent->Append(name);
00091 }
00092 
00093 void TMemberInspector::RemoveFromParent(Ssiz_t startingAt)
00094 {
00095    // Remove trailing characters starting at "startingAt".
00096    fParent->Remove(startingAt);
00097 }
00098 
00099 
00100 
00101 void TMemberInspector::GenericShowMembers(const char *topClassName, void *obj,
00102                                           Bool_t transientMember) {
00103    // Call ShowMember() on obj.
00104 
00105    // This could be faster if we implemented this either as a templated
00106    // function or by rootcint-generated code using the typeid (i.e. the
00107    // difference is a lookup in a TList instead of in a map).
00108    
00109    // To avoid a spurrious error message in case the data member is
00110    // transient and does not have a dictionary we check first.
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       // This might be worth an error message
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 }

Generated on Tue Jul 5 14:11:21 2011 for ROOT_528-00b_version by  doxygen 1.5.1