Format wxWebViewEdge Callback code

This commit is contained in:
Maarten Bent
2021-01-27 22:41:40 +01:00
committed by Vadim Zeitlin
parent ad1219d0a2
commit a8b726359b

View File

@@ -36,7 +36,7 @@ public:
CInvokable() : m_nRefCount(0) {} CInvokable() : m_nRefCount(0) {}
virtual ~CInvokable() {} virtual ~CInvokable() {}
// IUnknown methods // IUnknown methods
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID WXUNUSED(riid), void **ppvObj) override HRESULT STDMETHODCALLTYPE QueryInterface(REFIID WXUNUSED(riid), void** ppvObj) override
{ {
/** /**
* WebView2 Runtime apparently doesn't use this method, so it doesn't * WebView2 Runtime apparently doesn't use this method, so it doesn't
@@ -47,10 +47,12 @@ public:
*ppvObj = NULL; *ppvObj = NULL;
return E_NOINTERFACE; return E_NOINTERFACE;
} }
ULONG STDMETHODCALLTYPE AddRef(void) override { ULONG STDMETHODCALLTYPE AddRef() override
{
return ++m_nRefCount; return ++m_nRefCount;
} }
ULONG STDMETHODCALLTYPE Release(void) override { ULONG STDMETHODCALLTYPE Release() override
{
size_t ret = --m_nRefCount; size_t ret = --m_nRefCount;
if (ret == 0) if (ret == 0)
delete this; delete this;
@@ -59,51 +61,58 @@ public:
private: private:
std::atomic<size_t> m_nRefCount; std::atomic<size_t> m_nRefCount;
}; };
template <typename baseT, typename ...argTs> template <typename baseT, typename ...argTs>
class CInvokableLambda : public CInvokable<baseT, argTs...> class CInvokableLambda : public CInvokable<baseT, argTs...>
{ {
public: public:
CInvokableLambda(std::function<HRESULT(argTs...)> lambda) CInvokableLambda(std::function<HRESULT(argTs...)> lambda)
: m_lambda(lambda) { : m_lambda(lambda)
} {}
// baseT method // baseT method
HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override { HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override
{
return m_lambda(args...); return m_lambda(args...);
} }
private: private:
std::function<HRESULT(argTs...)> m_lambda; std::function<HRESULT(argTs...)> m_lambda;
}; };
template <typename baseT, typename contextT, typename ...argTs> template <typename baseT, typename contextT, typename ...argTs>
class CInvokableMethod : public CInvokable<baseT, argTs...> class CInvokableMethod : public CInvokable<baseT, argTs...>
{ {
public: public:
CInvokableMethod(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) CInvokableMethod(contextT* ctx, HRESULT(contextT::* mthd)(argTs...))
: m_ctx(ctx), m_mthd(mthd) { : m_ctx(ctx), m_mthd(mthd)
} {}
// baseT method // baseT method
HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override { HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override
{
return (m_ctx->*m_mthd)(args...); return (m_ctx->*m_mthd)(args...);
} }
private: private:
contextT *m_ctx; contextT* m_ctx;
HRESULT (contextT::*m_mthd)(argTs...); HRESULT(contextT::* m_mthd)(argTs...);
}; };
// the function templates to generate concrete classes from above class templates // the function templates to generate concrete classes from above class templates
template < template <
typename baseT, typename lambdaT, // base type & lambda type typename baseT, typename lambdaT, // base type & lambda type
typename LT, typename ...argTs // for capturing argument types of lambda typename LT, typename ...argTs // for capturing argument types of lambda
> >
wxCOMPtr<baseT> Callback_impl(lambdaT&& lambda, HRESULT (LT::*)(argTs...) const) wxCOMPtr<baseT> Callback_impl(lambdaT&& lambda, HRESULT(LT::*)(argTs...) const)
{ {
return wxCOMPtr<baseT>(new CInvokableLambda<baseT, argTs...>(lambda)); return wxCOMPtr<baseT>(new CInvokableLambda<baseT, argTs...>(lambda));
} }
template <typename baseT, typename lambdaT> template <typename baseT, typename lambdaT>
wxCOMPtr<baseT> Callback(lambdaT&& lambda) wxCOMPtr<baseT> Callback(lambdaT&& lambda)
{ {
return Callback_impl<baseT>(std::move(lambda), &lambdaT::operator()); return Callback_impl<baseT>(std::move(lambda), &lambdaT::operator());
} }
template <typename baseT, typename contextT, typename ...argTs> template <typename baseT, typename contextT, typename ...argTs>
wxCOMPtr<baseT> Callback(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) wxCOMPtr<baseT> Callback(contextT* ctx, HRESULT(contextT::* mthd)(argTs...))
{ {
return wxCOMPtr<baseT>(new CInvokableMethod<baseT, contextT, argTs...>(ctx, mthd)); return wxCOMPtr<baseT>(new CInvokableMethod<baseT, contextT, argTs...>(ctx, mthd));
} }