IInspector.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_IINSPECTOR_H
2 #define GAUDIKERNEL_IINSPECTOR_H
3 
4 // STL Include files
5 #include <typeinfo>
6 #include <string>
7 
8 // Framework Include files
9 #include "GaudiKernel/IInterface.h"
10 
15 class GAUDI_API IInspector: virtual public IInterface {
16 public:
19 
20  enum { MUTABLE = 1<<1, CONST = 1<<2};
21 
22 protected:
23 
26  class IValue {
27  protected:
28  void* m_P;
29  IValue() = default;
30  public:
31  virtual ~IValue() = default;
32  virtual void release() { delete this; }
33  void* ptr() { return m_P; }
34  const void* ptr() const { return m_P; }
35  virtual long size() const = 0;
36  virtual void construct(void* buffer) const = 0;
37  };
38 
41  struct Tag {
42  long first;
43  const std::type_info& second;
44  Tag(long f, const std::type_info& s) : first(f), second(s) { }
45  };
46 
47 private:
50  template <class T> class _V : public IValue {
51  T m_O;
52  public:
53  _V(const T& v) : m_O(v) { m_P = &m_O; }
54  virtual ~_V() = default;
55  virtual long size() const { return sizeof(T); }
56  virtual void construct(void* b) const { ::new(b) T(); }
57  };
58 
61  template <class T> class _TT : public Tag {
62  public: _TT() : Tag(sizeof(T), typeid(T)) { }
63  };
64 
65 protected:
66  // Referenced implementation of the IInspector interface:
68  virtual StatusCode inspectByRef(const void* pObj, const Tag& typ, void* pOwner, const Tag& otag, const std::string& comment, long flag) = 0;
70  virtual StatusCode inspectByValue(IValue* pObj, const Tag& typ, void* pOwner, const Tag& oTag, const std::string& comment) = 0;
72  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;
74  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;
75 
76 public:
77  // User interface of the IInspector interface
79  template < class T, class O >
80  StatusCode inspectByRef(const T* pObj, const O* pOwner, const std::string& comment, long flag=MUTABLE) {
81  return inspectByRef(pObj, _TT<T>(), (void*)pOwner, _TT<O>(), comment, flag);
82  }
84  template < class T, class O >
85  StatusCode inspectByValue(const T& obj, const O* pOwner, const std::string& comment) {
86  return inspectByValue(new _V<T>(obj), _TT<T>(), (void*)pOwner, _TT<O>(), comment);
87  }
89  template < class T, class O >
90  StatusCode inspectContByRef( const T* pObj, const O* pOwner, const std::string& comment, long flag=MUTABLE) {
91  typedef typename T::value_type _VVV;
92  typedef typename T::value_type _TTT;
93  // Unfortunately this is not implemented on G++:
94  // typedef typename T::allocator_type::value_type _TTT;
95  return inspectContByRef((void*)pObj, _TT<T>(), _TT<_VVV>(), _TT<_TTT>(), (void*)pOwner, _TT<O>(), comment, flag);
96  }
98  template < class T, class O >
99  StatusCode inspectContByValue( const T& obj, const O* pOwner, const std::string& comment) {
100  typedef typename T::value_type _VVV;
101  typedef typename T::value_type _TTT;
102  // Unfortunately this is not implemented on G++:
103  // typedef typename T::allocator_type::value_type _TTT;
104  return inspectContByValue(new _V<T>(obj), _TT<T>(), _TT<_VVV>(), _TT<_TTT>(), (void*)pOwner, _TT<O>(), comment);
105  }
106 };
107 #endif // GAUDIKERNEL_IINSPECTOR_H
const std::type_info & second
Definition: IInspector.h:43
StatusCode inspectByRef(const T *pObj, const O *pOwner, const std::string &comment, long flag=MUTABLE)
Inspect single item by its reference (mutable and const)
Definition: IInspector.h:80
#define GAUDI_API
Definition: Kernel.h:107
StatusCode inspectByValue(const T &obj, const O *pOwner, const std::string &comment)
Inspect single item by its value (const)
Definition: IInspector.h:85
virtual void release()
Definition: IInspector.h:32
#define DeclareInterfaceID(iface, major, minor)
Macro to declare the interface ID when using the new mechanism of extending and implementing interfac...
Definition: IInterface.h:14
_V(const T &v)
Definition: IInspector.h:53
StatusCode inspectContByValue(const T &obj, const O *pOwner, const std::string &comment)
Inspect container of object items by its value (const)
Definition: IInspector.h:99
Inspector base class.
Definition: IInspector.h:15
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
Definition of the basic interface.
Definition: IInterface.h:234
virtual void construct(void *b) const
Definition: IInspector.h:56
StatusCode inspectContByRef(const T *pObj, const O *pOwner, const std::string &comment, long flag=MUTABLE)
Inspect container of object items by its reference (mutable and const)
Definition: IInspector.h:90
const void * ptr() const
Definition: IInspector.h:34
string s
Definition: gaudirun.py:246
virtual long size() const
Definition: IInspector.h:55
Tag(long f, const std::type_info &s)
Definition: IInspector.h:44