2 #ifndef GAUDIKERNEL_IINTERFACE_H
3 #define GAUDIKERNEL_IINTERFACE_H
13 #include <boost/mpl/set.hpp>
14 #include <boost/mpl/insert.hpp>
15 #include <boost/mpl/fold.hpp>
16 #include <boost/mpl/for_each.hpp>
17 namespace mpl = boost::mpl;
24 #define DeclareInterfaceID(name, major, minor) \
25 static const InterfaceID &interfaceID(){ return iid::interfaceID(); } \
26 typedef Gaudi::InterfaceId< name , major , minor > iid; \
27 typedef iid::iids::type ext_iids
30 #define DeclareInterfaceID(name, major, minor) \
31 static const InterfaceID &interfaceID(){ static InterfaceID xx(0UL,0UL,0UL); return xx; }
36 #define DeclareInterfaceIDMultiBase(name, major, minor) \
37 static const InterfaceID &interfaceID(){ return iid::interfaceID(); } \
38 typedef Gaudi::InterfaceId< name , major , minor > iid
41 #define DeclareInterfaceIDMultiBase(name, major, minor) \
42 static const InterfaceID &interfaceID(){ static InterfaceID xx(0UL,0UL,0UL); return xx; }
58 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
60 InterfaceID(
unsigned long lid ) : m_id( lid & 0xFFFF ),
61 m_major_ver( (lid & 0xFF000000)>>24 ),
62 m_minor_ver( (lid & 0xFF0000)>> 16 ) { }
65 InterfaceID(
unsigned long id,
unsigned long major,
unsigned long minor = 0)
66 : m_id( id ), m_major_ver( major ), m_minor_ver( minor ) { }
68 InterfaceID(
const char* name,
unsigned long major,
unsigned long minor = 0)
69 : m_id( hash32(name) ), m_major_ver( major ), m_minor_ver( minor ) { }
72 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
74 operator unsigned long()
const {
75 return (m_major_ver << 24) + (m_minor_ver << 16) + m_id;
79 unsigned long id()
const {
return m_id; }
88 return (
id() == iid.
id() &&
94 return (
id() == iid.
id() &&
101 static unsigned int hash32(
const char* key) {
104 for (hash = 0, k = key; *k; k++) {
105 hash += *k; hash += (hash << 10); hash ^= (hash >> 6);
107 hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15);
121 template <
typename INTERFACE,
unsigned long majVers,
unsigned long minVers>
129 typedef mpl::insert<typename iface_type::ext_iids, InterfaceId>
iids;
141 return typeid(INTERFACE);
165 typedef Gaudi::InterfaceId<IInterface,0,0>
iid;
174 return iid::interfaceID();
184 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
192 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
199 virtual unsigned long addRef() = 0;
202 virtual unsigned long release() = 0;
205 virtual unsigned long refCount() const
206 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NEW_INTERFACES)
235 template <
typename TARGET>
237 return reinterpret_cast<TARGET*
>(i->
i_cast(TARGET::interfaceID()));
241 template <
typename TARGET>
243 return reinterpret_cast<const TARGET*
>(i->
i_cast(TARGET::interfaceID()));
260 StatusCode sc = i->queryInterface( I::interfaceID(), &ii);
267 s <<
"IID_" <<
id.id();
282 template <
class DEST,
class SRC>
284 return reinterpret_cast<DEST**
>(ptr);
291 #endif // GAUDIKERNEL_IINTERFACE_H