#pragma once

#define NUMBER_OF(x) ( (sizeof(x) / sizeof(*x) ) )
#define IFFAILED_EXIT(_x) do {HRESULT __hr = (_x); if (FAILED(__hr)) { goto Exit; } } while (0)
#define IFFALSE_EXIT(_x) do {if (!(_x)) {goto Exit; } } while (0)

#define FN_TRACE_WIN32(args)
#define FN_TRACE()

#define PARAMETER_CHECK(args) IFFALSE_EXIT(args)

#define IFALLOCFAILED_EXIT(_x) do {if ((_x) == NULL) {goto Exit; } } while (0)

#define FUSION_HASH_ALGORITHM HASH_STRING_ALGORITHM_X65599

#define FUSION_NEW_ARRAY(_type, _n) (new _type[_n])
#define FUSION_RAW_ALLOC_(_heap, _cb, _typeTag) (new BYTE[_cb])

#define FUSION_RAW_ALLOC(_cb, _typeTag) (new BYTE[_cb])

#define ASSERT(_x) 
#define FUSION_DELETE_ARRAY(_ptr) (delete _ptr)
#define FUSION_RAW_DEALLOC_(_heap, _ptr) (delete _ptr)
#define FUSION_RAW_DEALLOC(_ptr) (delete _ptr)

#define ORIGINATE_WIN32_FAILURE_AND_EXIT(_x, _le) do {  ::SetLastError(_le); goto Exit; } while (0)

#define FUSION_DBG_LEVEL_VERBOSE 0

#define INTERNAL_ERROR_CHECK(_e) 

#define FUSION_NEW_SINGLETON(_type) (new _type)

#define FUSION_DELETE_SINGLETON(_ptr) (delete _ptr)

#define HARD_ASSERT_ACTION(_e)



ULONG
FusionpDbgPrintEx(
    ULONG Level,
    PCSTR Format,
    ...
    );


int
FusionpCompareStrings(
    PCWSTR psz1,
    SIZE_T cch1,
    PCWSTR psz2,
    SIZE_T cch2,
    bool fCaseInsensitive
    );


BOOL
FusionpHashUnicodeString(
    PCWSTR szString,
    SIZE_T cchString,
    PULONG HashValue,
    DWORD dwCmpFlags
    );