|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef LLVM_SUPPORT_WIN_ADAPTER_H |
|
#define LLVM_SUPPORT_WIN_ADAPTER_H |
|
|
|
#ifndef _WIN32 |
|
|
|
#ifdef __cplusplus |
|
#include <atomic> |
|
#include <cassert> |
|
#include <climits> |
|
#include <cstring> |
|
#include <cwchar> |
|
#include <fstream> |
|
#include <stdarg.h> |
|
#include <stddef.h> |
|
#include <stdint.h> |
|
#include <string> |
|
#include <typeindex> |
|
#include <typeinfo> |
|
#include <vector> |
|
#endif |
|
|
|
#define COM_NO_WINDOWS_H |
|
|
|
|
|
|
|
|
|
|
|
|
|
#define C_ASSERT(expr) static_assert((expr), "") |
|
#define ATLASSERT assert |
|
|
|
#define CoTaskMemAlloc malloc |
|
#define CoTaskMemFree free |
|
|
|
#define ARRAYSIZE(array) (sizeof(array) / sizeof(array[0])) |
|
|
|
#define _countof(a) (sizeof(a) / sizeof(*(a))) |
|
|
|
|
|
#ifndef __clang__ |
|
#define __EMULATE_UUID 1 |
|
#endif |
|
|
|
#ifdef __EMULATE_UUID |
|
#define __declspec(x) |
|
#endif |
|
|
|
#define DECLSPEC_SELECTANY |
|
|
|
#ifdef __EMULATE_UUID |
|
#define uuid(id) |
|
#endif |
|
|
|
#define STDMETHODCALLTYPE |
|
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE |
|
#define STDMETHODIMP STDMETHODIMP_(HRESULT) |
|
#define STDMETHOD_(type, name) virtual STDMETHODIMP_(type) name |
|
#define STDMETHOD(name) STDMETHOD_(HRESULT, name) |
|
#define EXTERN_C extern "C" |
|
|
|
#define UNREFERENCED_PARAMETER(P) (void)(P) |
|
|
|
#define RtlEqualMemory(Destination, Source, Length) \ |
|
(!memcmp((Destination), (Source), (Length))) |
|
#define RtlMoveMemory(Destination, Source, Length) \ |
|
memmove((Destination), (Source), (Length)) |
|
#define RtlCopyMemory(Destination, Source, Length) \ |
|
memcpy((Destination), (Source), (Length)) |
|
#define RtlFillMemory(Destination, Length, Fill) \ |
|
memset((Destination), (Fill), (Length)) |
|
#define RtlZeroMemory(Destination, Length) memset((Destination), 0, (Length)) |
|
#define MoveMemory RtlMoveMemory |
|
#define CopyMemory RtlCopyMemory |
|
#define FillMemory RtlFillMemory |
|
#define ZeroMemory RtlZeroMemory |
|
|
|
#define FALSE 0 |
|
#define TRUE 1 |
|
|
|
|
|
#define GetConsoleOutputCP() 0 |
|
|
|
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc) |
|
#define DISP_E_BADINDEX _HRESULT_TYPEDEF_(0x8002000BL) |
|
#define REGDB_E_CLASSNOTREG _HRESULT_TYPEDEF_(0x80040154L) |
|
|
|
|
|
|
|
#define UIntToInt(uint_arg, int_ptr_arg) *int_ptr_arg = uint_arg |
|
|
|
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1) |
|
|
|
|
|
#define GetLastError() errno |
|
#define SetLastError(ERR) errno = ERR |
|
|
|
|
|
#define ERROR_SUCCESS 0L |
|
#define ERROR_ARITHMETIC_OVERFLOW EOVERFLOW |
|
#define ERROR_FILE_NOT_FOUND ENOENT |
|
#define ERROR_FUNCTION_NOT_CALLED ENOSYS |
|
#define ERROR_IO_DEVICE EIO |
|
#define ERROR_INSUFFICIENT_BUFFER ENOBUFS |
|
#define ERROR_INVALID_HANDLE EBADF |
|
#define ERROR_INVALID_PARAMETER EINVAL |
|
#define ERROR_OUT_OF_STRUCTURES ENOMEM |
|
#define ERROR_NOT_CAPABLE EPERM |
|
#define ERROR_NOT_FOUND ENOTSUP |
|
#define ERROR_UNHANDLED_EXCEPTION EBADF |
|
#define ERROR_BROKEN_PIPE EPIPE |
|
|
|
|
|
#define SEVERITY_ERROR 1 |
|
#define FACILITY_WIN32 7 |
|
#define HRESULT_CODE(hr) ((hr) & 0xFFFF) |
|
#define MAKE_HRESULT(severity, facility, code) \ |
|
((HRESULT)(((unsigned long)(severity) << 31) | \ |
|
((unsigned long)(facility) << 16) | ((unsigned long)(code)))) |
|
|
|
#define FILE_TYPE_UNKNOWN 0x0000 |
|
#define FILE_TYPE_DISK 0x0001 |
|
#define FILE_TYPE_CHAR 0x0002 |
|
#define FILE_TYPE_PIPE 0x0003 |
|
#define FILE_TYPE_REMOTE 0x8000 |
|
|
|
#define FILE_ATTRIBUTE_NORMAL 0x00000080 |
|
#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 |
|
#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) |
|
|
|
#define STDOUT_FILENO 1 |
|
#define STDERR_FILENO 2 |
|
|
|
|
|
#define STGTY_STORAGE 1 |
|
#define STGTY_STREAM 2 |
|
#define STGTY_LOCKBYTES 3 |
|
#define STGTY_PROPERTY 4 |
|
|
|
|
|
#define STG_E_INVALIDFUNCTION 1L |
|
#define STG_E_ACCESSDENIED 2L |
|
|
|
#define STREAM_SEEK_SET 0 |
|
#define STREAM_SEEK_CUR 1 |
|
#define STREAM_SEEK_END 2 |
|
|
|
#define HEAP_NO_SERIALIZE 0x1 |
|
#define HEAP_ZERO_MEMORY 0x8 |
|
|
|
#define MB_ERR_INVALID_CHARS 0x00000008 |
|
|
|
|
|
|
|
#define CREATE_ALWAYS 2 |
|
#define CREATE_NEW 1 |
|
#define OPEN_ALWAYS 4 |
|
#define OPEN_EXISTING 3 |
|
#define TRUNCATE_EXISTING 5 |
|
|
|
#define FILE_SHARE_DELETE 0x00000004 |
|
#define FILE_SHARE_READ 0x00000001 |
|
#define FILE_SHARE_WRITE 0x00000002 |
|
|
|
#define GENERIC_READ 0x80000000 |
|
#define GENERIC_WRITE 0x40000000 |
|
|
|
#define _atoi64 atoll |
|
#define sprintf_s snprintf |
|
#define _strdup strdup |
|
#define _strnicmp strnicmp |
|
|
|
#define vsnprintf_s vsnprintf |
|
#define strcat_s strcat |
|
#define strcpy_s(dst, n, src) strncpy(dst, src, n) |
|
#define _vscwprintf vwprintf |
|
#define vswprintf_s vswprintf |
|
#define swprintf_s swprintf |
|
|
|
#define StringCchCopyW(dst, n, src) wcsncpy(dst, src, n) |
|
|
|
#define OutputDebugStringW(msg) fputws(msg, stderr) |
|
|
|
#define OutputDebugStringA(msg) fputs(msg, stderr) |
|
#define OutputDebugFormatA(...) fprintf(stderr, __VA_ARGS__) |
|
|
|
|
|
|
|
|
|
#define DxcEtw_DXCompilerCreateInstance_Start() |
|
#define DxcEtw_DXCompilerCreateInstance_Stop(hr) |
|
#define DxcEtw_DXCompilerCompile_Start() |
|
#define DxcEtw_DXCompilerCompile_Stop(hr) |
|
#define DxcEtw_DXCompilerDisassemble_Start() |
|
#define DxcEtw_DXCompilerDisassemble_Stop(hr) |
|
#define DxcEtw_DXCompilerPreprocess_Start() |
|
#define DxcEtw_DXCompilerPreprocess_Stop(hr) |
|
#define DxcEtw_DxcValidation_Start() |
|
#define DxcEtw_DxcValidation_Stop(hr) |
|
|
|
#define UInt32Add UIntAdd |
|
#define Int32ToUInt32 IntToUInt |
|
|
|
|
|
|
|
#define S_OK ((HRESULT)0L) |
|
#define S_FALSE ((HRESULT)1L) |
|
|
|
#define E_ABORT (HRESULT)0x80004004 |
|
#define E_ACCESSDENIED (HRESULT)0x80070005 |
|
#define E_BOUNDS (HRESULT)0x8000000B |
|
#define E_FAIL (HRESULT)0x80004005 |
|
#define E_HANDLE (HRESULT)0x80070006 |
|
#define E_INVALIDARG (HRESULT)0x80070057 |
|
#define E_NOINTERFACE (HRESULT)0x80004002 |
|
#define E_NOTIMPL (HRESULT)0x80004001 |
|
#define E_NOT_VALID_STATE (HRESULT)0x8007139F |
|
#define E_OUTOFMEMORY (HRESULT)0x8007000E |
|
#define E_POINTER (HRESULT)0x80004003 |
|
#define E_UNEXPECTED (HRESULT)0x8000FFFF |
|
|
|
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) |
|
#define FAILED(hr) (((HRESULT)(hr)) < 0) |
|
#define DXC_FAILED(hr) (((HRESULT)(hr)) < 0) |
|
|
|
#define HRESULT_FROM_WIN32(x) \ |
|
(HRESULT)(x) <= 0 ? (HRESULT)(x) \ |
|
: (HRESULT)(((x) & 0x0000FFFF) | (7 << 16) | 0x80000000) |
|
|
|
|
|
|
|
|
|
|
|
|
|
#define _In_ |
|
#define _In_z_ |
|
#define _In_opt_ |
|
#define _In_opt_count_(size) |
|
#define _In_opt_z_ |
|
#define _In_count_(size) |
|
#define _In_bytecount_(size) |
|
|
|
#define _Out_ |
|
#define _Out_opt_ |
|
#define _Outptr_ |
|
#define _Outptr_opt_ |
|
#define _Outptr_result_z_ |
|
#define _Outptr_opt_result_z_ |
|
#define _Outptr_result_maybenull_ |
|
#define _Outptr_result_nullonfailure_ |
|
#define _Outptr_result_buffer_maybenull_(ptr) |
|
#define _Outptr_result_buffer_(ptr) |
|
|
|
#define _COM_Outptr_ |
|
#define _COM_Outptr_opt_ |
|
#define _COM_Outptr_result_maybenull_ |
|
#define _COM_Outptr_opt_result_maybenull_ |
|
|
|
#define THIS_ |
|
#define THIS |
|
#define PURE = 0 |
|
|
|
#define _Maybenull_ |
|
|
|
#define __debugbreak() |
|
|
|
|
|
#ifdef __GNUC__ |
|
#define __cdecl |
|
#define __CRTDECL |
|
#define __stdcall |
|
#define __vectorcall |
|
#define __thiscall |
|
#define __fastcall |
|
#define __clrcall |
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
typedef unsigned char BYTE, UINT8; |
|
typedef unsigned char *LPBYTE; |
|
|
|
typedef BYTE BOOLEAN; |
|
typedef BOOLEAN *PBOOLEAN; |
|
|
|
typedef bool BOOL; |
|
typedef BOOL *LPBOOL; |
|
|
|
typedef int INT; |
|
typedef long LONG; |
|
typedef unsigned int UINT; |
|
typedef unsigned long ULONG; |
|
typedef long long LONGLONG; |
|
typedef long long LONG_PTR; |
|
typedef unsigned long long ULONG_PTR; |
|
typedef unsigned long long ULONGLONG; |
|
|
|
typedef uint16_t WORD; |
|
typedef uint32_t DWORD; |
|
typedef DWORD *LPDWORD; |
|
|
|
typedef uint32_t UINT32; |
|
typedef uint64_t UINT64; |
|
|
|
typedef signed char INT8, *PINT8; |
|
typedef signed int INT32, *PINT32; |
|
|
|
typedef size_t SIZE_T; |
|
typedef const char *LPCSTR; |
|
typedef const char *PCSTR; |
|
|
|
typedef int errno_t; |
|
|
|
typedef wchar_t WCHAR; |
|
typedef wchar_t *LPWSTR; |
|
typedef wchar_t *PWCHAR; |
|
typedef const wchar_t *LPCWSTR; |
|
typedef const wchar_t *PCWSTR; |
|
|
|
typedef WCHAR OLECHAR; |
|
typedef OLECHAR *BSTR; |
|
typedef OLECHAR *LPOLESTR; |
|
typedef char *LPSTR; |
|
|
|
typedef void *LPVOID; |
|
typedef const void *LPCVOID; |
|
|
|
typedef std::nullptr_t nullptr_t; |
|
|
|
typedef signed int HRESULT; |
|
|
|
|
|
|
|
typedef void *HANDLE; |
|
typedef void *RPC_IF_HANDLE; |
|
|
|
#define DECLARE_HANDLE(name) \ |
|
struct name##__ { \ |
|
int unused; \ |
|
}; \ |
|
typedef struct name##__ *name |
|
DECLARE_HANDLE(HINSTANCE); |
|
|
|
typedef void *HMODULE; |
|
|
|
#define STD_INPUT_HANDLE ((DWORD)-10) |
|
#define STD_OUTPUT_HANDLE ((DWORD)-11) |
|
#define STD_ERROR_HANDLE ((DWORD)-12) |
|
|
|
|
|
|
|
#ifdef __EMULATE_UUID |
|
struct GUID |
|
#else // __EMULATE_UUID |
|
// These specific definitions are required by clang -fms-extensions. |
|
typedef struct _GUID |
|
#endif // __EMULATE_UUID |
|
{ |
|
uint32_t Data1; |
|
uint16_t Data2; |
|
uint16_t Data3; |
|
uint8_t Data4[8]; |
|
} |
|
#ifdef __EMULATE_UUID |
|
; |
|
#else |
|
GUID; |
|
#endif |
|
typedef GUID CLSID; |
|
typedef const GUID &REFGUID; |
|
typedef const GUID &REFCLSID; |
|
|
|
typedef GUID IID; |
|
typedef IID *LPIID; |
|
typedef const IID &REFIID; |
|
inline bool IsEqualGUID(REFGUID rguid1, REFGUID rguid2) { |
|
|
|
if (&rguid1 == &rguid2) |
|
return true; |
|
|
|
return !memcmp(&rguid1, &rguid2, sizeof(GUID)); |
|
} |
|
|
|
inline bool operator==(REFGUID guidOne, REFGUID guidOther) { |
|
return !!IsEqualGUID(guidOne, guidOther); |
|
} |
|
|
|
inline bool operator!=(REFGUID guidOne, REFGUID guidOther) { |
|
return !(guidOne == guidOther); |
|
} |
|
|
|
inline bool IsEqualIID(REFIID riid1, REFIID riid2) { |
|
return IsEqualGUID(riid1, riid2); |
|
} |
|
|
|
inline bool IsEqualCLSID(REFCLSID rclsid1, REFCLSID rclsid2) { |
|
return IsEqualGUID(rclsid1, rclsid2); |
|
} |
|
|
|
|
|
|
|
typedef struct _FILETIME { |
|
DWORD dwLowDateTime; |
|
DWORD dwHighDateTime; |
|
} FILETIME, *PFILETIME, *LPFILETIME; |
|
|
|
typedef struct _BY_HANDLE_FILE_INFORMATION { |
|
DWORD dwFileAttributes; |
|
FILETIME ftCreationTime; |
|
FILETIME ftLastAccessTime; |
|
FILETIME ftLastWriteTime; |
|
DWORD dwVolumeSerialNumber; |
|
DWORD nFileSizeHigh; |
|
DWORD nFileSizeLow; |
|
DWORD nNumberOfLinks; |
|
DWORD nFileIndexHigh; |
|
DWORD nFileIndexLow; |
|
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, |
|
*LPBY_HANDLE_FILE_INFORMATION; |
|
|
|
typedef struct _WIN32_FIND_DATAW { |
|
DWORD dwFileAttributes; |
|
FILETIME ftCreationTime; |
|
FILETIME ftLastAccessTime; |
|
FILETIME ftLastWriteTime; |
|
DWORD nFileSizeHigh; |
|
DWORD nFileSizeLow; |
|
DWORD dwReserved0; |
|
DWORD dwReserved1; |
|
WCHAR cFileName[260]; |
|
WCHAR cAlternateFileName[14]; |
|
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW; |
|
|
|
typedef union _LARGE_INTEGER { |
|
struct { |
|
DWORD LowPart; |
|
DWORD HighPart; |
|
} u; |
|
LONGLONG QuadPart; |
|
} LARGE_INTEGER; |
|
|
|
typedef LARGE_INTEGER *PLARGE_INTEGER; |
|
|
|
typedef union _ULARGE_INTEGER { |
|
struct { |
|
DWORD LowPart; |
|
DWORD HighPart; |
|
} u; |
|
ULONGLONG QuadPart; |
|
} ULARGE_INTEGER; |
|
|
|
typedef ULARGE_INTEGER *PULARGE_INTEGER; |
|
|
|
typedef struct tagSTATSTG { |
|
LPOLESTR pwcsName; |
|
DWORD type; |
|
ULARGE_INTEGER cbSize; |
|
FILETIME mtime; |
|
FILETIME ctime; |
|
FILETIME atime; |
|
DWORD grfMode; |
|
DWORD grfLocksSupported; |
|
CLSID clsid; |
|
DWORD grfStateBits; |
|
DWORD reserved; |
|
} STATSTG; |
|
|
|
enum tagSTATFLAG { |
|
STATFLAG_DEFAULT = 0, |
|
STATFLAG_NONAME = 1, |
|
STATFLAG_NOOPEN = 2 |
|
}; |
|
|
|
|
|
|
|
#ifdef __EMULATE_UUID |
|
|
|
|
|
|
|
constexpr uint8_t nybble_from_hex(char c) { |
|
return ((c >= '0' && c <= '9') |
|
? (c - '0') |
|
: ((c >= 'a' && c <= 'f') |
|
? (c - 'a' + 10) |
|
: ((c >= 'A' && c <= 'F') ? (c - 'A' + 10) |
|
: -1))); |
|
} |
|
|
|
constexpr uint8_t byte_from_hex(char c1, char c2) { |
|
return nybble_from_hex(c1) << 4 | nybble_from_hex(c2); |
|
} |
|
|
|
constexpr uint8_t byte_from_hexstr(const char str[2]) { |
|
return nybble_from_hex(str[0]) << 4 | nybble_from_hex(str[1]); |
|
} |
|
|
|
constexpr GUID guid_from_string(const char str[37]) { |
|
return GUID{static_cast<uint32_t>(byte_from_hexstr(str)) << 24 | |
|
static_cast<uint32_t>(byte_from_hexstr(str + 2)) << 16 | |
|
static_cast<uint32_t>(byte_from_hexstr(str + 4)) << 8 | |
|
byte_from_hexstr(str + 6), |
|
static_cast<uint16_t>( |
|
static_cast<uint16_t>(byte_from_hexstr(str + 9)) << 8 | |
|
byte_from_hexstr(str + 11)), |
|
static_cast<uint16_t>( |
|
static_cast<uint16_t>(byte_from_hexstr(str + 14)) << 8 | |
|
byte_from_hexstr(str + 16)), |
|
{byte_from_hexstr(str + 19), byte_from_hexstr(str + 21), |
|
byte_from_hexstr(str + 24), byte_from_hexstr(str + 26), |
|
byte_from_hexstr(str + 28), byte_from_hexstr(str + 30), |
|
byte_from_hexstr(str + 32), byte_from_hexstr(str + 34)}}; |
|
} |
|
|
|
template <typename interface> inline GUID __emulated_uuidof(); |
|
|
|
#define CROSS_PLATFORM_UUIDOF(interface, spec) \ |
|
struct interface; \ |
|
template <> inline GUID __emulated_uuidof<interface>() { \ |
|
static const IID _IID = guid_from_string(spec); \ |
|
return _IID; \ |
|
} |
|
|
|
#define __uuidof(T) __emulated_uuidof<typename std::decay<T>::type>() |
|
|
|
#define IID_PPV_ARGS(ppType) \ |
|
__uuidof(decltype(**(ppType))), reinterpret_cast<void **>(ppType) |
|
|
|
#else |
|
|
|
#ifndef CROSS_PLATFORM_UUIDOF |
|
|
|
#define CROSS_PLATFORM_UUIDOF(interface, spec) \ |
|
struct __declspec(uuid(spec)) interface; |
|
#endif |
|
|
|
template <typename T> inline void **IID_PPV_ARGS_Helper(T **pp) { |
|
return reinterpret_cast<void **>(pp); |
|
} |
|
#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType) |
|
|
|
#endif |
|
|
|
|
|
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ |
|
const GUID name = {l, w1, w2, {b1, b2, b3, b4, b5, b6, b7, b8}} |
|
#define DECLSPEC_UUID(x) |
|
#define MIDL_INTERFACE(x) struct DECLSPEC_UUID(x) |
|
#define DECLARE_INTERFACE(iface) struct iface |
|
#define DECLARE_INTERFACE_(iface, parent) DECLARE_INTERFACE(iface) : parent |
|
|
|
|
|
|
|
CROSS_PLATFORM_UUIDOF(IUnknown, "00000000-0000-0000-C000-000000000046") |
|
struct IUnknown { |
|
IUnknown(){}; |
|
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0; |
|
virtual ULONG AddRef() = 0; |
|
virtual ULONG Release() = 0; |
|
template <class Q> HRESULT QueryInterface(Q **pp) { |
|
return QueryInterface(__uuidof(Q), (void **)pp); |
|
} |
|
}; |
|
|
|
CROSS_PLATFORM_UUIDOF(INoMarshal, "ECC8691B-C1DB-4DC0-855E-65F6C551AF49") |
|
struct INoMarshal : public IUnknown {}; |
|
|
|
CROSS_PLATFORM_UUIDOF(IMalloc, "00000002-0000-0000-C000-000000000046") |
|
struct IMalloc : public IUnknown { |
|
virtual void *Alloc(SIZE_T size) = 0; |
|
virtual void *Realloc(void *ptr, SIZE_T size) = 0; |
|
virtual void Free(void *ptr) = 0; |
|
virtual SIZE_T GetSize(void *pv) = 0; |
|
virtual int DidAlloc(void *pv) = 0; |
|
virtual void HeapMinimize(void) = 0; |
|
}; |
|
|
|
CROSS_PLATFORM_UUIDOF(ISequentialStream, "0C733A30-2A1C-11CE-ADE5-00AA0044773D") |
|
struct ISequentialStream : public IUnknown { |
|
virtual HRESULT Read(void *pv, ULONG cb, ULONG *pcbRead) = 0; |
|
virtual HRESULT Write(const void *pv, ULONG cb, ULONG *pcbWritten) = 0; |
|
}; |
|
|
|
CROSS_PLATFORM_UUIDOF(IStream, "0000000c-0000-0000-C000-000000000046") |
|
struct IStream : public ISequentialStream { |
|
virtual HRESULT Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, |
|
ULARGE_INTEGER *plibNewPosition) = 0; |
|
virtual HRESULT SetSize(ULARGE_INTEGER libNewSize) = 0; |
|
virtual HRESULT CopyTo(IStream *pstm, ULARGE_INTEGER cb, |
|
ULARGE_INTEGER *pcbRead, |
|
ULARGE_INTEGER *pcbWritten) = 0; |
|
|
|
virtual HRESULT Commit(DWORD grfCommitFlags) = 0; |
|
|
|
virtual HRESULT Revert(void) = 0; |
|
|
|
virtual HRESULT LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, |
|
DWORD dwLockType) = 0; |
|
|
|
virtual HRESULT UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, |
|
DWORD dwLockType) = 0; |
|
|
|
virtual HRESULT Stat(STATSTG *pstatstg, DWORD grfStatFlag) = 0; |
|
|
|
virtual HRESULT Clone(IStream **ppstm) = 0; |
|
}; |
|
|
|
|
|
|
|
CROSS_PLATFORM_UUIDOF(ID3D12LibraryReflection, |
|
"8E349D19-54DB-4A56-9DC9-119D87BDB804") |
|
CROSS_PLATFORM_UUIDOF(ID3D12ShaderReflection, |
|
"5A58797D-A72C-478D-8BA2-EFC6B0EFE88E") |
|
|
|
|
|
|
|
class CAllocator { |
|
public: |
|
static void *Reallocate(void *p, size_t nBytes) throw(); |
|
static void *Allocate(size_t nBytes) throw(); |
|
static void Free(void *p) throw(); |
|
}; |
|
|
|
template <class T> class CComPtrBase { |
|
protected: |
|
CComPtrBase() throw() { p = nullptr; } |
|
CComPtrBase(T *lp) throw() { |
|
p = lp; |
|
if (p != nullptr) |
|
p->AddRef(); |
|
} |
|
void Swap(CComPtrBase &other) { |
|
T *pTemp = p; |
|
p = other.p; |
|
other.p = pTemp; |
|
} |
|
|
|
public: |
|
~CComPtrBase() throw() { |
|
if (p) { |
|
p->Release(); |
|
p = nullptr; |
|
} |
|
} |
|
operator T *() const throw() { return p; } |
|
T &operator*() const { return *p; } |
|
T *operator->() const { return p; } |
|
T **operator&() throw() { |
|
assert(p == nullptr); |
|
return &p; |
|
} |
|
bool operator!() const throw() { return (p == nullptr); } |
|
bool operator<(T *pT) const throw() { return p < pT; } |
|
bool operator!=(T *pT) const { return !operator==(pT); } |
|
bool operator==(T *pT) const throw() { return p == pT; } |
|
|
|
|
|
void Release() throw() { |
|
T *pTemp = p; |
|
if (pTemp) { |
|
p = nullptr; |
|
pTemp->Release(); |
|
} |
|
} |
|
|
|
|
|
void Attach(T *p2) throw() { |
|
if (p) { |
|
ULONG ref = p->Release(); |
|
(void)(ref); |
|
|
|
|
|
|
|
assert(ref != 0 || p2 != p); |
|
} |
|
p = p2; |
|
} |
|
|
|
|
|
T *Detach() throw() { |
|
T *pt = p; |
|
p = nullptr; |
|
return pt; |
|
} |
|
|
|
HRESULT CopyTo(T **ppT) throw() { |
|
assert(ppT != nullptr); |
|
if (ppT == nullptr) |
|
return E_POINTER; |
|
*ppT = p; |
|
if (p) |
|
p->AddRef(); |
|
return S_OK; |
|
} |
|
|
|
template <class Q> HRESULT QueryInterface(Q **pp) const throw() { |
|
assert(pp != nullptr); |
|
return p->QueryInterface(__uuidof(Q), (void **)pp); |
|
} |
|
|
|
T *p; |
|
}; |
|
|
|
template <class T> class CComPtr : public CComPtrBase<T> { |
|
public: |
|
CComPtr() throw() {} |
|
CComPtr(T *lp) throw() : CComPtrBase<T>(lp) {} |
|
CComPtr(const CComPtr<T> &lp) throw() : CComPtrBase<T>(lp.p) {} |
|
T *operator=(T *lp) throw() { |
|
if (*this != lp) { |
|
CComPtr(lp).Swap(*this); |
|
} |
|
return *this; |
|
} |
|
|
|
inline bool IsEqualObject(IUnknown *pOther) throw() { |
|
if (this->p == nullptr && pOther == nullptr) |
|
return true; |
|
|
|
if (this->p == nullptr || pOther == nullptr) |
|
return false; |
|
|
|
CComPtr<IUnknown> punk1; |
|
CComPtr<IUnknown> punk2; |
|
this->p->QueryInterface(__uuidof(IUnknown), (void **)&punk1); |
|
pOther->QueryInterface(__uuidof(IUnknown), (void **)&punk2); |
|
return punk1 == punk2; |
|
} |
|
|
|
void ComPtrAssign(IUnknown **pp, IUnknown *lp, REFIID riid) { |
|
IUnknown *pTemp = *pp; |
|
if (lp == nullptr || FAILED(lp->QueryInterface(riid, (void **)pp))) |
|
*pp = nullptr; |
|
if (pTemp) |
|
pTemp->Release(); |
|
} |
|
|
|
template <typename Q> T *operator=(const CComPtr<Q> &lp) throw() { |
|
if (!this->IsEqualObject(lp)) { |
|
ComPtrAssign((IUnknown **)&this->p, lp, __uuidof(T)); |
|
} |
|
return *this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename Q> |
|
CComPtr(const CComPtr<Q> &lp) throw() : CComPtrBase<T>(lp.p) {} |
|
|
|
T *operator=(const CComPtr<T> &lp) throw() { |
|
if (*this != lp) { |
|
CComPtr(lp).Swap(*this); |
|
} |
|
return *this; |
|
} |
|
|
|
CComPtr(CComPtr<T> &&lp) throw() : CComPtrBase<T>() { lp.Swap(*this); } |
|
|
|
T *operator=(CComPtr<T> &&lp) throw() { |
|
if (*this != lp) { |
|
CComPtr(static_cast<CComPtr &&>(lp)).Swap(*this); |
|
} |
|
return *this; |
|
} |
|
}; |
|
|
|
template <class T> class CSimpleArray : public std::vector<T> { |
|
public: |
|
bool Add(const T &t) { |
|
this->push_back(t); |
|
return true; |
|
} |
|
int GetSize() { return this->size(); } |
|
T *GetData() { return this->data(); } |
|
void RemoveAll() { this->clear(); } |
|
}; |
|
|
|
template <class T, class Allocator = CAllocator> class CHeapPtrBase { |
|
protected: |
|
CHeapPtrBase() throw() : m_pData(NULL) {} |
|
CHeapPtrBase(CHeapPtrBase<T, Allocator> &p) throw() { |
|
m_pData = p.Detach(); |
|
} |
|
explicit CHeapPtrBase(T *pData) throw() : m_pData(pData) {} |
|
|
|
public: |
|
~CHeapPtrBase() throw() { Free(); } |
|
|
|
protected: |
|
CHeapPtrBase<T, Allocator> &operator=(CHeapPtrBase<T, Allocator> &p) throw() { |
|
if (m_pData != p.m_pData) |
|
Attach(p.Detach()); |
|
return *this; |
|
} |
|
|
|
public: |
|
operator T *() const throw() { return m_pData; } |
|
T *operator->() const throw() { |
|
assert(m_pData != NULL); |
|
return m_pData; |
|
} |
|
|
|
T **operator&() throw() { |
|
assert(m_pData == NULL); |
|
return &m_pData; |
|
} |
|
|
|
|
|
bool AllocateBytes(size_t nBytes) throw() { |
|
assert(m_pData == NULL); |
|
m_pData = static_cast<T *>(Allocator::Allocate(nBytes * sizeof(char))); |
|
if (m_pData == NULL) |
|
return false; |
|
|
|
return true; |
|
} |
|
|
|
|
|
void Attach(T *pData) throw() { |
|
Allocator::Free(m_pData); |
|
m_pData = pData; |
|
} |
|
|
|
|
|
T *Detach() throw() { |
|
T *pTemp = m_pData; |
|
m_pData = NULL; |
|
return pTemp; |
|
} |
|
|
|
|
|
void Free() throw() { |
|
Allocator::Free(m_pData); |
|
m_pData = NULL; |
|
} |
|
|
|
|
|
bool ReallocateBytes(size_t nBytes) throw() { |
|
T *pNew; |
|
pNew = |
|
static_cast<T *>(Allocator::Reallocate(m_pData, nBytes * sizeof(char))); |
|
if (pNew == NULL) |
|
return false; |
|
m_pData = pNew; |
|
|
|
return true; |
|
} |
|
|
|
public: |
|
T *m_pData; |
|
}; |
|
|
|
template <typename T, class Allocator = CAllocator> |
|
class CHeapPtr : public CHeapPtrBase<T, Allocator> { |
|
public: |
|
CHeapPtr() throw() {} |
|
CHeapPtr(CHeapPtr<T, Allocator> &p) throw() : CHeapPtrBase<T, Allocator>(p) {} |
|
explicit CHeapPtr(T *p) throw() : CHeapPtrBase<T, Allocator>(p) {} |
|
CHeapPtr<T> &operator=(CHeapPtr<T, Allocator> &p) throw() { |
|
CHeapPtrBase<T, Allocator>::operator=(p); |
|
return *this; |
|
} |
|
|
|
|
|
bool Allocate(size_t nElements = 1) throw() { |
|
size_t nBytes = nElements * sizeof(T); |
|
return this->AllocateBytes(nBytes); |
|
} |
|
|
|
|
|
bool Reallocate(size_t nElements) throw() { |
|
size_t nBytes = nElements * sizeof(T); |
|
return this->ReallocateBytes(nBytes); |
|
} |
|
}; |
|
|
|
#define CComHeapPtr CHeapPtr |
|
|
|
|
|
|
|
void SysFreeString(BSTR bstrString); |
|
|
|
BSTR SysAllocStringLen(const OLECHAR *strIn, UINT ui); |
|
|
|
|
|
unsigned int SysStringLen(const BSTR bstrString); |
|
|
|
|
|
|
|
|
|
#define CP_ACP 0 |
|
#define CP_UTF8 65001 |
|
|
|
|
|
|
|
class ScopedLocale { |
|
const char *m_prevLocale; |
|
|
|
public: |
|
explicit ScopedLocale(uint32_t codePage) |
|
: m_prevLocale(setlocale(LC_ALL, nullptr)) { |
|
assert((codePage == CP_UTF8) && |
|
"Support for Linux only handles UTF8 code pages"); |
|
setlocale(LC_ALL, "en_US.UTF-8"); |
|
} |
|
~ScopedLocale() { |
|
if (m_prevLocale != nullptr) { |
|
setlocale(LC_ALL, m_prevLocale); |
|
} |
|
} |
|
}; |
|
|
|
|
|
|
|
template <int t_nBufferLength = 128> class CW2AEX { |
|
public: |
|
CW2AEX(LPCWSTR psz) { |
|
ScopedLocale locale(CP_UTF8); |
|
|
|
if (!psz) { |
|
m_psz = NULL; |
|
return; |
|
} |
|
|
|
int len = (wcslen(psz) + 1) * 4; |
|
m_psz = new char[len]; |
|
std::wcstombs(m_psz, psz, len); |
|
} |
|
|
|
~CW2AEX() { delete[] m_psz; } |
|
|
|
operator LPSTR() const { return m_psz; } |
|
|
|
char *m_psz; |
|
}; |
|
typedef CW2AEX<> CW2A; |
|
|
|
|
|
|
|
template <int t_nBufferLength = 128> class CA2WEX { |
|
public: |
|
CA2WEX(LPCSTR psz) { |
|
ScopedLocale locale(CP_UTF8); |
|
|
|
if (!psz) { |
|
m_psz = NULL; |
|
return; |
|
} |
|
|
|
int len = strlen(psz) + 1; |
|
m_psz = new wchar_t[len]; |
|
std::mbstowcs(m_psz, psz, len); |
|
} |
|
|
|
~CA2WEX() { delete[] m_psz; } |
|
|
|
operator LPWSTR() const { return m_psz; } |
|
|
|
wchar_t *m_psz; |
|
}; |
|
|
|
typedef CA2WEX<> CA2W; |
|
|
|
|
|
|
|
class CHandle { |
|
public: |
|
CHandle(HANDLE h); |
|
~CHandle(); |
|
operator HANDLE() const throw(); |
|
|
|
private: |
|
HANDLE m_h; |
|
}; |
|
|
|
|
|
|
|
|
|
class CComBSTR { |
|
public: |
|
BSTR m_str; |
|
CComBSTR() : m_str(nullptr){}; |
|
CComBSTR(int nSize, LPCWSTR sz); |
|
~CComBSTR() throw() { SysFreeString(m_str); } |
|
unsigned int Length() const throw() { return SysStringLen(m_str); } |
|
operator BSTR() const throw() { return m_str; } |
|
|
|
bool operator==(const CComBSTR &bstrSrc) const throw(); |
|
|
|
BSTR *operator&() throw() { return &m_str; } |
|
|
|
BSTR Detach() throw() { |
|
BSTR s = m_str; |
|
m_str = NULL; |
|
return s; |
|
} |
|
|
|
void Empty() throw() { |
|
SysFreeString(m_str); |
|
m_str = NULL; |
|
} |
|
}; |
|
|
|
|
|
class WArgV { |
|
std::vector<std::wstring> WStringVector; |
|
std::vector<const wchar_t *> WCharPtrVector; |
|
|
|
public: |
|
WArgV(int argc, const char **argv); |
|
const wchar_t **argv() { return WCharPtrVector.data(); } |
|
}; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif |
|
|