-
Notifications
You must be signed in to change notification settings - Fork 245
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Expose macros/functionality for defining interfaces (#604)
* Added Result definitions to the slang.h * Removed slang-result.h and added slang-com-helper.h * Move slang-com-ptr.h to be publically available. * Add SLANG_IUNKNOWN macros to simplify implementing interfaces. Use the SLANG_IUNKNOWN macros to in slang.c * Removed slang-defines.h added outstanding defines to slang.h
- Loading branch information
1 parent
e66d66b
commit d0c9571
Showing
25 changed files
with
510 additions
and
732 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
#ifndef SLANG_COM_HELPER_H | ||
#define SLANG_COM_HELPER_H | ||
|
||
/** \file slang-com-helper.h | ||
*/ | ||
|
||
#include "slang.h" | ||
|
||
/* !!!!!!!!!!!!!!!!!!!!! Macros to help checking SlangResult !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ | ||
|
||
/*! Set SLANG_HANDLE_RESULT_FAIL(x) to code to be executed whenever an error occurs, and is detected by one of the macros */ | ||
#ifndef SLANG_HANDLE_RESULT_FAIL | ||
# define SLANG_HANDLE_RESULT_FAIL(x) | ||
#endif | ||
|
||
//! Helper macro, that makes it easy to add result checking to calls in functions/methods that themselves return Result. | ||
#define SLANG_RETURN_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return _res; } } | ||
//! Helper macro that can be used to test the return value from a call, and will return in a void method/function | ||
#define SLANG_RETURN_VOID_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return; } } | ||
//! Helper macro that will return false on failure. | ||
#define SLANG_RETURN_FALSE_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return false; } } | ||
//! Helper macro that will return nullptr on failure. | ||
#define SLANG_RETURN_NULL_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { SLANG_HANDLE_RESULT_FAIL(_res); return nullptr; } } | ||
|
||
//! Helper macro that will assert if the return code from a call is failure, also returns the failure. | ||
#define SLANG_ASSERT_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { assert(false); return _res; } } | ||
//! Helper macro that will assert if the result from a call is a failure, also returns. | ||
#define SLANG_ASSERT_VOID_ON_FAIL(x) { SlangResult _res = (x); if (SLANG_FAILED(_res)) { assert(false); return; } } | ||
|
||
/* !!!!!!!!!!!!!!!!!!!!!!! C++ helpers !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ | ||
|
||
#if defined(__cplusplus) | ||
namespace Slang { | ||
|
||
// Alias SlangResult to Slang::Result | ||
typedef SlangResult Result; | ||
// Alias SlangUUID to Slang::Guid | ||
typedef SlangUUID Guid; | ||
|
||
SLANG_FORCE_INLINE bool operator==(const Guid& aIn, const Guid& bIn) | ||
{ | ||
// Use the largest type the honors the alignment of Guid | ||
typedef uint32_t CmpType; | ||
union GuidCompare | ||
{ | ||
Guid guid; | ||
CmpType data[sizeof(Guid) / sizeof(CmpType)]; | ||
}; | ||
// Type pun - so compiler can 'see' the pun and not break aliasing rules | ||
const CmpType* a = reinterpret_cast<const GuidCompare&>(aIn).data; | ||
const CmpType* b = reinterpret_cast<const GuidCompare&>(bIn).data; | ||
// Make the guid comparison a single branch, by not using short circuit | ||
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3])) == 0; | ||
} | ||
|
||
SLANG_FORCE_INLINE bool operator!=(const Guid& a, const Guid& b) | ||
{ | ||
return !(a == b); | ||
} | ||
|
||
|
||
/* !!!!!!!! Macros to simplify implementing COM interfaces !!!!!!!!!!!!!!!!!!!!!!!!!!!! */ | ||
|
||
/* Assumes underlying implementation has a member m_refCount that is initialized to 0 and can have ++ and -- operate on it. | ||
For SLANG_IUNKNOWN_QUERY_INTERFACE to work - must have a method 'getInterface' that returns valid pointers for the Guid, or nullptr | ||
if not found. */ | ||
|
||
#define SLANG_IUNKNOWN_QUERY_INTERFACE \ | ||
SLANG_NO_THROW SlangResult SLANG_MCALL queryInterface(SlangUUID const& uuid, void** outObject) \ | ||
{ \ | ||
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 | ||
|
||
} // namespace Slang | ||
#endif // defined(__cplusplus) | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.