| #ifndef SLANG_COM_HELPER_H |
| #define SLANG_COM_HELPER_H |
|
|
| |
| |
|
|
| #include "slang.h" |
| #include <atomic> |
|
|
| |
|
|
| |
| #ifndef SLANG_HANDLE_RESULT_FAIL |
| # define SLANG_HANDLE_RESULT_FAIL(x) |
| #endif |
|
|
| |
| #define SLANG_RETURN_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return _res; } } |
| |
| #define SLANG_RETURN_VOID_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return; } } |
| |
| #define SLANG_RETURN_FALSE_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return false; } } |
| |
| #define SLANG_RETURN_NULL_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return nullptr; } } |
|
|
| |
| #define SLANG_ASSERT_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { assert(false); return _res; } } |
| |
| #define SLANG_ASSERT_VOID_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { assert(false); return; } } |
|
|
| |
|
|
| #if defined(__cplusplus) |
| namespace Slang { |
|
|
| |
| typedef SlangResult Result; |
| |
| typedef SlangUUID Guid; |
|
|
| } |
|
|
| |
|
|
| SLANG_FORCE_INLINE bool operator==(const Slang::Guid& aIn, const Slang::Guid& bIn) |
| { |
| using namespace Slang; |
| |
| typedef uint32_t CmpType; |
| union GuidCompare |
| { |
| Guid guid; |
| CmpType data[sizeof(Guid) / sizeof(CmpType)]; |
| }; |
| |
| const CmpType* a = reinterpret_cast<const GuidCompare&>(aIn).data; |
| const CmpType* b = reinterpret_cast<const GuidCompare&>(bIn).data; |
| |
| return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3])) == 0; |
| } |
|
|
| SLANG_FORCE_INLINE bool operator!=(const Slang::Guid& a, const Slang::Guid& b) |
| { |
| return !(a == b); |
| } |
|
|
| |
|
|
| |
| |
| |
|
|
| #define SLANG_IUNKNOWN_QUERY_INTERFACE \ |
| SLANG_NO_THROW SlangResult SLANG_MCALL queryInterface(SlangUUID const& uuid, void** outObject) SLANG_OVERRIDE \ |
| { \ |
| ISlangUnknown* intf = getInterface(uuid); \ |
| if (intf) \ |
| { \ |
| addRef(); \ |
| *outObject = intf; \ |
| return SLANG_OK;\ |
| } \ |
| return SLANG_E_NO_INTERFACE;\ |
| } |
|
|
| #define SLANG_IUNKNOWN_ADD_REF \ |
| SLANG_NO_THROW uint32_t SLANG_MCALL addRef() \ |
| { \ |
| return ++m_refCount; \ |
| } |
|
|
| #define SLANG_IUNKNOWN_RELEASE \ |
| SLANG_NO_THROW uint32_t SLANG_MCALL release() \ |
| { \ |
| --m_refCount; \ |
| if (m_refCount == 0) \ |
| { \ |
| delete this; \ |
| return 0; \ |
| } \ |
| return m_refCount; \ |
| } |
|
|
| #define SLANG_IUNKNOWN_ALL \ |
| SLANG_IUNKNOWN_QUERY_INTERFACE \ |
| SLANG_IUNKNOWN_ADD_REF \ |
| SLANG_IUNKNOWN_RELEASE |
|
|
| |
|
|
| #define SLANG_REF_OBJECT_IUNKNOWN_QUERY_INTERFACE \ |
| SLANG_NO_THROW SlangResult SLANG_MCALL queryInterface(SlangUUID const& uuid, void** outObject) SLANG_OVERRIDE \ |
| { \ |
| void* intf = getInterface(uuid); \ |
| if (intf) \ |
| { \ |
| addReference(); \ |
| *outObject = intf; \ |
| return SLANG_OK;\ |
| } \ |
| return SLANG_E_NO_INTERFACE;\ |
| } |
|
|
| #define SLANG_REF_OBJECT_IUNKNOWN_ADD_REF SLANG_NO_THROW uint32_t SLANG_MCALL addRef() SLANG_OVERRIDE { return (uint32_t)addReference(); } |
| #define SLANG_REF_OBJECT_IUNKNOWN_RELEASE SLANG_NO_THROW uint32_t SLANG_MCALL release() SLANG_OVERRIDE { return (uint32_t)releaseReference(); } |
|
|
| # define SLANG_REF_OBJECT_IUNKNOWN_ALL \ |
| SLANG_REF_OBJECT_IUNKNOWN_QUERY_INTERFACE \ |
| SLANG_REF_OBJECT_IUNKNOWN_ADD_REF \ |
| SLANG_REF_OBJECT_IUNKNOWN_RELEASE |
|
|
| #endif |
|
|
| #endif |
|
|