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) {}
virtual ~CInvokable() {}
// 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
@@ -47,10 +47,12 @@ public:
*ppvObj = NULL;
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(void) override {
ULONG STDMETHODCALLTYPE AddRef() override
{
return ++m_nRefCount;
}
ULONG STDMETHODCALLTYPE Release(void) override {
ULONG STDMETHODCALLTYPE Release() override
{
size_t ret = --m_nRefCount;
if (ret == 0)
delete this;
@@ -59,51 +61,58 @@ public:
private:
std::atomic<size_t> m_nRefCount;
};
template <typename baseT, typename ...argTs>
class CInvokableLambda : public CInvokable<baseT, argTs...>
{
public:
CInvokableLambda(std::function<HRESULT(argTs...)> lambda)
: m_lambda(lambda) {
}
: m_lambda(lambda)
{}
// baseT method
HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override {
HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override
{
return m_lambda(args...);
}
private:
std::function<HRESULT(argTs...)> m_lambda;
};
template <typename baseT, typename contextT, typename ...argTs>
class CInvokableMethod : public CInvokable<baseT, argTs...>
{
public:
CInvokableMethod(contextT *ctx, HRESULT (contextT::*mthd)(argTs...))
: m_ctx(ctx), m_mthd(mthd) {
}
CInvokableMethod(contextT* ctx, HRESULT(contextT::* mthd)(argTs...))
: m_ctx(ctx), m_mthd(mthd)
{}
// baseT method
HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override {
HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override
{
return (m_ctx->*m_mthd)(args...);
}
private:
contextT *m_ctx;
HRESULT (contextT::*m_mthd)(argTs...);
contextT* m_ctx;
HRESULT(contextT::* m_mthd)(argTs...);
};
// the function templates to generate concrete classes from above class templates
template <
typename baseT, typename lambdaT, // base type & lambda type
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));
}
template <typename baseT, typename lambdaT>
wxCOMPtr<baseT> Callback(lambdaT&& lambda)
{
return Callback_impl<baseT>(std::move(lambda), &lambdaT::operator());
}
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));
}