瀏覽代碼

Convert DoBasicQueryInterface* functions to single variadic template (#304)

Tex Riddell 8 年之前
父節點
當前提交
b4fa7bc4cc

+ 11 - 106
include/dxc/Support/microcom.h

@@ -88,16 +88,15 @@ public:
 
 
 /// <summary>
 /// <summary>
 /// Provides a QueryInterface implementation for a class that supports
 /// Provides a QueryInterface implementation for a class that supports
-/// a single interface in addition to IUnknown.
+/// any number of interfaces in addition to IUnknown.
 /// </summary>
 /// </summary>
 /// <remarks>
 /// <remarks>
 /// This implementation will also report the instance as not supporting
 /// This implementation will also report the instance as not supporting
 /// marshaling. This will help catch marshaling problems early or avoid
 /// marshaling. This will help catch marshaling problems early or avoid
 /// them altogether.
 /// them altogether.
 /// </remarks>
 /// </remarks>
-template <typename TInterface, typename TObject>
-HRESULT DoBasicQueryInterface(TObject* self, REFIID iid, void** ppvObject)
-{
+template<typename... Ts, typename TObject>
+HRESULT DoBasicQueryInterface(TObject* self, REFIID iid, void** ppvObject) {
   if (ppvObject == nullptr) return E_POINTER;
   if (ppvObject == nullptr) return E_POINTER;
 
 
   // Support INoMarshal to void GIT shenanigans.
   // Support INoMarshal to void GIT shenanigans.
@@ -108,116 +107,22 @@ HRESULT DoBasicQueryInterface(TObject* self, REFIID iid, void** ppvObject)
     return S_OK;
     return S_OK;
   }
   }
 
 
-  if (IsEqualIID(iid, __uuidof(TInterface))) {
-    *(TInterface**)ppvObject = self;
-    self->AddRef();
-    return S_OK;
-  }
-
-  return E_NOINTERFACE;
+  return DoBasicQueryInterface_recurse<TObject, Ts...>(self, iid, ppvObject);
 }
 }
 
 
-/// <summary>
-/// Provides a QueryInterface implementation for a class that supports
-/// two interfaces in addition to IUnknown.
-/// </summary>
-/// <remarks>
-/// This implementation will also report the instance as not supporting
-/// marshaling. This will help catch marshaling problems early or avoid
-/// them altogether.
-/// </remarks>
-template <typename TInterface, typename TInterface2, typename TObject>
-HRESULT DoBasicQueryInterface2(TObject* self, REFIID iid, void** ppvObject)
-{
-  if (ppvObject == nullptr) return E_POINTER;
-
-  // Support INoMarshal to void GIT shenanigans.
-  if (IsEqualIID(iid, __uuidof(IUnknown)) ||
-      IsEqualIID(iid, __uuidof(INoMarshal))) {
-    *ppvObject = reinterpret_cast<IUnknown*>(self);
-    reinterpret_cast<IUnknown*>(self)->AddRef();
-    return S_OK;
-  }
-
-  if (IsEqualIID(__uuidof(TInterface), iid)) {
-    *(TInterface**)ppvObject = self;
-    self->AddRef();
-    return S_OK;
-  }
-
-  if (IsEqualIID(__uuidof(TInterface2), iid)) {
-    *(TInterface2**)ppvObject = self;
-    self->AddRef();
-    return S_OK;
-  }
-
+template<typename TObject>
+HRESULT DoBasicQueryInterface_recurse(TObject* self, REFIID iid, void** ppvObject) {
   return E_NOINTERFACE;
   return E_NOINTERFACE;
 }
 }
-
-/// <summary>
-/// Provides a QueryInterface implementation for a class that supports
-/// three interfaces in addition to IUnknown.
-/// </summary>
-/// <remarks>
-/// This implementation will also report the instance as not supporting
-/// marshaling. This will help catch marshaling problems early or avoid
-/// them altogether.
-/// </remarks>
-template <typename TInterface, typename TInterface2, typename TInterface3, typename TObject>
-HRESULT DoBasicQueryInterface3(TObject* self, REFIID iid, void** ppvObject)
-{
-  if (ppvObject == nullptr) return E_POINTER;
-  if (IsEqualIID(iid, __uuidof(TInterface3))) {
-    *(TInterface3**)ppvObject = self;
-    self->AddRef();
-    return S_OK;
-  }
-
-  return DoBasicQueryInterface2<TInterface, TInterface2, TObject>(self, iid, ppvObject);
-}
-
-/// <summary>
-/// Provides a QueryInterface implementation for a class that supports
-/// four interfaces in addition to IUnknown.
-/// </summary>
-/// <remarks>
-/// This implementation will also report the instance as not supporting
-/// marshaling. This will help catch marshaling problems early or avoid
-/// them altogether.
-/// </remarks>
-template <typename TInterface, typename TInterface2, typename TInterface3, typename TInterface4, typename TObject>
-HRESULT DoBasicQueryInterface4(TObject* self, REFIID iid, void** ppvObject)
-{
+template<typename TObject, typename TInterface, typename... Ts>
+HRESULT DoBasicQueryInterface_recurse(TObject* self, REFIID iid, void** ppvObject) {
   if (ppvObject == nullptr) return E_POINTER;
   if (ppvObject == nullptr) return E_POINTER;
-  if (IsEqualIID(iid, __uuidof(TInterface4))) {
-    *(TInterface4**)ppvObject = self;
-    self->AddRef();
-    return S_OK;
-  }
-
-  return DoBasicQueryInterface3<TInterface, TInterface2, TInterface3, TObject>(self, iid, ppvObject);
-}
-
-/// <summary>
-/// Provides a QueryInterface implementation for a class that supports
-/// five interfaces in addition to IUnknown.
-/// </summary>
-/// <remarks>
-/// This implementation will also report the instance as not supporting
-/// marshaling. This will help catch marshaling problems early or avoid
-/// them altogether.
-/// </remarks>
-template <typename TInterface, typename TInterface2, typename TInterface3, typename TInterface4, typename TInterface5, typename TObject>
-HRESULT DoBasicQueryInterface5(TObject* self, REFIID iid, void** ppvObject)
-{
-  if (ppvObject == nullptr) return E_POINTER;
-  if (IsEqualIID(iid, __uuidof(TInterface5))) {
-    *(TInterface5**)ppvObject = self;
+  if (IsEqualIID(iid, __uuidof(TInterface))) {
+    *(TInterface**)ppvObject = self;
     self->AddRef();
     self->AddRef();
     return S_OK;
     return S_OK;
   }
   }
-
-  return DoBasicQueryInterface4<TInterface, TInterface2, TInterface3, TInterface4, TObject>(self, iid, ppvObject);
+  return DoBasicQueryInterface_recurse<TObject, Ts...>(self, iid, ppvObject);
 }
 }
 
 
 template <typename T>
 template <typename T>

+ 3 - 3
lib/DxcSupport/FileIOHelper.cpp

@@ -116,7 +116,7 @@ public:
   InternalDxcBlobEncoding() : m_dwRef(0) {
   InternalDxcBlobEncoding() : m_dwRef(0) {
   }
   }
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface2<IDxcBlob, IDxcBlobEncoding>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDxcBlob, IDxcBlobEncoding>(this, iid, ppvObject);
   }
   }
 
 
   ~InternalDxcBlobEncoding() {
   ~InternalDxcBlobEncoding() {
@@ -669,7 +669,7 @@ public:
   DXC_MICROCOM_ADDREF_RELEASE_IMPL(m_dwRef)
   DXC_MICROCOM_ADDREF_RELEASE_IMPL(m_dwRef)
 
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface3<IStream, ISequentialStream, IDxcBlob>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IStream, ISequentialStream, IDxcBlob>(this, iid, ppvObject);
   }
   }
 
 
   MemoryStream(_In_ IMalloc *pMalloc)
   MemoryStream(_In_ IMalloc *pMalloc)
@@ -875,7 +875,7 @@ public:
   DXC_MICROCOM_ADDREF_RELEASE_IMPL(m_dwRef)
   DXC_MICROCOM_ADDREF_RELEASE_IMPL(m_dwRef)
 
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface2<IStream, ISequentialStream>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IStream, ISequentialStream>(this, iid, ppvObject);
   }
   }
 
 
   ReadOnlyBlobStream(IDxcBlob *pSource) : m_pSource(pSource), m_offset(0), m_dwRef(0) {
   ReadOnlyBlobStream(IDxcBlob *pSource) : m_pSource(pSource), m_offset(0), m_dwRef(0) {

+ 1 - 1
tools/clang/tools/dxcompiler/dxcdia.cpp

@@ -591,7 +591,7 @@ protected:
 public:
 public:
   DXC_MICROCOM_ADDREF_RELEASE_IMPL(m_dwRef)
   DXC_MICROCOM_ADDREF_RELEASE_IMPL(m_dwRef)
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface3<IDiaTable, T, IEnumUnknown>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDiaTable, T, IEnumUnknown>(this, iid, ppvObject);
   }
   }
 
 
   DxcDiaTableBase(DxcDiaSession *pSession, DiaTableKind kind)
   DxcDiaTableBase(DxcDiaSession *pSession, DiaTableKind kind)

+ 6 - 1
tools/clang/tools/dxcompiler/dxcompilerobj.cpp

@@ -2144,7 +2144,12 @@ public:
   }
   }
 
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface5<IDxcCompiler, IDxcCompiler2, IDxcLangExtensions, IDxcContainerEvent, IDxcVersionInfo>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDxcCompiler,
+                                 IDxcCompiler2,
+                                 IDxcLangExtensions,
+                                 IDxcContainerEvent,
+                                 IDxcVersionInfo>
+                                 (this, iid, ppvObject);
   }
   }
 
 
   // Compile a single entry point to the target shader model
   // Compile a single entry point to the target shader model

+ 1 - 1
tools/clang/tools/dxcompiler/dxcvalidator.cpp

@@ -98,7 +98,7 @@ public:
   DxcValidator() : m_dwRef(0) {}
   DxcValidator() : m_dwRef(0) {}
 
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface2<IDxcValidator, IDxcVersionInfo>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDxcValidator, IDxcVersionInfo>(this, iid, ppvObject);
   }
   }
 
 
   // For internal use only.
   // For internal use only.

+ 1 - 1
tools/clang/tools/dxr/dxr.cpp

@@ -85,7 +85,7 @@ public:
   FileMapDxcBlobEncoding() : m_dwRef(0), m_MappedView(nullptr) {
   FileMapDxcBlobEncoding() : m_dwRef(0), m_MappedView(nullptr) {
   }
   }
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface2<IDxcBlob, IDxcBlobEncoding>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDxcBlob, IDxcBlobEncoding>(this, iid, ppvObject);
   }
   }
 
 
   ~FileMapDxcBlobEncoding() {
   ~FileMapDxcBlobEncoding() {

+ 1 - 1
tools/clang/tools/libclang/dxcisenseimpl.h

@@ -197,7 +197,7 @@ public:
   DXC_LANGEXTENSIONS_HELPER_IMPL(m_langHelper);
   DXC_LANGEXTENSIONS_HELPER_IMPL(m_langHelper);
 
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface2<IDxcIntelliSense, IDxcLangExtensions>(
+    return DoBasicQueryInterface<IDxcIntelliSense, IDxcLangExtensions>(
         this, iid, ppvObject);
         this, iid, ppvObject);
   }
   }
 
 

+ 1 - 1
tools/clang/tools/libclang/dxcrewriteunused.cpp

@@ -401,7 +401,7 @@ public:
   DXC_LANGEXTENSIONS_HELPER_IMPL(m_langExtensionsHelper)
   DXC_LANGEXTENSIONS_HELPER_IMPL(m_langExtensionsHelper)
 
 
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
-    return DoBasicQueryInterface2<IDxcRewriter, IDxcLangExtensions>(this, iid, ppvObject);
+    return DoBasicQueryInterface<IDxcRewriter, IDxcLangExtensions>(this, iid, ppvObject);
   }
   }
 
 
   __override HRESULT STDMETHODCALLTYPE RemoveUnusedGlobals(_In_ IDxcBlobEncoding *pSource,
   __override HRESULT STDMETHODCALLTYPE RemoveUnusedGlobals(_In_ IDxcBlobEncoding *pSource,