| # Gaudi Framework, version v20r3
Generated: 24 Nov 2008

# IInspector.h

Go to the documentation of this file.

    00001 // $Header: /local/reps/Gaudi/GaudiKernel/GaudiKernel/IInspector.h,v 1.4 2006/11/30 15:22:07 dquarrie Exp $
    00002 #ifndef GAUDIKERNEL_IINSPECTOR_H
    00003 #define GAUDIKERNEL_IINSPECTOR_H
    00004
    00005 // STL Include files
    00006 #include <typeinfo>
    00007 #include <string>
    00008
    00009 // Framework Include files
    00010 #include "GaudiKernel/IInterface.h"
    00011
    00016 class IInspector : virtual public IInterface     {
    00017 public:
    00018   enum { MUTABLE = 1<<1, CONST = 1<<2};
    00019
    00020 protected:
    00021
    00024   class IValue  {
    00025   protected:
    00026     void* m_P;
    00027     IValue()                      {                            }
    00028   public:
    00029     virtual ~IValue()             { }
    00030     virtual void release()        {      delete this;          }
    00031     void* ptr()                   {      return m_P;           }
    00032     const void* ptr()  const      {      return m_P;           }
    00033     virtual long size()  const = 0;
    00034     virtual void construct(void* buffer) const = 0;
    00035   };
    00036
    00039   class Tag  {
    00040   public:
    00041     long             first;
    00042     const std::type_info& second;
    00043     Tag(long f, const std::type_info& s) : first(f), second(s) {    }
    00044     Tag(const Tag& t) : first(t.first), second(t.second)  {    }
    00045   };
    00046
    00047 private:
    00050   template <class T> class _V : public IValue    {
    00051     T m_O;
    00052   public:
    00053     _V(const T& v) : m_O(v)       {      m_P = &m_O;           }
    00054     virtual ~_V()                 {                            }
    00055     virtual long size()  const    {      return sizeof(T);     }
    00056     void construct(void* b) const {      ::new(b) T();         }
    00057   };
    00058
    00061   template <class T> class _TT : public Tag   {
    00062   public:    _TT() : Tag(sizeof(T), typeid(T))    {         }
    00063   };
    00064
    00065 protected:
    00066   // Referenced implementation of the IInspector interface:
    00068         virtual StatusCode inspectByRef(const void* pObj, const Tag& typ, void* pOwner, const Tag& otag, const std::string& comment, long flag) = 0;
    00070         virtual StatusCode inspectByValue(IValue* pObj,   const Tag& typ, void* pOwner, const Tag& oTag, const std::string& comment) = 0;
    00072         virtual StatusCode inspectContByRef(const void* pObj, const Tag& tag, const Tag& rtag, const Tag& vtag, const void* pOwner, const Tag& otag, const std::string& comment, long flags) = 0;
    00074         virtual StatusCode inspectContByValue(IValue* pObj, const Tag& tag, const Tag& rtag, const Tag& vtag, const void* pOwner, const Tag& otag, const std::string& comment) = 0;
    00075
    00076 public:
    00077   // User interface of the IInspector interface
    00079         template < class T, class O >
    00080   StatusCode inspectByRef(const T* pObj, const O* pOwner, const std::string& comment, long flag=MUTABLE)        {
    00081                 return inspectByRef(pObj, _TT<T>(), (void*)pOwner, _TT<O>(), comment, flag);
    00082         }
    00084         template < class T, class O >
    00085   StatusCode inspectByValue(const T& obj, const O* pOwner, const std::string& comment) {
    00086                 return inspectByValue(new _V<T>(obj), _TT<T>(), (void*)pOwner, _TT<O>(), comment);
    00087         }
    00089         template < class T, class O >
    00090   StatusCode inspectContByRef( const T* pObj, const O* pOwner, const std::string& comment, long flag=MUTABLE)     {
    00091           typedef typename T::value_type                 _VVV;
    00092           typedef typename T::value_type                 _TTT;
    00093           // Unfortunately this is not implemented on G++:
    00094           // typedef typename T::allocator_type::value_type _TTT;
    00095     return inspectContByRef((void*)pObj, _TT<T>(), _TT<_VVV>(), _TT<_TTT>(), (void*)pOwner, _TT<O>(), comment, flag);
    00096   }
    00098         template < class T, class O >
    00099   StatusCode inspectContByValue( const T& obj, const O* pOwner, const std::string& comment)       {
    00100           typedef typename T::value_type                 _VVV;
    00101           typedef typename T::value_type                 _TTT;
    00102           // Unfortunately this is not implemented on G++:
    00103           // typedef typename T::allocator_type::value_type _TTT;
    00104     return inspectContByValue(new _V<T>(obj), _TT<T>(), _TT<_VVV>(), _TT<_TTT>(), (void*)pOwner, _TT<O>(), comment);
    00105   }
    00106 };
    00107 #endif // GAUDIKERNEL_IINSPECTOR_H