#ifndef _MACROS_H_ #define _MACROS_H_ /*++ Copyright (c) 2000 Microsoft Corporation Module Name: MACROS.H Abstract: Project agnostic utility macros Author: 990518 dane Created. 990721 dane Removed ASSERTs from ROE_*. A failure does not necessarily an ASSERT need. georgema 000310 updated Environment: Win98, Win2000 Revision History: --*/ #include #if _MSC_VER > 1000 // make the beginning and end of a namespace stand out // #define BEGIN_NAMESPACE(name) namespace name { #define END_NAMESPACE(name) }; #define USING_NAMESPACE(name) using namespace name #else #define BEGIN_NAMESPACE(name) #define END_NAMESPACE(name) #define USING_NAMESPACE(name) #endif // _MSC_VER > 1000 // Heap allocation...use CRT debug new when _DEBUG is defined // #ifdef _DEBUG #define _NEW new(_CLIENT_BLOCK, _THIS_FILE_, __LINE__) #else // ! _DEBUG #define _NEW new #endif // _DEBUG #define _DELETE delete // aliases for assertion macros // #ifdef ASSERT #undef ASSERT #endif // ASSERT #ifdef VERIFY #undef VERIFY #endif // VERIFY #ifdef _DEBUG #define ASSERT(cond) _ASSERTE(cond) #define VERIFY(cond) _ASSERTE(cond) #else // NDEBUG #define ASSERT(cond) ((void)0) #define VERIFY(cond) (cond) #endif // _DEBUG // aliases for segment names // #ifdef DATASEG_READONLY #undef DATASEG_READONLY #endif // DATASEG_READONLY #define DATASEG_READONLY ".rdata" ////////////////////////////////////////////////////////////////////////////// // // RETURN ON ERROR macros // // ROE_HRESULT // ROE_LRESULT // ROE_POINTER // // Checks a return code or condition and returns a user-supplied error code if // an error has occurred. // // Usage: // TYPE Foo( ) // { // TYPE status = Bar( ); // ROE_TYPE(status, ret); // // // continue processing... // } // // #define ROE_HRESULT(hr, ret) \ if (FAILED(hr)) \ { \ LogError(0, _THIS_FILE_, __LINE__, \ _T("0x%08X 0x%08X\n"), \ hr, ret); \ return (ret); \ } #define ROE_LRESULT(lr, ret) \ if (ERROR_SUCCESS != lr) \ { \ LogError(0, _THIS_FILE_, __LINE__, \ _T("0x%08X 0x%08X\n"), \ lr, ret); \ return (ret); \ } #define ROE_POINTER(p, ret) \ if (NULL == (p)) \ { \ LogError(0, _THIS_FILE_, __LINE__, \ _T("0x%08X\n"), \ ret); \ return (ret); \ } #define ROE_CONDITION(cond, ret) \ if (! (cond)) \ { \ LogError(0, _THIS_FILE_, __LINE__, \ _T("0x%08X 0x%08X\n"), \ ##cond, ret); \ return (ret); \ } ////////////////////////////////////////////////////////////////////////////// // // CHECK macros // // CHECK_HRESULT // CHECK_LRESULT // CHECK_POINTER // CHECK_MESSAGE // // Checks a return code or condition and returns a user-supplied error code if // an error has occurred. // // Usage: // TYPE Foo( ) // { // TYPE status = Bar( ); // CHECK_TYPE(status); // // // continue processing... // } // // #define CHECK_HRESULT(hr) \ (FAILED(hr)) \ ? LogError(0, _THIS_FILE_, __LINE__, _T("0x%08X"), hr), hr \ : hr #define CHECK_LRESULT(lr) \ (ERROR_SUCCESS != lr) \ ? LogError(0, _THIS_FILE_, __LINE__, _T("0x%08X"), lr), lr \ : lr #define CHECK_POINTER(p) \ (NULL == (p)) \ ? LogError(0, _THIS_FILE_, __LINE__, _T("NULL pointer"), p), p \ : p #ifdef _DEBUG #define CHECK_MESSAGE(hwnd, msg, wparam, lparam) \ { \ LogInfo(0, _THIS_FILE_, __LINE__, \ _T("MESSAGE: 0x%08X, 0x%08X, 0x%08X, 0x%08X\n"), \ hwnd, msg, wparam, lparam); \ } #else #define CHECK_MESSAGE(hwnd, msg, wparam, lparam) ((void)0) #endif // _DEBUG // count of elements in an array // #define COUNTOF(array) (sizeof(array) / sizeof(array[0])) #endif // _MACROS_H_ // ///// End of file: Macros.h ////////////////////////////////////////////////