//===- WinIncludes.h --------------------------------------------*- C++ -*-===// /////////////////////////////////////////////////////////////////////////////// // // // WinIncludes.h // // Copyright (C) Microsoft Corporation. All rights reserved. // // This file is distributed under the University of Illinois Open Source // // License. See LICENSE.TXT for details. // // // /////////////////////////////////////////////////////////////////////////////// #pragma once #ifdef _MSC_VER #define NOATOM 1 #define NOGDICAPMASKS 1 #define NOMETAFILE 1 #define NOMINMAX 1 #define NOOPENFILE 1 #define NORASTEROPS 1 #define NOSCROLL 1 #define NOSOUND 1 #define NOSYSMETRICS 1 #define NOWH 1 #define NOCOMM 1 #define NOKANJI 1 #define NOCRYPT 1 #define NOMCX 1 #define WIN32_LEAN_AND_MEAN 1 #define VC_EXTRALEAN 1 #define NONAMELESSSTRUCT 1 #include #include #include // atlbase.h needs to come before strsafe.h #include #include #include // Support older atlbase.h if needed #ifndef _ATL_DECLSPEC_ALLOCATOR #define _ATL_DECLSPEC_ALLOCATOR #endif /// Swap two ComPtr classes. template void swap(CComHeapPtr &a, CComHeapPtr &b) { T *c(a.m_pData); a.m_pData = b.m_pData; b.m_pData = c; } #else // _MSC_VER #include "dxc/Support/WinAdapter.h" #ifdef __cplusplus // Define operator overloads to enable bit operations on enum values that are // used to define flags. Use DEFINE_ENUM_FLAG_OPERATORS(YOUR_TYPE) to enable these // operators on YOUR_TYPE. extern "C++" { template struct _ENUM_FLAG_INTEGER_FOR_SIZE; template <> struct _ENUM_FLAG_INTEGER_FOR_SIZE<1> { typedef int8_t type; }; template <> struct _ENUM_FLAG_INTEGER_FOR_SIZE<2> { typedef int16_t type; }; template <> struct _ENUM_FLAG_INTEGER_FOR_SIZE<4> { typedef int32_t type; }; // used as an approximation of std::underlying_type template struct _ENUM_FLAG_SIZED_INTEGER { typedef typename _ENUM_FLAG_INTEGER_FOR_SIZE::type type; }; } #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \ extern "C++" { \ inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER::type)a) | ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER::type &)a) |= ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER::type)a) & ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER::type &)a) &= ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((_ENUM_FLAG_SIZED_INTEGER::type)a)); } \ inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER::type)a) ^ ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER::type &)a) ^= ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ } #else #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) // NOP, C allows these operators. #endif #endif // _MSC_VER