1 #ifndef GAUDIKERNEL_IINTERFACE_H
2 #define GAUDIKERNEL_IINTERFACE_H
12 #include <boost/mpl/set.hpp>
13 #include <boost/mpl/insert.hpp>
14 #include <boost/mpl/fold.hpp>
15 #include <boost/mpl/for_each.hpp>
16 namespace mpl = boost::mpl;
23 #define DeclareInterfaceID(name, major, minor) \
24 static const InterfaceID &interfaceID(){ return iid::interfaceID(); } \
25 typedef Gaudi::InterfaceId< name , major , minor > iid; \
26 typedef iid::iids::type ext_iids
29 #define DeclareInterfaceID(name, major, minor) \
30 static const InterfaceID &interfaceID(){ static InterfaceID xx(0UL,0UL,0UL); return xx; }
35 #define DeclareInterfaceIDMultiBase(name, major, minor) \
36 static const InterfaceID &interfaceID(){ return iid::interfaceID(); } \
37 typedef Gaudi::InterfaceId< name , major , minor > iid
40 #define DeclareInterfaceIDMultiBase(name, major, minor) \
41 static const InterfaceID &interfaceID(){ static InterfaceID xx(0UL,0UL,0UL); return xx; }
57 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
59 InterfaceID(
unsigned long lid ) : m_id( lid & 0xFFFF ),
60 m_major_ver( (lid & 0xFF000000)>>24 ),
61 m_minor_ver( (lid & 0xFF0000)>> 16 ) { }
64 InterfaceID(
unsigned long id,
unsigned long major,
unsigned long minor = 0)
65 : m_id( id ), m_major_ver( major ), m_minor_ver( minor ) { }
67 InterfaceID(
const char* name,
unsigned long major,
unsigned long minor = 0)
68 : m_id( hash32(name) ), m_major_ver( major ), m_minor_ver( minor ) { }
71 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
73 operator unsigned long()
const {
74 return (m_major_ver << 24) + (m_minor_ver << 16) + m_id;
78 unsigned long id()
const {
return m_id; }
87 return (
id() == iid.
id() &&
93 return (
id() == iid.
id() &&
100 static unsigned int hash32(
const char* key) {
103 for (hash = 0, k = key; *k; k++) {
104 hash += *k; hash += (hash << 10); hash ^= (hash >> 6);
106 hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15);
120 template <
typename INTERFACE,
unsigned long majVers,
unsigned long minVers>
128 typedef mpl::insert<typename iface_type::ext_iids, InterfaceId>
iids;
140 return typeid(INTERFACE);
164 typedef Gaudi::InterfaceId<IInterface,0,0>
iid;
173 return iid::interfaceID();
183 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
191 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
198 virtual unsigned long addRef() = 0;
201 virtual unsigned long release() = 0;
204 virtual unsigned long refCount() const
205 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
234 template <
typename TARGET>
236 return reinterpret_cast<TARGET*
>(i->
i_cast(TARGET::interfaceID()));
240 template <
typename TARGET>
242 return reinterpret_cast<const TARGET*
>(i->
i_cast(TARGET::interfaceID()));
259 StatusCode sc = i->queryInterface( I::interfaceID(), &ii);
266 s <<
"IID_" <<
id.id();
281 template <
class DEST,
class SRC>
283 return reinterpret_cast<DEST**
>(ptr);
290 #endif // GAUDIKERNEL_IINTERFACE_H