00001
00002 #ifndef GAUDIKERNEL_IINTERFACE_H
00003 #define GAUDIKERNEL_IINTERFACE_H
00004
00005
00006
00007 #include "GaudiKernel/Kernel.h"
00008 #include "GaudiKernel/StatusCode.h"
00009
00020 class InterfaceID {
00021 public:
00023 InterfaceID( unsigned long lid )
00024 : m_id( lid & 0xFFFF ), m_major_ver( (lid & 0xFF000000)>>24 ), m_minor_ver( (lid & 0xFF0000)>> 16 ) { }
00026 InterfaceID( unsigned long id, unsigned long major, unsigned long minor = 0)
00027 : m_id( id ), m_major_ver( major ), m_minor_ver( minor ) { }
00029 ~InterfaceID() { }
00031 operator unsigned long() const { return (m_major_ver << 24) + (m_minor_ver << 16) + m_id; }
00033 unsigned long id() const { return m_id; }
00035 unsigned long majorVersion() const { return m_major_ver; }
00037 unsigned long minorVersion() const { return m_minor_ver; }
00039 bool versionMatch( const InterfaceID& iid ) const {
00040 return ( id() == iid.id() && majorVersion() == iid.majorVersion() && minorVersion() >= iid.minorVersion() );
00041 }
00043 bool fullMatch( const InterfaceID& iid ) const {
00044 return ( id() == iid.id() && majorVersion() == iid.majorVersion() && minorVersion() == iid.minorVersion() );
00045 }
00046 bool operator == (const InterfaceID& iid ) const { return fullMatch(iid); }
00047 private:
00048 unsigned long m_id;
00049 unsigned long m_major_ver;
00050 unsigned long m_minor_ver;
00051 };
00052
00054 typedef InterfaceID IID;
00055
00056
00057 static const InterfaceID IID_IInterface(1,0,0);
00058
00065 class IInterface {
00066 public:
00068 static const InterfaceID& interfaceID() { return IID_IInterface; }
00069
00074 virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvInterface) = 0;
00075
00077 virtual unsigned long addRef() = 0;
00078
00080 virtual unsigned long release() = 0;
00081
00083 enum Status {
00085 SUCCESS = 1,
00087 NO_INTERFACE,
00089 VERSMISMATCH,
00091 LAST_ERROR
00092 };
00093 };
00094
00102 template <class I>
00103 bool isValidInterface( I* i) {
00104 void* ii;
00105 StatusCode sc = i->queryInterface( I::interfaceID(), &ii);
00106 return sc.isSuccess();
00107 }
00108
00109
00110 #endif // GAUDIKERNEL_IINTERFACE_H