| Index: base/sta_call.h
|
| diff --git a/base/sta_call.h b/base/sta_call.h
|
| deleted file mode 100644
|
| index 4727fa94e93659b9c665ff4ea74a677cde0732d0..0000000000000000000000000000000000000000
|
| --- a/base/sta_call.h
|
| +++ /dev/null
|
| @@ -1,1117 +0,0 @@
|
| -// Copyright 2003-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -//
|
| -// sta_call.h generics for cross apartment calling.
|
| -//
|
| -// The code is using compile-time and run-time polymorphism to create
|
| -// type-safe call wrappers that can be used to cross call from a
|
| -// worker thread to an STA thread. The current implementation only
|
| -// supports calling the main STA.
|
| -//
|
| -// Functions as well as object methods can be called.
|
| -//
|
| -// Examples:
|
| -// class X {
|
| -// public:
|
| -// int Add(int i, int j) { return i + j; }
|
| -// };
|
| -//
|
| -//
|
| -// namespace {
|
| -// int Add(long i, long j) { return i + j; }
|
| -// }
|
| -//
|
| -// X x;
|
| -// int sum = CallMethod(&x, X::Add, 10, 20);
|
| -// int j = CallFunction(Add, -10, 10);
|
| -//
|
| -// The central piece of machinery is a hierarchy of functors. A functor is
|
| -// instantiated by a function template (CallFunction or CallMethod) and its
|
| -// 'Invoke' method gets called.
|
| -// Calling 'Invoke' will send the functor using 'SendMessage'
|
| -// to a window. The window message handler picks up the functor and
|
| -// calls the functor virtual operator().
|
| -// This virtual call is what actually calls the specified function or the
|
| -// method, the only difference being that the call is now made in a thread
|
| -// different than the thread that called 'Invoke'. There is a partial
|
| -// specialization of the templates for void, so that void type is supported
|
| -// as a return type.
|
| -//
|
| -//
|
| -// !!! Limitations !!!
|
| -//
|
| -// There are a few important design and implementation limitations. They are
|
| -// mostly related to template parameters ambiguities (T or T&) especially
|
| -// for overloaded names or const types. The limitations are significant although
|
| -// the code is useful enough as it is in most of the cases.
|
| -// However, when using the code it is frustrating to discover that it does not
|
| -// compile for obvious and useful cases, a constant reminder that a better
|
| -// solution is to be seeked.
|
| -//
|
| -//
|
| -// The implementation does not support calling all 'stdcall' calling convention.
|
| -//
|
| -// The design does not support calling functions or methods that use pass by
|
| -// reference arguments: f(std::string&) .
|
| -//
|
| -// The design does not support well calling functions or methods that take
|
| -// pointer to const types parameters : f(const std::string*) .
|
| -//
|
| -// The implementation does not support calling methods of const objects.
|
| -//
|
| -// To reduce the number of templates that get instantiated, the types of the
|
| -// arguments of the call must match exactly the types of parameters of the
|
| -// function or method . In some cases static_casts mey be required
|
| -// at the point of the call. Example: CallMethod(f, static_cast<long>(10));
|
| -
|
| -#ifndef OMAHA_COMMON_STA_CALL_H__
|
| -#define OMAHA_COMMON_STA_CALL_H__
|
| -
|
| -#include "base/scoped_ptr.h"
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/logging.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -// C4347: 'function template' is called instead of 'function'
|
| -#pragma warning(disable : 4347)
|
| -
|
| -// The Base Functor is the base of the functor hierarchy.
|
| -class BaseFunctor {
|
| - public:
|
| - explicit BaseFunctor(bool is_async) :
|
| - thread_id_(::GetCurrentThreadId()),
|
| - is_async_(is_async) {
|
| - CORE_LOG(L6, (_T("[BaseFunctor::BaseFunctor]")));
|
| - }
|
| -
|
| - // Functors are polymorphic objects.
|
| - virtual ~BaseFunctor() {
|
| - CORE_LOG(L6, (_T("[BaseFunctor::~BaseFunctor]")));
|
| - }
|
| -
|
| - // Abstract virtual function call operator. This is always called
|
| - // in the callee thread by the dispatcher of the apartment.
|
| - virtual void operator()(void* presult) = 0;
|
| -
|
| - // The thread id of the calling thread.
|
| - DWORD thread_id() const { return thread_id_; }
|
| -
|
| - bool is_async() const { return is_async_; }
|
| -
|
| - protected:
|
| -
|
| - // Invoke is called by each of the derived functors. This is how
|
| - // the cross thread invocation is made and the result of the invocation
|
| - // is retrieved. Invoke is always called in the caller thread.
|
| - template <typename R>
|
| - R Invoke() {
|
| - R r = R(); // ensure r is initialized even for primitive types.
|
| - if (!is_async_) {
|
| - DoInvoke(&r);
|
| - } else {
|
| - // We handle the async calls as if the call returns void.
|
| - DoInvoke(0);
|
| - }
|
| - return r;
|
| - }
|
| -
|
| - // non-template method to be called by the derived functors
|
| - // specialized for void.
|
| - void Invoke() {
|
| - // When the argument of the invocation is 0, we are not
|
| - // interested in the result.
|
| - DoInvoke(0);
|
| - }
|
| -
|
| - private:
|
| - void DoInvoke(void* presult); // Does the actual invocation.
|
| - DWORD thread_id_; // The thread id of the calling thread.
|
| - bool is_async_; // True for async calls.
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(BaseFunctor);
|
| -};
|
| -
|
| -//
|
| -// 0-ary method functor.
|
| -//
|
| -template <class T, typename R>
|
| -class MethodFunctor0 : public BaseFunctor {
|
| - public:
|
| - MethodFunctor0(bool is_async, T* pt, R (T::*pm)()) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (pobj_->*pm_)();
|
| - } else {
|
| - (pobj_->*pm_)();
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - // Don't forget to call the base implementation.
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - T* pobj_;
|
| - R (T::*pm_)();
|
| -};
|
| -
|
| -//
|
| -// 0-ary partial specialization for void return types.
|
| -//
|
| -template <class T>
|
| -class MethodFunctor0<T, void> : public BaseFunctor {
|
| - public:
|
| - MethodFunctor0(bool is_async, T* pt, void (T::*pm)()) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - // the actual call. There is no return value when the return type is void.
|
| - (pobj_->*pm_)();
|
| - }
|
| -
|
| - // Bring in the name from the Base
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - T* pobj_;
|
| - void (T::*pm_)();
|
| -};
|
| -
|
| -//
|
| -// 0-ary functor and specialization for void.
|
| -//
|
| -template <typename R>
|
| -class Functor0 : public BaseFunctor {
|
| - public:
|
| - Functor0(bool is_async, R (*pf)()) :
|
| - BaseFunctor(is_async), pf_(pf) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (*pf_)();
|
| - } else {
|
| - (*pf_)();
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - R (*pf_)();
|
| -};
|
| -
|
| -template <>
|
| -class Functor0<void> : public BaseFunctor {
|
| - public:
|
| - Functor0(bool is_async, void (*pf)()) :
|
| - BaseFunctor(is_async), pf_(pf) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (*pf_)();
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - void (*pf_)();
|
| -};
|
| -
|
| -
|
| -//
|
| -// 1-ary
|
| -//
|
| -template <class T, typename R, typename P>
|
| -class MethodFunctor1 : public BaseFunctor {
|
| - public:
|
| - MethodFunctor1(bool is_async, T* pt, R (T::*pm)(P), P p) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm), p_(p) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (pobj_->*pm_)(p_);
|
| - } else {
|
| - (pobj_->*pm_)(p_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - T* pobj_;
|
| - R (T::*pm_)(P);
|
| - P p_;
|
| -};
|
| -
|
| -template <class T, typename P>
|
| -class MethodFunctor1<T, void, P> : public BaseFunctor {
|
| - public:
|
| - MethodFunctor1(bool is_async, T* pt, void (T::*pm)(P), P p) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm), p_(p) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (pobj_->*pm_)(p_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - T* pobj_;
|
| - void (T::*pm_)(P);
|
| - P p_;
|
| -};
|
| -
|
| -template <typename R, typename P1>
|
| -class Functor1 : public BaseFunctor {
|
| - public:
|
| - Functor1(bool is_async, R (*pf)(P1), P1 p1) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (*pf_)(p1_);
|
| - } else {
|
| - (*pf_)(p1_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - R (*pf_)(P1);
|
| - P1 p1_;
|
| -};
|
| -
|
| -template <typename P1>
|
| -class Functor1<void, P1> : public BaseFunctor {
|
| - public:
|
| - Functor1(bool is_async, void (*pf)(P1), P1 p1) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (*pf_)(p1_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - void (*pf_)(P1);
|
| - P1 p1_;
|
| -};
|
| -
|
| -
|
| -//
|
| -// 2-ary
|
| -//
|
| -template <class T, typename R, typename P1, typename P2>
|
| -class MethodFunctor2 : public BaseFunctor {
|
| - public:
|
| - MethodFunctor2(bool is_async, T* pt, R (T::*pm)(P1, P2), P1 p1, P2 p2) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm), p1_(p1), p2_(p2) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (pobj_->*pm_)(p1_, p2_);
|
| - } else {
|
| - (pobj_->*pm_)(p1_, p2_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - T* pobj_;
|
| - R (T::*pm_)(P1, P2);
|
| - P1 p1_;
|
| - P2 p2_;
|
| -};
|
| -
|
| -template <class T, typename P1, typename P2>
|
| -class MethodFunctor2<T, void, P1, P2> : public BaseFunctor {
|
| - public:
|
| - MethodFunctor2(bool is_async, T* pt, void (T::*pm)(P1, P2), P1 p1, P2 p2) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm), p1_(p1), p2_(p2) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (pobj_->*pm_)(p1_, p2_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - T* pobj_;
|
| - void (T::*pm_)(P1, P2);
|
| - P1 p1_;
|
| - P2 p2_;
|
| -};
|
| -
|
| -template <typename R, typename P1, typename P2>
|
| -class Functor2 : public BaseFunctor {
|
| - public:
|
| - Functor2(bool is_async, R (*pf)(P1, P2), P1 p1, P2 p2) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1), p2_(p2) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = pf_(p1_, p2_);
|
| - } else {
|
| - pf_(p1_, p2_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - R (*pf_)(P1, P2);
|
| - P1 p1_;
|
| - P2 p2_;
|
| -};
|
| -
|
| -template <typename P1, typename P2>
|
| -class Functor2<void, P1, P2> : public BaseFunctor {
|
| - public:
|
| - Functor2(bool is_async, void (*pf)(P1, P2), P1 p1, P2 p2) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1), p2_(p2) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (*pf_)(p1_, p2_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - void (*pf_)(P1, P2);
|
| - P1 p1_;
|
| - P2 p2_;
|
| -};
|
| -
|
| -//
|
| -// 3-ary
|
| -//
|
| -template <class T, typename R, typename P1, typename P2, typename P3>
|
| -class MethodFunctor3 : public BaseFunctor {
|
| - public:
|
| - MethodFunctor3(bool is_async,
|
| - T* pt,
|
| - R (T::*pm)(P1, P2, P3),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm), p1_(p1), p2_(p2), p3_(p3) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (pobj_->*pm_)(p1_, p2_, p3_);
|
| - } else {
|
| - (pobj_->*pm_)(p1_, p2_, p3_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - T* pobj_;
|
| - R (T::*pm_)(P1, P2, P3);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| -};
|
| -
|
| -template <class T, typename P1, typename P2, typename P3>
|
| -class MethodFunctor3<T, void, P1, P2, P3> : public BaseFunctor {
|
| - public:
|
| - MethodFunctor3(bool is_async,
|
| - T* pt,
|
| - void (T::*pm)(P1, P2, P3),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3) :
|
| - BaseFunctor(is_async), pobj_(pt), pm_(pm), p1_(p1), p2_(p2), p3_(p3) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (pobj_->*pm_)(p1_, p2_, p3_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - T* pobj_;
|
| - void (T::*pm_)(P1, P2, P3);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| -};
|
| -
|
| -
|
| -template <typename R, typename P1, typename P2, typename P3>
|
| -class Functor3 : public BaseFunctor {
|
| - public:
|
| - Functor3(bool is_async, R (*pf)(P1, P2, P3), P1 p1, P2 p2, P3 p3) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1), p2_(p2), p3_(p3) {}
|
| - virtual void operator()(void* presult) {
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (*pf_)(p1_, p2_, p3_);
|
| - } else {
|
| - (*pf_)(p1_, p2_, p3_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - R (*pf_)(P1, P2, P3);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| -};
|
| -
|
| -template <typename P1, typename P2, typename P3>
|
| -class Functor3<void, P1, P2, P3> : public BaseFunctor {
|
| - public:
|
| - Functor3(bool is_async, void (*pf)(P1, P2, P3), P1 p1, P2 p2, P3 p3) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1), p2_(p2), p3_(p3) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (*pf_)(p1_, p2_, p3_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - void (*pf_)(P1, P2, P3);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| -};
|
| -
|
| -//
|
| -// 4-ary
|
| -//
|
| -template <class T,
|
| - typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4>
|
| -class MethodFunctor4 : public BaseFunctor {
|
| - public:
|
| - MethodFunctor4(bool is_async,
|
| - T* pt,
|
| - R (T::*pm)(P1, P2, P3, P4),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4) :
|
| - BaseFunctor(is_async),
|
| - pobj_(pt),
|
| - pm_(pm),
|
| - p1_(p1),
|
| - p2_(p2),
|
| - p3_(p3),
|
| - p4_(p4) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (pobj_->*pm_)(p1_, p2_, p3_, p4_);
|
| - } else {
|
| - (pobj_->*pm_)(p1_, p2_, p3_, p4_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - T* pobj_;
|
| - R (T::*pm_)(P1, P2, P3, P4);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| -};
|
| -
|
| -template <class T, typename P1, typename P2, typename P3, typename P4>
|
| -class MethodFunctor4<T, void, P1, P2, P3, P4> : public BaseFunctor {
|
| - public:
|
| - MethodFunctor4(bool is_async,
|
| - T* pt,
|
| - void (T::*pm)(P1, P2, P3, P4),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4) :
|
| - BaseFunctor(is_async),
|
| - pobj_(pt),
|
| - pm_(pm),
|
| - p1_(p1),
|
| - p2_(p2),
|
| - p3_(p3),
|
| - p4_(p4) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (pobj_->*pm_)(p1_, p2_, p3_, p4_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - T* pobj_;
|
| - void (T::*pm_)(P1, P2, P3, P4);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| -};
|
| -
|
| -
|
| -template <typename R, typename P1, typename P2, typename P3, typename P4>
|
| -class Functor4 : public BaseFunctor {
|
| - public:
|
| - Functor4(bool is_async, R (*pf)(P1, P2, P3, P4), P1 p1, P2 p2, P3 p3, P4 p4) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1), p2_(p2), p3_(p3), p4_(p4) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (*pf_)(p1_, p2_, p3_, p4_);
|
| - } else {
|
| - (*pf_)(p1_, p2_, p3_, p4_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - R (*pf_)(P1, P2, P3, P4);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| -};
|
| -
|
| -template <typename P1, typename P2, typename P3, typename P4>
|
| -class Functor4<void, P1, P2, P3, P4> : public BaseFunctor {
|
| - public:
|
| - Functor4(bool is_async,
|
| - void (*pf)(P1, P2, P3, P4),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4) :
|
| - BaseFunctor(is_async), pf_(pf), p1_(p1), p2_(p2), p3_(p3), p4_(p4) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (*pf_)(p1_, p2_, p3_, p4_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - void (*pf_)(P1, P2, P3, P4);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| -};
|
| -
|
| -//
|
| -// 5-ary
|
| -//
|
| -template <class T,
|
| - typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -class MethodFunctor5 : public BaseFunctor {
|
| - public:
|
| - MethodFunctor5(bool is_async,
|
| - T* pt,
|
| - R (T::*pm)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) :
|
| - BaseFunctor(is_async),
|
| - pobj_(pt),
|
| - pm_(pm),
|
| - p1_(p1),
|
| - p2_(p2),
|
| - p3_(p3),
|
| - p4_(p4),
|
| - p5_(p5) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (pobj_->*pm_)(p1_, p2_, p3_, p4_, p5_);
|
| - } else {
|
| - (pobj_->*pm_)(p1_, p2_, p3_, p4_, p5_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - T* pobj_;
|
| - R (T::*pm_)(P1, P2, P3, P4, P5);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| - P5 p5_;
|
| -};
|
| -
|
| -template <class T,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -class MethodFunctor5<T, void, P1, P2, P3, P4, P5> : public BaseFunctor {
|
| - public:
|
| - MethodFunctor5(bool is_async,
|
| - T* pt,
|
| - void (T::*pm)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) :
|
| - BaseFunctor(is_async),
|
| - pobj_(pt),
|
| - pm_(pm),
|
| - p1_(p1),
|
| - p2_(p2),
|
| - p3_(p3),
|
| - p4_(p4),
|
| - p5_(p5) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT(pobj_, (_T("Null object.")));
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (pobj_->*pm_)(p1_, p2_, p3_, p4_, p5_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - T* pobj_;
|
| - void (T::*pm_)(P1, P2, P3, P4, P5);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| - P5 p5_;
|
| -};
|
| -
|
| -template <typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -class Functor5 : public BaseFunctor {
|
| - public:
|
| - Functor5(bool is_async,
|
| - R (*pf)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) :
|
| - BaseFunctor(is_async),
|
| - pf_(pf),
|
| - p1_(p1),
|
| - p2_(p2),
|
| - p3_(p3),
|
| - p4_(p4),
|
| - p5_(p5) {}
|
| - virtual void operator()(void* presult) {
|
| - if (presult) {
|
| - *static_cast<R*>(presult) = (*pf_)(p1_, p2_, p3_, p4_, p5_);
|
| - } else {
|
| - (*pf_)(p1_, p2_, p3_, p4_, p5_);
|
| - }
|
| - }
|
| -
|
| - R Invoke() {
|
| - return BaseFunctor::Invoke<R>();
|
| - }
|
| -
|
| - private:
|
| - R (*pf_)(P1, P2, P3, P4, P5);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| - P5 p5_;
|
| -};
|
| -
|
| -template <typename P1, typename P2, typename P3, typename P4, typename P5>
|
| -class Functor5<void, P1, P2, P3, P4, P5> : public BaseFunctor {
|
| - public:
|
| - Functor5(bool is_async,
|
| - void (*pf)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) :
|
| - BaseFunctor(is_async),
|
| - pf_(pf),
|
| - p1_(p1),
|
| - p2_(p2),
|
| - p3_(p3),
|
| - p4_(p4),
|
| - p5_(p5) {}
|
| -
|
| - virtual void operator()(void* presult) {
|
| - ASSERT1(!presult);
|
| - presult; // unreferenced formal parameter
|
| -
|
| - (*pf_)(p1_, p2_, p3_, p4_, p5_);
|
| - }
|
| -
|
| - using BaseFunctor::Invoke;
|
| -
|
| - private:
|
| - void (*pf_)(P1, P2, P3, P4, P5);
|
| - P1 p1_;
|
| - P2 p2_;
|
| - P3 p3_;
|
| - P4 p4_;
|
| - P5 p5_;
|
| -};
|
| -
|
| -
|
| -// This is what the clients of the STA code instantiate and call.
|
| -//
|
| -// Synchronous Callers.
|
| -//
|
| -template <class T, typename R>
|
| -R CallMethod(T* object, R (T::*pm)()) {
|
| - return MethodFunctor0<T, R>(false, object, pm).Invoke();
|
| -}
|
| -
|
| -template <typename R>
|
| -R CallFunction(R (*pf)()) {
|
| - return Functor0<R>(false, pf).Invoke();
|
| -}
|
| -
|
| -template <class T, typename R, typename P>
|
| -R CallMethod(T* object, R (T::*pm)(P), P p) {
|
| - return MethodFunctor1<T, R, P>(false, object, pm, p).Invoke();
|
| -}
|
| -
|
| -template <typename R, typename P>
|
| -R CallFunction(R (*pf)(P), P p) {
|
| - return Functor1<R, P>(false, pf, p).Invoke();
|
| -}
|
| -
|
| -template <class T, typename R, typename P1, typename P2>
|
| -R CallMethod(T* object, R (T::*pm)(P1, P2), P1 p1, P2 p2) {
|
| - return MethodFunctor2<T, R, P1, P2>(false, object, pm, p1, p2).Invoke();
|
| -}
|
| -
|
| -template <typename R, typename P1, typename P2>
|
| -R CallFunction(R (*pf)(P1, P2), P1 p1, P2 p2) {
|
| - return Functor2<R, P1, P2>(false, pf, p1, p2).Invoke();
|
| -}
|
| -
|
| -template <class T, typename R, typename P1, typename P2, typename P3>
|
| -R CallMethod(T* object, R (T::*pm)(P1, P2, P3), P1 p1, P2 p2, P3 p3) {
|
| - return MethodFunctor3<T, R, P1, P2, P3>(false,
|
| - object, pm, p1, p2, p3).Invoke();
|
| -}
|
| -
|
| -template <typename R, typename P1, typename P2, typename P3>
|
| -R CallFunction(R (*pf)(P1, P2, P3), P1 p1, P2 p2, P3 p3) {
|
| - return Functor3<R, P1, P2, P3>(false, pf, p1, p2, p3).Invoke();
|
| -}
|
| -
|
| -template <class T,
|
| - typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4>
|
| -R CallMethod(T* object,
|
| - R (T::*pm)(P1, P2, P3, P4),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4) {
|
| - return MethodFunctor4<T, R, P1, P2, P3, P4>(false,
|
| - object,
|
| - pm,
|
| - p1,
|
| - p2,
|
| - p3,
|
| - p4).Invoke();
|
| -}
|
| -
|
| -template <typename R, typename P1, typename P2, typename P3, typename P4>
|
| -R CallFunction(R (*pf)(P1, P2, P3, P4), P1 p1, P2 p2, P3 p3, P4 p4) {
|
| - return Functor4<R, P1, P2, P3, P4>(false, pf, p1, p2, p3, p4).Invoke();
|
| -}
|
| -
|
| -template <class T,
|
| - typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -R CallMethod(T* object,
|
| - R (T::*pm)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) {
|
| - return MethodFunctor5<T, R, P1, P2, P3, P4, P5>(false,
|
| - object,
|
| - pm,
|
| - p1,
|
| - p2,
|
| - p3,
|
| - p4,
|
| - p5).Invoke();
|
| -}
|
| -
|
| -template <typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -R CallFunction(R (*pf)(P1, P2, P3, P4, P5), P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| - return Functor5<R, P1, P2, P3, P4, P5>(false,
|
| - pf,
|
| - p1,
|
| - p2,
|
| - p3,
|
| - p4,
|
| - p5).Invoke();
|
| -}
|
| -
|
| -//
|
| -// Asynchronous Callers.
|
| -//
|
| -template <class T, typename R>
|
| -void CallMethodAsync(T* object, R (T::*pm)()) {
|
| - scoped_ptr<MethodFunctor0<T, R> > fun(
|
| - new MethodFunctor0<T, R>(true, object, pm));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <typename R>
|
| -void CallFunctionAsync(R (*pf)()) {
|
| - scoped_ptr<Functor0<R> > fun(new Functor0<R>(true, pf));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <class T, typename R, typename P>
|
| -void CallMethodAsync(T* object, R (T::*pm)(P), P p) {
|
| - scoped_ptr<MethodFunctor1<T, R, P> > fun(
|
| - new MethodFunctor1<T, R, P>(true, object, pm, p));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <typename R, typename P>
|
| -void CallFunctionAsync(R (*pf)(P), P p) {
|
| - scoped_ptr<Functor1<R, P> > fun(new Functor1<R, P>(true, pf, p));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <class T, typename R, typename P1, typename P2>
|
| -void CallMethodAsync(T* object, R (T::*pm)(P1, P2), P1 p1, P2 p2) {
|
| - scoped_ptr<MethodFunctor2<T, R, P1, P2> > fun(
|
| - new MethodFunctor2<T, R, P1, P2>(true, object, pm, p1, p2));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <typename R, typename P1, typename P2>
|
| -void CallFunctionAsync(R (*pf)(P1, P2), P1 p1, P2 p2) {
|
| - scoped_ptr<Functor2<R, P1, P2> > fun(
|
| - new Functor2<R, P1, P2>(true, pf, p1, p2));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <class T, typename R, typename P1, typename P2, typename P3>
|
| -void CallMethodAsync(T* object, R (T::*pm)(P1, P2, P3), P1 p1, P2 p2, P3 p3) {
|
| - scoped_ptr<MethodFunctor3<T, R, P1, P2, P3> > fun(
|
| - new MethodFunctor3<T, R, P1, P2, P3>(true, object, pm, p1, p2, p3));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <typename R, typename P1, typename P2, typename P3>
|
| -void CallFunctionAsync(R (*pf)(P1, P2, P3), P1 p1, P2 p2, P3 p3) {
|
| - scoped_ptr<Functor3<R, P1, P2, P3> > fun(
|
| - new Functor3<R, P1, P2, P3>(true, pf, p1, p2, p3));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <class T,
|
| - typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4>
|
| -void CallMethodAsync(T* obj,
|
| - R (T::*pm)(P1, P2, P3, P4),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4) {
|
| - scoped_ptr<MethodFunctor4<T, R, P1, P2, P3, P4> > fun(
|
| - new MethodFunctor4<T, R, P1, P2, P3, P4>(true, obj, pm, p1, p2, p3, p4));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <typename R, typename P1, typename P2, typename P3, typename P4>
|
| -void CallFunctionAsync(R (*pf)(P1, P2, P3, P4), P1 p1, P2 p2, P3 p3, P4 p4) {
|
| - scoped_ptr<Functor4<R, P1, P2, P3, P4> > fun(
|
| - new Functor4<R, P1, P2, P3, P4>(true, pf, p1, p2, p3, p4));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <class T,
|
| - typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -void CallMethodAsync(T* object,
|
| - R (T::*pm)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) {
|
| - scoped_ptr<MethodFunctor5<T, R, P1, P2, P3, P4, P5> > fun(
|
| - new MethodFunctor5<T, R, P1, P2, P3, P4, P5>(true,
|
| - object,
|
| - pm,
|
| - p1,
|
| - p2,
|
| - p3,
|
| - p4,
|
| - p5));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -template <typename R,
|
| - typename P1,
|
| - typename P2,
|
| - typename P3,
|
| - typename P4,
|
| - typename P5>
|
| -void CallFunctionAsync(R (*pf)(P1, P2, P3, P4, P5),
|
| - P1 p1,
|
| - P2 p2,
|
| - P3 p3,
|
| - P4 p4,
|
| - P5 p5) {
|
| - scoped_ptr<Functor5<R, P1, P2, P3, P4, P5> > fun(
|
| - new Functor5<R, P1, P2, P3, P4, P5>(true, pf, p1, p2, p3, p4, p5));
|
| - fun->Invoke();
|
| - fun.release();
|
| -}
|
| -
|
| -#pragma warning(default : 4347)
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_COMMON_STA_CALL_H__
|
| -
|
|
|