yum-archive/TaSTT-Whisper
High-performance GPGPU inference of OpenAI's Whisper automatic speech recognition (ASR) model
git clone https://git.yummers.dev/yum-archive/TaSTT-Whisper
8c4603c
master
1#pragma once 2#include <type_traits> 3#include "../comLightClient.h" 4#include "../utils/typeTraits.hpp" 5#include "../Exception.hpp" 6 7namespace ComLight 8{ 9namespace details 10 { 11GENERATE_HAS_MEMBER (implQueryInterface ); 12GENERATE_HAS_MEMBER (implAddRef ); 13GENERATE_HAS_MEMBER (implRelease ); 14 } 15 16// Outer class of objects, implements IUnknown methods, also the class factory. The type argument must be your class implementing your interfaces, inherited from ObjectRoot<I> 17template < class T > 18class Object :public T 19 { 20public : 21Object ()= default ; 22 23template < typename ...Args > 24Object (Args && ...args ) :T { std::forward < Args > (args )... } {}; 25 26inline virtual ~Object ()override { } 27 28// Implement IUnknown methods 29HRESULT COMLIGHTCALL QueryInterface (REFIID riid ,void ** ppvObject )override 30 { 31 static_assert( details::has_member_implQueryInterface < T > ::value ,"Your object class must inherit from ComLight::ObjectRoot" ); 32 33if (nullptr == ppvObject ) 34return E_POINTER ; 35 36if (T ::implQueryInterface (riid ,ppvObject ) ) 37return S_OK ; 38if (T ::queryExtraInterfaces (riid ,ppvObject ) ) 39return S_OK ; 40 41if (riid == IUnknown ::iid () ) 42 { 43ComLight ::IUnknown * unk = T ::getUnknown (); 44unk -> AddRef (); 45* ppvObject = unk ; 46return S_OK ; 47 } 48 49return E_NOINTERFACE ; 50 } 51 52uint32_t COMLIGHTCALL AddRef ()override 53 { 54 static_assert( details::has_member_implAddRef < T > ::value ,"Your object class must inherit from ComLight::ObjectRoot" ); 55return T ::implAddRef (); 56 } 57 58uint32_t COMLIGHTCALL Release ()override 59 { 60 static_assert( details::has_member_implRelease < T > ::value ,"Your object class must inherit from ComLight::ObjectRoot" ); 61const uint32_t ret = T ::implRelease (); 62if (0 == ret ) 63 { 64T ::FinalRelease (); 65delete this ; 66 } 67return ret ; 68 } 69 70// Create a new object on the heap, store in smart pointer 71static inline HRESULT create (CComPtr < Object < T >>& result ) 72 { 73CComPtr < Object < T >> ptr ; 74try 75 { 76ptr = new Object < T > ();// The RefCounter constructor creates it with ref.counter 0. But then CComPtr constructor calls AddRef so we have RC=1 after this line. 77 78HRESULT hr = ptr -> internalFinalConstruct (); 79if (FAILED (hr ) ) 80return hr ; 81 82hr = ptr -> FinalConstruct (); 83if (FAILED (hr ) ) 84return hr ; 85 86ptr .swap (result ); 87return S_OK ; 88 } 89catch (const Exception & ex ) 90 { 91return ex .code (); 92 } 93 } 94 95// Create a new object on the heap, store in smart pointer 96template < typename ...Args > 97static inline HRESULT create (CComPtr < Object < T >>& result ,Args && ...args ) 98 { 99CComPtr < Object < T >> ptr ; 100try 101 { 102ptr = new Object < T > ( std::forward < Args > (args )... ); 103 104HRESULT hr = ptr -> internalFinalConstruct (); 105if (FAILED (hr ) ) 106return hr ; 107 108hr = ptr -> FinalConstruct (); 109if (FAILED (hr ) ) 110return hr ; 111 112ptr .swap (result ); 113return S_OK ; 114 } 115catch (const Exception & ex ) 116 { 117return ex .code (); 118 } 119catch (HRESULT hr ) 120 { 121return hr ; 122 } 123 } 124 125// Create a new object on the heap, return one of it's interfaces. The caller is assumed to take ownership of the new object. 126template < class I > 127static inline HRESULT create (I ** pp ) 128 { 129if (pp == nullptr ) 130return E_POINTER ; 131 132 static_assert( details::pointersAssignable < I ,T > (),"Object::create can't cast object to the requested interface" ); 133CComPtr < Object < T >> ptr ; 134CHECK (create (ptr ) ); 135ptr .detach (pp ); 136return S_OK ; 137 } 138 }; 139}