905 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			905 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
$$ -*- mode: c++; -*-
 | 
						|
$$ This is a Pump source file.  Please use Pump to convert it to
 | 
						|
$$ gmock-generated-variadic-actions.h.
 | 
						|
$$
 | 
						|
$var n = 10  $$ The maximum arity we support.
 | 
						|
// Copyright 2007, Google Inc.
 | 
						|
// All rights reserved.
 | 
						|
//
 | 
						|
// Redistribution and use in source and binary forms, with or without
 | 
						|
// modification, are permitted provided that the following conditions are
 | 
						|
// met:
 | 
						|
//
 | 
						|
//     * Redistributions of source code must retain the above copyright
 | 
						|
// notice, this list of conditions and the following disclaimer.
 | 
						|
//     * Redistributions in binary form must reproduce the above
 | 
						|
// copyright notice, this list of conditions and the following disclaimer
 | 
						|
// in the documentation and/or other materials provided with the
 | 
						|
// distribution.
 | 
						|
//     * Neither the name of Google Inc. nor the names of its
 | 
						|
// contributors may be used to endorse or promote products derived from
 | 
						|
// this software without specific prior written permission.
 | 
						|
//
 | 
						|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
						|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
						|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
						|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
						|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
						|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
						|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
						|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
						|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
						|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
						|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
//
 | 
						|
// Author: wan@google.com (Zhanyong Wan)
 | 
						|
 | 
						|
// Google Mock - a framework for writing C++ mock classes.
 | 
						|
//
 | 
						|
// This file implements some commonly used variadic actions.
 | 
						|
 | 
						|
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
 | 
						|
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
 | 
						|
 | 
						|
#include <gmock/gmock-actions.h>
 | 
						|
#include <gmock/internal/gmock-port.h>
 | 
						|
 | 
						|
namespace testing {
 | 
						|
namespace internal {
 | 
						|
 | 
						|
// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary
 | 
						|
// function or method with the unpacked values, where F is a function
 | 
						|
// type that takes N arguments.
 | 
						|
template <typename Result, typename ArgumentTuple>
 | 
						|
class InvokeHelper;
 | 
						|
 | 
						|
 | 
						|
$range i 0..n
 | 
						|
$for i [[
 | 
						|
$range j 1..i
 | 
						|
$var types = [[$for j [[, typename A$j]]]]
 | 
						|
$var as = [[$for j, [[A$j]]]]
 | 
						|
$var args = [[$if i==0 [[]] $else [[ args]]]]
 | 
						|
$var import = [[$if i==0 [[]] $else [[
 | 
						|
    using ::std::tr1::get;
 | 
						|
 | 
						|
]]]]
 | 
						|
$var gets = [[$for j, [[get<$(j - 1)>(args)]]]]
 | 
						|
template <typename R$types>
 | 
						|
class InvokeHelper<R, ::std::tr1::tuple<$as> > {
 | 
						|
 public:
 | 
						|
  template <typename Function>
 | 
						|
  static R Invoke(Function function, const ::std::tr1::tuple<$as>&$args) {
 | 
						|
$import    return function($gets);
 | 
						|
  }
 | 
						|
 | 
						|
  template <class Class, typename MethodPtr>
 | 
						|
  static R InvokeMethod(Class* obj_ptr,
 | 
						|
                        MethodPtr method_ptr,
 | 
						|
                        const ::std::tr1::tuple<$as>&$args) {
 | 
						|
$import    return (obj_ptr->*method_ptr)($gets);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
// Implements the Invoke(f) action.  The template argument
 | 
						|
// FunctionImpl is the implementation type of f, which can be either a
 | 
						|
// function pointer or a functor.  Invoke(f) can be used as an
 | 
						|
// Action<F> as long as f's type is compatible with F (i.e. f can be
 | 
						|
// assigned to a tr1::function<F>).
 | 
						|
template <typename FunctionImpl>
 | 
						|
class InvokeAction {
 | 
						|
 public:
 | 
						|
  // The c'tor makes a copy of function_impl (either a function
 | 
						|
  // pointer or a functor).
 | 
						|
  explicit InvokeAction(FunctionImpl function_impl)
 | 
						|
      : function_impl_(function_impl) {}
 | 
						|
 | 
						|
  template <typename Result, typename ArgumentTuple>
 | 
						|
  Result Perform(const ArgumentTuple& args) {
 | 
						|
    return InvokeHelper<Result, ArgumentTuple>::Invoke(function_impl_, args);
 | 
						|
  }
 | 
						|
 private:
 | 
						|
  FunctionImpl function_impl_;
 | 
						|
};
 | 
						|
 | 
						|
// Implements the Invoke(object_ptr, &Class::Method) action.
 | 
						|
template <class Class, typename MethodPtr>
 | 
						|
class InvokeMethodAction {
 | 
						|
 public:
 | 
						|
  InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr)
 | 
						|
      : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {}
 | 
						|
 | 
						|
  template <typename Result, typename ArgumentTuple>
 | 
						|
  Result Perform(const ArgumentTuple& args) const {
 | 
						|
    return InvokeHelper<Result, ArgumentTuple>::InvokeMethod(
 | 
						|
        obj_ptr_, method_ptr_, args);
 | 
						|
  }
 | 
						|
 private:
 | 
						|
  Class* const obj_ptr_;
 | 
						|
  const MethodPtr method_ptr_;
 | 
						|
};
 | 
						|
 | 
						|
// A ReferenceWrapper<T> object represents a reference to type T,
 | 
						|
// which can be either const or not.  It can be explicitly converted
 | 
						|
// from, and implicitly converted to, a T&.  Unlike a reference,
 | 
						|
// ReferenceWrapper<T> can be copied and can survive template type
 | 
						|
// inference.  This is used to support by-reference arguments in the
 | 
						|
// InvokeArgument<N>(...) action.  The idea was from "reference
 | 
						|
// wrappers" in tr1, which we don't have in our source tree yet.
 | 
						|
template <typename T>
 | 
						|
class ReferenceWrapper {
 | 
						|
 public:
 | 
						|
  // Constructs a ReferenceWrapper<T> object from a T&.
 | 
						|
  explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {}  // NOLINT
 | 
						|
 | 
						|
  // Allows a ReferenceWrapper<T> object to be implicitly converted to
 | 
						|
  // a T&.
 | 
						|
  operator T&() const { return *pointer_; }
 | 
						|
 private:
 | 
						|
  T* pointer_;
 | 
						|
};
 | 
						|
 | 
						|
// CallableHelper has static methods for invoking "callables",
 | 
						|
// i.e. function pointers and functors.  It uses overloading to
 | 
						|
// provide a uniform interface for invoking different kinds of
 | 
						|
// callables.  In particular, you can use:
 | 
						|
//
 | 
						|
//   CallableHelper<R>::Call(callable, a1, a2, ..., an)
 | 
						|
//
 | 
						|
// to invoke an n-ary callable, where R is its return type.  If an
 | 
						|
// argument, say a2, needs to be passed by reference, you should write
 | 
						|
// ByRef(a2) instead of a2 in the above expression.
 | 
						|
template <typename R>
 | 
						|
class CallableHelper {
 | 
						|
 public:
 | 
						|
  // Calls a nullary callable.
 | 
						|
  template <typename Function>
 | 
						|
  static R Call(Function function) { return function(); }
 | 
						|
 | 
						|
  // Calls a unary callable.
 | 
						|
 | 
						|
  // We deliberately pass a1 by value instead of const reference here
 | 
						|
  // in case it is a C-string literal.  If we had declared the
 | 
						|
  // parameter as 'const A1& a1' and write Call(function, "Hi"), the
 | 
						|
  // compiler would've thought A1 is 'char[3]', which causes trouble
 | 
						|
  // when you need to copy a value of type A1.  By declaring the
 | 
						|
  // parameter as 'A1 a1', the compiler will correctly infer that A1
 | 
						|
  // is 'const char*' when it sees Call(function, "Hi").
 | 
						|
  //
 | 
						|
  // Since this function is defined inline, the compiler can get rid
 | 
						|
  // of the copying of the arguments.  Therefore the performance won't
 | 
						|
  // be hurt.
 | 
						|
  template <typename Function, typename A1>
 | 
						|
  static R Call(Function function, A1 a1) { return function(a1); }
 | 
						|
 | 
						|
$range i 2..n
 | 
						|
$for i
 | 
						|
[[
 | 
						|
$var arity = [[$if i==2 [[binary]] $elif i==3 [[ternary]] $else [[$i-ary]]]]
 | 
						|
 | 
						|
  // Calls a $arity callable.
 | 
						|
 | 
						|
$range j 1..i
 | 
						|
$var typename_As = [[$for j, [[typename A$j]]]]
 | 
						|
$var Aas = [[$for j, [[A$j a$j]]]]
 | 
						|
$var as = [[$for j, [[a$j]]]]
 | 
						|
$var typename_Ts = [[$for j, [[typename T$j]]]]
 | 
						|
$var Ts = [[$for j, [[T$j]]]]
 | 
						|
  template <typename Function, $typename_As>
 | 
						|
  static R Call(Function function, $Aas) {
 | 
						|
    return function($as);
 | 
						|
  }
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
};  // class CallableHelper
 | 
						|
 | 
						|
// Invokes a nullary callable argument.
 | 
						|
template <size_t N>
 | 
						|
class InvokeArgumentAction0 {
 | 
						|
 public:
 | 
						|
  template <typename Result, typename ArgumentTuple>
 | 
						|
  static Result Perform(const ArgumentTuple& args) {
 | 
						|
    return CallableHelper<Result>::Call(::std::tr1::get<N>(args));
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
// Invokes a unary callable argument with the given argument.
 | 
						|
template <size_t N, typename A1>
 | 
						|
class InvokeArgumentAction1 {
 | 
						|
 public:
 | 
						|
  // We deliberately pass a1 by value instead of const reference here
 | 
						|
  // in case it is a C-string literal.
 | 
						|
  //
 | 
						|
  // Since this function is defined inline, the compiler can get rid
 | 
						|
  // of the copying of the arguments.  Therefore the performance won't
 | 
						|
  // be hurt.
 | 
						|
  explicit InvokeArgumentAction1(A1 a1) : arg1_(a1) {}
 | 
						|
 | 
						|
  template <typename Result, typename ArgumentTuple>
 | 
						|
  Result Perform(const ArgumentTuple& args) {
 | 
						|
    return CallableHelper<Result>::Call(::std::tr1::get<N>(args), arg1_);
 | 
						|
  }
 | 
						|
 private:
 | 
						|
  const A1 arg1_;
 | 
						|
};
 | 
						|
 | 
						|
$range i 2..n
 | 
						|
$for i [[
 | 
						|
$var arity = [[$if i==2 [[binary]] $elif i==3 [[ternary]] $else [[$i-ary]]]]
 | 
						|
$range j 1..i
 | 
						|
$var typename_As = [[$for j, [[typename A$j]]]]
 | 
						|
$var args_ = [[$for j, [[arg$j[[]]_]]]]
 | 
						|
 | 
						|
// Invokes a $arity callable argument with the given arguments.
 | 
						|
template <size_t N, $typename_As>
 | 
						|
class InvokeArgumentAction$i {
 | 
						|
 public:
 | 
						|
  InvokeArgumentAction$i($for j, [[A$j a$j]]) :
 | 
						|
      $for j, [[arg$j[[]]_(a$j)]] {}
 | 
						|
 | 
						|
  template <typename Result, typename ArgumentTuple>
 | 
						|
  Result Perform(const ArgumentTuple& args) {
 | 
						|
$if i <= 4 [[
 | 
						|
 | 
						|
    return CallableHelper<Result>::Call(::std::tr1::get<N>(args), $args_);
 | 
						|
 | 
						|
]] $else [[
 | 
						|
 | 
						|
    // We extract the callable to a variable before invoking it, in
 | 
						|
    // case it is a functor passed by value and its operator() is not
 | 
						|
    // const.
 | 
						|
    typename ::std::tr1::tuple_element<N, ArgumentTuple>::type function =
 | 
						|
        ::std::tr1::get<N>(args);
 | 
						|
    return function($args_);
 | 
						|
 | 
						|
]]
 | 
						|
  }
 | 
						|
 private:
 | 
						|
$for j [[
 | 
						|
 | 
						|
  const A$j arg$j[[]]_;
 | 
						|
]]
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
// An INTERNAL macro for extracting the type of a tuple field.  It's
 | 
						|
// subject to change without notice - DO NOT USE IN USER CODE!
 | 
						|
#define GMOCK_FIELD_(Tuple, N) \
 | 
						|
    typename ::std::tr1::tuple_element<N, Tuple>::type
 | 
						|
 | 
						|
$range i 1..n
 | 
						|
 | 
						|
// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
 | 
						|
// type of an n-ary function whose i-th (1-based) argument type is the
 | 
						|
// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
 | 
						|
// type, and whose return type is Result.  For example,
 | 
						|
//   SelectArgs<int, ::std::tr1::tuple<bool, char, double, long>, 0, 3>::type
 | 
						|
// is int(bool, long).
 | 
						|
//
 | 
						|
// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
 | 
						|
// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
 | 
						|
// For example,
 | 
						|
//   SelectArgs<int, ::std::tr1::tuple<bool, char, double>, 2, 0>::Select(
 | 
						|
//       ::std::tr1::make_tuple(true, 'a', 2.5))
 | 
						|
// returns ::std::tr1::tuple (2.5, true).
 | 
						|
//
 | 
						|
// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
 | 
						|
// in the range [0, $n].  Duplicates are allowed and they don't have
 | 
						|
// to be in an ascending or descending order.
 | 
						|
 | 
						|
template <typename Result, typename ArgumentTuple, $for i, [[int k$i]]>
 | 
						|
class SelectArgs {
 | 
						|
 public:
 | 
						|
  typedef Result type($for i, [[GMOCK_FIELD_(ArgumentTuple, k$i)]]);
 | 
						|
  typedef typename Function<type>::ArgumentTuple SelectedArgs;
 | 
						|
  static SelectedArgs Select(const ArgumentTuple& args) {
 | 
						|
    using ::std::tr1::get;
 | 
						|
    return SelectedArgs($for i, [[get<k$i>(args)]]);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
$for i [[
 | 
						|
$range j 1..n
 | 
						|
$range j1 1..i-1
 | 
						|
template <typename Result, typename ArgumentTuple$for j1[[, int k$j1]]>
 | 
						|
class SelectArgs<Result, ArgumentTuple,
 | 
						|
                 $for j, [[$if j <= i-1 [[k$j]] $else [[-1]]]]> {
 | 
						|
 public:
 | 
						|
  typedef Result type($for j1, [[GMOCK_FIELD_(ArgumentTuple, k$j1)]]);
 | 
						|
  typedef typename Function<type>::ArgumentTuple SelectedArgs;
 | 
						|
  static SelectedArgs Select(const ArgumentTuple& [[]]
 | 
						|
$if i == 1 [[/* args */]] $else [[args]]) {
 | 
						|
    using ::std::tr1::get;
 | 
						|
    return SelectedArgs($for j1, [[get<k$j1>(args)]]);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
]]
 | 
						|
#undef GMOCK_FIELD_
 | 
						|
 | 
						|
$var ks = [[$for i, [[k$i]]]]
 | 
						|
 | 
						|
// Implements the WithArgs action.
 | 
						|
template <typename InnerAction, $for i, [[int k$i = -1]]>
 | 
						|
class WithArgsAction {
 | 
						|
 public:
 | 
						|
  explicit WithArgsAction(const InnerAction& action) : action_(action) {}
 | 
						|
 | 
						|
  template <typename F>
 | 
						|
  operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
 | 
						|
 | 
						|
 private:
 | 
						|
  template <typename F>
 | 
						|
  class Impl : public ActionInterface<F> {
 | 
						|
   public:
 | 
						|
    typedef typename Function<F>::Result Result;
 | 
						|
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
 | 
						|
 | 
						|
    explicit Impl(const InnerAction& action) : action_(action) {}
 | 
						|
 | 
						|
    virtual Result Perform(const ArgumentTuple& args) {
 | 
						|
      return action_.Perform(SelectArgs<Result, ArgumentTuple, $ks>::Select(args));
 | 
						|
    }
 | 
						|
 | 
						|
   private:
 | 
						|
    typedef typename SelectArgs<Result, ArgumentTuple,
 | 
						|
        $ks>::type InnerFunctionType;
 | 
						|
 | 
						|
    Action<InnerFunctionType> action_;
 | 
						|
  };
 | 
						|
 | 
						|
  const InnerAction action_;
 | 
						|
};
 | 
						|
 | 
						|
// Does two actions sequentially.  Used for implementing the DoAll(a1,
 | 
						|
// a2, ...) action.
 | 
						|
template <typename Action1, typename Action2>
 | 
						|
class DoBothAction {
 | 
						|
 public:
 | 
						|
  DoBothAction(Action1 action1, Action2 action2)
 | 
						|
      : action1_(action1), action2_(action2) {}
 | 
						|
 | 
						|
  // This template type conversion operator allows DoAll(a1, ..., a_n)
 | 
						|
  // to be used in ANY function of compatible type.
 | 
						|
  template <typename F>
 | 
						|
  operator Action<F>() const {
 | 
						|
    return Action<F>(new Impl<F>(action1_, action2_));
 | 
						|
  }
 | 
						|
 | 
						|
 private:
 | 
						|
  // Implements the DoAll(...) action for a particular function type F.
 | 
						|
  template <typename F>
 | 
						|
  class Impl : public ActionInterface<F> {
 | 
						|
   public:
 | 
						|
    typedef typename Function<F>::Result Result;
 | 
						|
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
 | 
						|
    typedef typename Function<F>::MakeResultVoid VoidResult;
 | 
						|
 | 
						|
    Impl(const Action<VoidResult>& action1, const Action<F>& action2)
 | 
						|
        : action1_(action1), action2_(action2) {}
 | 
						|
 | 
						|
    virtual Result Perform(const ArgumentTuple& args) {
 | 
						|
      action1_.Perform(args);
 | 
						|
      return action2_.Perform(args);
 | 
						|
    }
 | 
						|
 | 
						|
   private:
 | 
						|
    const Action<VoidResult> action1_;
 | 
						|
    const Action<F> action2_;
 | 
						|
  };
 | 
						|
 | 
						|
  Action1 action1_;
 | 
						|
  Action2 action2_;
 | 
						|
};
 | 
						|
 | 
						|
// A macro from the ACTION* family (defined later in this file)
 | 
						|
// defines an action that can be used in a mock function.  Typically,
 | 
						|
// these actions only care about a subset of the arguments of the mock
 | 
						|
// function.  For example, if such an action only uses the second
 | 
						|
// argument, it can be used in any mock function that takes >= 2
 | 
						|
// arguments where the type of the second argument is compatible.
 | 
						|
//
 | 
						|
// Therefore, the action implementation must be prepared to take more
 | 
						|
// arguments than it needs.  The ExcessiveArg type is used to
 | 
						|
// represent those excessive arguments.  In order to keep the compiler
 | 
						|
// error messages tractable, we define it in the testing namespace
 | 
						|
// instead of testing::internal.  However, this is an INTERNAL TYPE
 | 
						|
// and subject to change without notice, so a user MUST NOT USE THIS
 | 
						|
// TYPE DIRECTLY.
 | 
						|
struct ExcessiveArg {};
 | 
						|
 | 
						|
// A helper class needed for implementing the ACTION* macros.
 | 
						|
template <typename Result, class Impl>
 | 
						|
class ActionHelper {
 | 
						|
 public:
 | 
						|
$range i 0..n
 | 
						|
$for i
 | 
						|
 | 
						|
[[
 | 
						|
$var template = [[$if i==0 [[]] $else [[
 | 
						|
$range j 0..i-1
 | 
						|
  template <$for j, [[typename A$j]]>
 | 
						|
]]]]
 | 
						|
$range j 0..i-1
 | 
						|
$var As = [[$for j, [[A$j]]]]
 | 
						|
$var as = [[$for j, [[get<$j>(args)]]]]
 | 
						|
$range k 1..n-i
 | 
						|
$var eas = [[$for k, [[ExcessiveArg()]]]]
 | 
						|
$var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]]
 | 
						|
$template
 | 
						|
  static Result Perform(Impl* impl, const ::std::tr1::tuple<$As>& args) {
 | 
						|
    using ::std::tr1::get;
 | 
						|
    return impl->template gmock_PerformImpl<$As>(args, $arg_list);
 | 
						|
  }
 | 
						|
 | 
						|
]]
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace internal
 | 
						|
 | 
						|
// Various overloads for Invoke().
 | 
						|
 | 
						|
// Creates an action that invokes 'function_impl' with the mock
 | 
						|
// function's arguments.
 | 
						|
template <typename FunctionImpl>
 | 
						|
PolymorphicAction<internal::InvokeAction<FunctionImpl> > Invoke(
 | 
						|
    FunctionImpl function_impl) {
 | 
						|
  return MakePolymorphicAction(
 | 
						|
      internal::InvokeAction<FunctionImpl>(function_impl));
 | 
						|
}
 | 
						|
 | 
						|
// Creates an action that invokes the given method on the given object
 | 
						|
// with the mock function's arguments.
 | 
						|
template <class Class, typename MethodPtr>
 | 
						|
PolymorphicAction<internal::InvokeMethodAction<Class, MethodPtr> > Invoke(
 | 
						|
    Class* obj_ptr, MethodPtr method_ptr) {
 | 
						|
  return MakePolymorphicAction(
 | 
						|
      internal::InvokeMethodAction<Class, MethodPtr>(obj_ptr, method_ptr));
 | 
						|
}
 | 
						|
 | 
						|
// Creates a reference wrapper for the given L-value.  If necessary,
 | 
						|
// you can explicitly specify the type of the reference.  For example,
 | 
						|
// suppose 'derived' is an object of type Derived, ByRef(derived)
 | 
						|
// would wrap a Derived&.  If you want to wrap a const Base& instead,
 | 
						|
// where Base is a base class of Derived, just write:
 | 
						|
//
 | 
						|
//   ByRef<const Base>(derived)
 | 
						|
template <typename T>
 | 
						|
inline internal::ReferenceWrapper<T> ByRef(T& l_value) {  // NOLINT
 | 
						|
  return internal::ReferenceWrapper<T>(l_value);
 | 
						|
}
 | 
						|
 | 
						|
// Various overloads for InvokeArgument<N>().
 | 
						|
//
 | 
						|
// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
 | 
						|
// (0-based) argument, which must be a k-ary callable, of the mock
 | 
						|
// function, with arguments a1, a2, ..., a_k.
 | 
						|
//
 | 
						|
// Notes:
 | 
						|
//
 | 
						|
//   1. The arguments are passed by value by default.  If you need to
 | 
						|
//   pass an argument by reference, wrap it inside ByRef().  For
 | 
						|
//   example,
 | 
						|
//
 | 
						|
//     InvokeArgument<1>(5, string("Hello"), ByRef(foo))
 | 
						|
//
 | 
						|
//   passes 5 and string("Hello") by value, and passes foo by
 | 
						|
//   reference.
 | 
						|
//
 | 
						|
//   2. If the callable takes an argument by reference but ByRef() is
 | 
						|
//   not used, it will receive the reference to a copy of the value,
 | 
						|
//   instead of the original value.  For example, when the 0-th
 | 
						|
//   argument of the mock function takes a const string&, the action
 | 
						|
//
 | 
						|
//     InvokeArgument<0>(string("Hello"))
 | 
						|
//
 | 
						|
//   makes a copy of the temporary string("Hello") object and passes a
 | 
						|
//   reference of the copy, instead of the original temporary object,
 | 
						|
//   to the callable.  This makes it easy for a user to define an
 | 
						|
//   InvokeArgument action from temporary values and have it performed
 | 
						|
//   later.
 | 
						|
template <size_t N>
 | 
						|
inline PolymorphicAction<internal::InvokeArgumentAction0<N> > InvokeArgument() {
 | 
						|
  return MakePolymorphicAction(internal::InvokeArgumentAction0<N>());
 | 
						|
}
 | 
						|
 | 
						|
// We deliberately pass a1 by value instead of const reference here in
 | 
						|
// case it is a C-string literal.  If we had declared the parameter as
 | 
						|
// 'const A1& a1' and write InvokeArgument<0>("Hi"), the compiler
 | 
						|
// would've thought A1 is 'char[3]', which causes trouble as the
 | 
						|
// implementation needs to copy a value of type A1.  By declaring the
 | 
						|
// parameter as 'A1 a1', the compiler will correctly infer that A1 is
 | 
						|
// 'const char*' when it sees InvokeArgument<0>("Hi").
 | 
						|
//
 | 
						|
// Since this function is defined inline, the compiler can get rid of
 | 
						|
// the copying of the arguments.  Therefore the performance won't be
 | 
						|
// hurt.
 | 
						|
template <size_t N, typename A1>
 | 
						|
inline PolymorphicAction<internal::InvokeArgumentAction1<N, A1> >
 | 
						|
InvokeArgument(A1 a1) {
 | 
						|
  return MakePolymorphicAction(internal::InvokeArgumentAction1<N, A1>(a1));
 | 
						|
}
 | 
						|
 | 
						|
$range i 2..n
 | 
						|
$for i [[
 | 
						|
$range j 1..i
 | 
						|
$var typename_As = [[$for j, [[typename A$j]]]]
 | 
						|
$var As = [[$for j, [[A$j]]]]
 | 
						|
$var Aas = [[$for j, [[A$j a$j]]]]
 | 
						|
$var as = [[$for j, [[a$j]]]]
 | 
						|
 | 
						|
template <size_t N, $typename_As>
 | 
						|
inline PolymorphicAction<internal::InvokeArgumentAction$i<N, $As> >
 | 
						|
InvokeArgument($Aas) {
 | 
						|
  return MakePolymorphicAction(
 | 
						|
      internal::InvokeArgumentAction$i<N, $As>($as));
 | 
						|
}
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
// WithoutArgs(inner_action) can be used in a mock function with a
 | 
						|
// non-empty argument list to perform inner_action, which takes no
 | 
						|
// argument.  In other words, it adapts an action accepting no
 | 
						|
// argument to one that accepts (and ignores) arguments.
 | 
						|
template <typename InnerAction>
 | 
						|
inline internal::WithArgsAction<InnerAction>
 | 
						|
WithoutArgs(const InnerAction& action) {
 | 
						|
  return internal::WithArgsAction<InnerAction>(action);
 | 
						|
}
 | 
						|
 | 
						|
// WithArg<k>(an_action) creates an action that passes the k-th
 | 
						|
// (0-based) argument of the mock function to an_action and performs
 | 
						|
// it.  It adapts an action accepting one argument to one that accepts
 | 
						|
// multiple arguments.  For convenience, we also provide
 | 
						|
// WithArgs<k>(an_action) (defined below) as a synonym.
 | 
						|
template <int k, typename InnerAction>
 | 
						|
inline internal::WithArgsAction<InnerAction, k>
 | 
						|
WithArg(const InnerAction& action) {
 | 
						|
  return internal::WithArgsAction<InnerAction, k>(action);
 | 
						|
}
 | 
						|
 | 
						|
// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
 | 
						|
// the selected arguments of the mock function to an_action and
 | 
						|
// performs it.  It serves as an adaptor between actions with
 | 
						|
// different argument lists.  C++ doesn't support default arguments for
 | 
						|
// function templates, so we have to overload it.
 | 
						|
 | 
						|
$range i 1..n
 | 
						|
$for i [[
 | 
						|
$range j 1..i
 | 
						|
template <$for j [[int k$j, ]]typename InnerAction>
 | 
						|
inline internal::WithArgsAction<InnerAction$for j [[, k$j]]>
 | 
						|
WithArgs(const InnerAction& action) {
 | 
						|
  return internal::WithArgsAction<InnerAction$for j [[, k$j]]>(action);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
]]
 | 
						|
// Creates an action that does actions a1, a2, ..., sequentially in
 | 
						|
// each invocation.
 | 
						|
$range i 2..n
 | 
						|
$for i [[
 | 
						|
$range j 2..i
 | 
						|
$var types = [[$for j, [[typename Action$j]]]]
 | 
						|
$var Aas = [[$for j [[, Action$j a$j]]]]
 | 
						|
 | 
						|
template <typename Action1, $types>
 | 
						|
$range k 1..i-1
 | 
						|
 | 
						|
inline $for k [[internal::DoBothAction<Action$k, ]]Action$i$for k  [[>]]
 | 
						|
 | 
						|
DoAll(Action1 a1$Aas) {
 | 
						|
$if i==2 [[
 | 
						|
 | 
						|
  return internal::DoBothAction<Action1, Action2>(a1, a2);
 | 
						|
]] $else [[
 | 
						|
$range j2 2..i
 | 
						|
 | 
						|
  return DoAll(a1, DoAll($for j2, [[a$j2]]));
 | 
						|
]]
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
}  // namespace testing
 | 
						|
 | 
						|
// The ACTION* family of macros can be used in a namespace scope to
 | 
						|
// define custom actions easily.  The syntax:
 | 
						|
//
 | 
						|
//   ACTION(name) { statements; }
 | 
						|
//
 | 
						|
// will define an action with the given name that executes the
 | 
						|
// statements.  The value returned by the statements will be used as
 | 
						|
// the return value of the action.  Inside the statements, you can
 | 
						|
// refer to the K-th (0-based) argument of the mock function by
 | 
						|
// 'argK', and refer to its type by 'argK_type'.  For example:
 | 
						|
//
 | 
						|
//   ACTION(IncrementArg1) {
 | 
						|
//     arg1_type temp = arg1;
 | 
						|
//     return ++(*temp);
 | 
						|
//   }
 | 
						|
//
 | 
						|
// allows you to write
 | 
						|
//
 | 
						|
//   ...WillOnce(IncrementArg1());
 | 
						|
//
 | 
						|
// You can also refer to the entire argument tuple and its type by
 | 
						|
// 'args' and 'args_type', and refer to the mock function type and its
 | 
						|
// return type by 'function_type' and 'return_type'.
 | 
						|
//
 | 
						|
// Note that you don't need to specify the types of the mock function
 | 
						|
// arguments.  However rest assured that your code is still type-safe:
 | 
						|
// you'll get a compiler error if *arg1 doesn't support the ++
 | 
						|
// operator, or if the type of ++(*arg1) isn't compatible with the
 | 
						|
// mock function's return type, for example.
 | 
						|
//
 | 
						|
// Sometimes you'll want to parameterize the action.   For that you can use
 | 
						|
// another macro:
 | 
						|
//
 | 
						|
//   ACTION_P(name, param_name) { statements; }
 | 
						|
//
 | 
						|
// For example:
 | 
						|
//
 | 
						|
//   ACTION_P(Add, n) { return arg0 + n; }
 | 
						|
//
 | 
						|
// will allow you to write:
 | 
						|
//
 | 
						|
//   ...WillOnce(Add(5));
 | 
						|
//
 | 
						|
// Note that you don't need to provide the type of the parameter
 | 
						|
// either.  If you need to reference the type of a parameter named
 | 
						|
// 'foo', you can write 'foo_type'.  For example, in the body of
 | 
						|
// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
 | 
						|
// of 'n'.
 | 
						|
//
 | 
						|
// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P$n to support
 | 
						|
// multi-parameter actions.
 | 
						|
//
 | 
						|
// For the purpose of typing, you can view
 | 
						|
//
 | 
						|
//   ACTION_Pk(Foo, p1, ..., pk) { ... }
 | 
						|
//
 | 
						|
// as shorthand for
 | 
						|
//
 | 
						|
//   template <typename p1_type, ..., typename pk_type>
 | 
						|
//   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
 | 
						|
//
 | 
						|
// In particular, you can provide the template type arguments
 | 
						|
// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
 | 
						|
// although usually you can rely on the compiler to infer the types
 | 
						|
// for you automatically.  You can assign the result of expression
 | 
						|
// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
 | 
						|
// pk_type>.  This can be useful when composing actions.
 | 
						|
//
 | 
						|
// You can also overload actions with different numbers of parameters:
 | 
						|
//
 | 
						|
//   ACTION_P(Plus, a) { ... }
 | 
						|
//   ACTION_P2(Plus, a, b) { ... }
 | 
						|
//
 | 
						|
// While it's tempting to always use the ACTION* macros when defining
 | 
						|
// a new action, you should also consider implementing ActionInterface
 | 
						|
// or using MakePolymorphicAction() instead, especially if you need to
 | 
						|
// use the action a lot.  While these approaches require more work,
 | 
						|
// they give you more control on the types of the mock function
 | 
						|
// arguments and the action parameters, which in general leads to
 | 
						|
// better compiler error messages that pay off in the long run.  They
 | 
						|
// also allow overloading actions based on parameter types (as opposed
 | 
						|
// to just based on the number of parameters).
 | 
						|
//
 | 
						|
// CAVEAT:
 | 
						|
//
 | 
						|
// ACTION*() can only be used in a namespace scope.  The reason is
 | 
						|
// that C++ doesn't yet allow function-local types to be used to
 | 
						|
// instantiate templates.  The up-coming C++0x standard will fix this.
 | 
						|
// Once that's done, we'll consider supporting using ACTION*() inside
 | 
						|
// a function.
 | 
						|
//
 | 
						|
// MORE INFORMATION:
 | 
						|
//
 | 
						|
// To learn more about using these macros, please search for 'ACTION'
 | 
						|
// on http://code.google.com/p/googlemock/wiki/CookBook.
 | 
						|
 | 
						|
$range i 0..n
 | 
						|
$range k 0..n-1
 | 
						|
 | 
						|
// An internal macro needed for implementing ACTION*().
 | 
						|
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
 | 
						|
    const args_type& args GTEST_ATTRIBUTE_UNUSED_
 | 
						|
$for k [[,\
 | 
						|
    arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]]
 | 
						|
 | 
						|
 | 
						|
$for i
 | 
						|
 | 
						|
[[
 | 
						|
$var template = [[$if i==0 [[]] $else [[
 | 
						|
$range j 0..i-1
 | 
						|
 | 
						|
  template <$for j, [[typename p$j##_type]]>\
 | 
						|
]]]]
 | 
						|
$var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]]
 | 
						|
                                                $else [[P$i]]]]]]
 | 
						|
$range j 0..i-1
 | 
						|
$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]
 | 
						|
$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]]
 | 
						|
$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]]
 | 
						|
$var param_field_decls = [[$for j
 | 
						|
[[
 | 
						|
 | 
						|
      p$j##_type p$j;\
 | 
						|
]]]]
 | 
						|
$var param_field_decls2 = [[$for j
 | 
						|
[[
 | 
						|
 | 
						|
    p$j##_type p$j;\
 | 
						|
]]]]
 | 
						|
$var params = [[$for j, [[p$j]]]]
 | 
						|
$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]]
 | 
						|
$var typename_arg_types = [[$for k, [[typename arg$k[[]]_type]]]]
 | 
						|
$var arg_types_and_names = [[$for k, [[arg$k[[]]_type arg$k]]]]
 | 
						|
$var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]]
 | 
						|
                                        $else [[ACTION_P$i]]]]
 | 
						|
 | 
						|
#define $macro_name(name$for j [[, p$j]])\$template
 | 
						|
  class $class_name {\
 | 
						|
   public:\
 | 
						|
    $class_name($ctor_param_list)$inits {}\
 | 
						|
    template <typename F>\
 | 
						|
    class gmock_Impl : public ::testing::ActionInterface<F> {\
 | 
						|
     public:\
 | 
						|
      typedef F function_type;\
 | 
						|
      typedef typename ::testing::internal::Function<F>::Result return_type;\
 | 
						|
      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
 | 
						|
          args_type;\
 | 
						|
      [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\
 | 
						|
      virtual return_type Perform(const args_type& args) {\
 | 
						|
        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
 | 
						|
            Perform(this, args);\
 | 
						|
      }\
 | 
						|
      template <$typename_arg_types>\
 | 
						|
      return_type gmock_PerformImpl(const args_type& args, [[]]
 | 
						|
$arg_types_and_names) const;\$param_field_decls
 | 
						|
    };\
 | 
						|
    template <typename F> operator ::testing::Action<F>() const {\
 | 
						|
      return ::testing::Action<F>(new gmock_Impl<F>($params));\
 | 
						|
    }\$param_field_decls2
 | 
						|
  };\$template
 | 
						|
  inline $class_name$param_types name($param_types_and_names) {\
 | 
						|
    return $class_name$param_types($params);\
 | 
						|
  }\$template
 | 
						|
  template <typename F>\
 | 
						|
  template <$typename_arg_types>\
 | 
						|
  typename ::testing::internal::Function<F>::Result\
 | 
						|
      $class_name$param_types::gmock_Impl<F>::gmock_PerformImpl(\
 | 
						|
          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
 | 
						|
]]
 | 
						|
$$ }  // This meta comment fixes auto-indentation in Emacs.  It won't
 | 
						|
$$    // show up in the generated code.
 | 
						|
 | 
						|
 | 
						|
// TODO(wan@google.com): move the following to a different .h file
 | 
						|
// such that we don't have to run 'pump' every time the code is
 | 
						|
// updated.
 | 
						|
namespace testing {
 | 
						|
 | 
						|
namespace internal {
 | 
						|
 | 
						|
// Saves argument #0 to where the pointer points.
 | 
						|
ACTION_P(SaveArg0, pointer) { *pointer = arg0; }
 | 
						|
 | 
						|
// Assigns 'value' to the variable referenced by argument #0.
 | 
						|
ACTION_P(SetArg0Referee, value) {
 | 
						|
  // Ensures that argument #0 is a reference.  If you get a compiler
 | 
						|
  // error on the next line, you are using SetArgReferee<k>(value) in
 | 
						|
  // a mock function whose k-th (0-based) argument is not a reference.
 | 
						|
  GMOCK_COMPILE_ASSERT_(internal::is_reference<arg0_type>::value,
 | 
						|
                        SetArgReferee_must_be_used_with_a_reference_argument);
 | 
						|
  arg0 = value;
 | 
						|
}
 | 
						|
 | 
						|
// ReturnNewAction<T> creates and returns a new instance of an object each time
 | 
						|
// it is performed. It is overloaded to work with constructors that take
 | 
						|
// different numbers of arguments.
 | 
						|
$range i 0..n
 | 
						|
$for i [[
 | 
						|
$var arity = [[ $if i==0 [[nullary]]
 | 
						|
                $elif i==1 [[unary]]
 | 
						|
                $elif i==2 [[binary]]
 | 
						|
                $elif i==3 [[ternary]]
 | 
						|
                $else [[$i-ary]]]]
 | 
						|
$range j 1..i
 | 
						|
$var typename_As = [[$for j [[, typename A$j]]]]
 | 
						|
$var args_ = [[$for j, [[arg$j[[]]_]]]]
 | 
						|
 | 
						|
// Returns a new instance of T using a $arity constructor with the given
 | 
						|
// arguments.
 | 
						|
template <typename T$typename_As>
 | 
						|
class ReturnNewAction$i {
 | 
						|
 public:
 | 
						|
  $if i==1 [[explicit ]]ReturnNewAction$i($for j, [[A$j a$j]])$if i>0 [[ : ]]
 | 
						|
$for j, [[arg$j[[]]_(a$j)]] {}
 | 
						|
 | 
						|
  template <typename Result, typename ArgumentTuple>
 | 
						|
  Result Perform(const ArgumentTuple& /* args */) {
 | 
						|
    return new T($args_);
 | 
						|
  }
 | 
						|
 private:
 | 
						|
$for j [[
 | 
						|
 | 
						|
  const A$j arg$j[[]]_;
 | 
						|
]]
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
// Deletes the object pointed to by argument #0.
 | 
						|
ACTION(DeleteArg0) { delete arg0; }
 | 
						|
 | 
						|
}  // namespace internal
 | 
						|
 | 
						|
// Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the
 | 
						|
// mock function to *pointer.
 | 
						|
template <int k, typename Pointer>
 | 
						|
inline internal::WithArgsAction<internal::SaveArg0ActionP<Pointer>, k>
 | 
						|
SaveArg(const Pointer& pointer) {
 | 
						|
  return WithArg<k>(internal::SaveArg0(pointer));
 | 
						|
}
 | 
						|
 | 
						|
// Action SetArgReferee<k>(value) assigns 'value' to the variable
 | 
						|
// referenced by the k-th (0-based) argument of the mock function.
 | 
						|
template <int k, typename Value>
 | 
						|
inline internal::WithArgsAction<internal::SetArg0RefereeActionP<Value>, k>
 | 
						|
SetArgReferee(const Value& value) {
 | 
						|
  return WithArg<k>(internal::SetArg0Referee(value));
 | 
						|
}
 | 
						|
 | 
						|
// Various overloads for ReturnNew<T>().
 | 
						|
//
 | 
						|
// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
 | 
						|
// instance of type T, constructed on the heap with constructor arguments
 | 
						|
// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
 | 
						|
$range i 0..n
 | 
						|
$for i [[
 | 
						|
$range j 1..i
 | 
						|
$var typename_As = [[$for j [[, typename A$j]]]]
 | 
						|
$var As = [[$for j [[, A$j]]]]
 | 
						|
$var Aas = [[$for j, [[A$j a$j]]]]
 | 
						|
$var as = [[$for j, [[a$j]]]]
 | 
						|
 | 
						|
template <typename T$typename_As>
 | 
						|
inline PolymorphicAction<internal::ReturnNewAction$i<T$As> >
 | 
						|
ReturnNew($Aas) {
 | 
						|
  return MakePolymorphicAction(
 | 
						|
      internal::ReturnNewAction$i<T$As>($as));
 | 
						|
}
 | 
						|
 | 
						|
]]
 | 
						|
 | 
						|
// Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock
 | 
						|
// function.
 | 
						|
template <int k>
 | 
						|
inline internal::WithArgsAction<internal::DeleteArg0Action, k>
 | 
						|
DeleteArg() {
 | 
						|
  return WithArg<k>(internal::DeleteArg0());
 | 
						|
}
 | 
						|
 | 
						|
// Action Throw(exception) can be used in a mock function of any type
 | 
						|
// to throw the given exception.  Any copyable value can be thrown.
 | 
						|
#if GTEST_HAS_EXCEPTIONS
 | 
						|
ACTION_P(Throw, exception) { throw exception; }
 | 
						|
#endif  // GTEST_HAS_EXCEPTIONS
 | 
						|
 | 
						|
}  // namespace testing
 | 
						|
 | 
						|
#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
 |