00001
00002 #ifndef GAUDIKERNEL_IINSPECTOR_H
00003 #define GAUDIKERNEL_IINSPECTOR_H
00004
00005
00006 #include <typeinfo>
00007 #include <string>
00008
00009
00010 #include "GaudiKernel/IInterface.h"
00011
00016 class GAUDI_API IInspector: virtual public IInterface {
00017 public:
00019 DeclareInterfaceID(IInspector,1,0);
00020
00021 enum { MUTABLE = 1<<1, CONST = 1<<2};
00022
00023 protected:
00024
00027 class IValue {
00028 protected:
00029 void* m_P;
00030 IValue() { }
00031 public:
00032 virtual ~IValue() { }
00033 virtual void release() { delete this; }
00034 void* ptr() { return m_P; }
00035 const void* ptr() const { return m_P; }
00036 virtual long size() const = 0;
00037 virtual void construct(void* buffer) const = 0;
00038 };
00039
00042 class Tag {
00043 public:
00044 long first;
00045 const std::type_info& second;
00046 Tag(long f, const std::type_info& s) : first(f), second(s) { }
00047 Tag(const Tag& t) : first(t.first), second(t.second) { }
00048 };
00049
00050 private:
00053 template <class T> class _V : public IValue {
00054 T m_O;
00055 public:
00056 _V(const T& v) : m_O(v) { m_P = &m_O; }
00057 virtual ~_V() { }
00058 virtual long size() const { return sizeof(T); }
00059 void construct(void* b) const { ::new(b) T(); }
00060 };
00061
00064 template <class T> class _TT : public Tag {
00065 public: _TT() : Tag(sizeof(T), typeid(T)) { }
00066 };
00067
00068 protected:
00069
00071 virtual StatusCode inspectByRef(const void* pObj, const Tag& typ, void* pOwner, const Tag& otag, const std::string& comment, long flag) = 0;
00073 virtual StatusCode inspectByValue(IValue* pObj, const Tag& typ, void* pOwner, const Tag& oTag, const std::string& comment) = 0;
00075 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;
00077 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;
00078
00079 public:
00080
00082 template < class T, class O >
00083 StatusCode inspectByRef(const T* pObj, const O* pOwner, const std::string& comment, long flag=MUTABLE) {
00084 return inspectByRef(pObj, _TT<T>(), (void*)pOwner, _TT<O>(), comment, flag);
00085 }
00087 template < class T, class O >
00088 StatusCode inspectByValue(const T& obj, const O* pOwner, const std::string& comment) {
00089 return inspectByValue(new _V<T>(obj), _TT<T>(), (void*)pOwner, _TT<O>(), comment);
00090 }
00092 template < class T, class O >
00093 StatusCode inspectContByRef( const T* pObj, const O* pOwner, const std::string& comment, long flag=MUTABLE) {
00094 typedef typename T::value_type _VVV;
00095 typedef typename T::value_type _TTT;
00096
00097
00098 return inspectContByRef((void*)pObj, _TT<T>(), _TT<_VVV>(), _TT<_TTT>(), (void*)pOwner, _TT<O>(), comment, flag);
00099 }
00101 template < class T, class O >
00102 StatusCode inspectContByValue( const T& obj, const O* pOwner, const std::string& comment) {
00103 typedef typename T::value_type _VVV;
00104 typedef typename T::value_type _TTT;
00105
00106
00107 return inspectContByValue(new _V<T>(obj), _TT<T>(), _TT<_VVV>(), _TT<_TTT>(), (void*)pOwner, _TT<O>(), comment);
00108 }
00109 };
00110 #endif // GAUDIKERNEL_IINSPECTOR_H