test/fmw/gtest/googlemock/include/gmock/gmock-actions.h
author neliasso
Tue, 11 Jun 2019 09:27:51 +0200
changeset 55321 ddda023e6f66
parent 55049 4853b1ceb3d6
permissions -rw-r--r--
8225509: clean_catch_blocks must add preds first Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55049
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     1
// Copyright 2007, Google Inc.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     2
// All rights reserved.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     3
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     4
// Redistribution and use in source and binary forms, with or without
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     5
// modification, are permitted provided that the following conditions are
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     6
// met:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     7
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     8
//     * Redistributions of source code must retain the above copyright
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     9
// notice, this list of conditions and the following disclaimer.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    10
//     * Redistributions in binary form must reproduce the above
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    11
// copyright notice, this list of conditions and the following disclaimer
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    12
// in the documentation and/or other materials provided with the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    13
// distribution.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    14
//     * Neither the name of Google Inc. nor the names of its
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    15
// contributors may be used to endorse or promote products derived from
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    16
// this software without specific prior written permission.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    17
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    29
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    30
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    31
// Google Mock - a framework for writing C++ mock classes.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    32
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    33
// This file implements some commonly used actions.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    34
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    35
// GOOGLETEST_CM0002 DO NOT DELETE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    36
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    37
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    38
#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    39
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    40
#ifndef _WIN32_WCE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    41
# include <errno.h>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    42
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    43
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    44
#include <algorithm>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    45
#include <string>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    46
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    47
#include "gmock/internal/gmock-internal-utils.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    48
#include "gmock/internal/gmock-port.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    49
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    50
#if GTEST_LANG_CXX11  // Defined by gtest-port.h via gmock-port.h.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    51
#include <functional>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    52
#include <type_traits>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    53
#endif  // GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    54
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    55
namespace testing {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    56
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    57
// To implement an action Foo, define:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    58
//   1. a class FooAction that implements the ActionInterface interface, and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    59
//   2. a factory function that creates an Action object from a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    60
//      const FooAction*.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    61
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    62
// The two-level delegation design follows that of Matcher, providing
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    63
// consistency for extension developers.  It also eases ownership
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    64
// management as Action objects can now be copied like plain values.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    65
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    66
namespace internal {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    67
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    68
template <typename F1, typename F2>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    69
class ActionAdaptor;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    70
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    71
// BuiltInDefaultValueGetter<T, true>::Get() returns a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    72
// default-constructed T value.  BuiltInDefaultValueGetter<T,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    73
// false>::Get() crashes with an error.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    74
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    75
// This primary template is used when kDefaultConstructible is true.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    76
template <typename T, bool kDefaultConstructible>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    77
struct BuiltInDefaultValueGetter {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    78
  static T Get() { return T(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    79
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    80
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    81
struct BuiltInDefaultValueGetter<T, false> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    82
  static T Get() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    83
    Assert(false, __FILE__, __LINE__,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    84
           "Default action undefined for the function return type.");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    85
    return internal::Invalid<T>();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    86
    // The above statement will never be reached, but is required in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    87
    // order for this function to compile.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    88
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    89
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    90
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    91
// BuiltInDefaultValue<T>::Get() returns the "built-in" default value
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    92
// for type T, which is NULL when T is a raw pointer type, 0 when T is
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    93
// a numeric type, false when T is bool, or "" when T is string or
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    94
// std::string.  In addition, in C++11 and above, it turns a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    95
// default-constructed T value if T is default constructible.  For any
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    96
// other type T, the built-in default T value is undefined, and the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    97
// function will abort the process.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    98
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    99
class BuiltInDefaultValue {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   100
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   101
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   102
  // This function returns true iff type T has a built-in default value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   103
  static bool Exists() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   104
    return ::std::is_default_constructible<T>::value;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   105
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   106
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   107
  static T Get() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   108
    return BuiltInDefaultValueGetter<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   109
        T, ::std::is_default_constructible<T>::value>::Get();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   110
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   111
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   112
#else  // GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   113
  // This function returns true iff type T has a built-in default value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   114
  static bool Exists() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   115
    return false;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   116
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   117
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   118
  static T Get() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   119
    return BuiltInDefaultValueGetter<T, false>::Get();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   120
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   121
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   122
#endif  // GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   123
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   124
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   125
// This partial specialization says that we use the same built-in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   126
// default value for T and const T.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   127
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   128
class BuiltInDefaultValue<const T> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   129
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   130
  static bool Exists() { return BuiltInDefaultValue<T>::Exists(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   131
  static T Get() { return BuiltInDefaultValue<T>::Get(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   132
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   133
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   134
// This partial specialization defines the default values for pointer
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   135
// types.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   136
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   137
class BuiltInDefaultValue<T*> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   138
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   139
  static bool Exists() { return true; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   140
  static T* Get() { return NULL; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   141
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   142
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   143
// The following specializations define the default values for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   144
// specific types we care about.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   145
#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   146
  template <> \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   147
  class BuiltInDefaultValue<type> { \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   148
   public: \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   149
    static bool Exists() { return true; } \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   150
    static type Get() { return value; } \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   151
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   152
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   153
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, );  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   154
#if GTEST_HAS_GLOBAL_STRING
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   155
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, "");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   156
#endif  // GTEST_HAS_GLOBAL_STRING
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   157
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, "");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   158
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   159
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0');
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   160
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0');
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   161
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0');
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   162
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   163
// There's no need for a default action for signed wchar_t, as that
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   164
// type is the same as wchar_t for gcc, and invalid for MSVC.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   165
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   166
// There's also no need for a default action for unsigned wchar_t, as
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   167
// that type is the same as unsigned int for gcc, and invalid for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   168
// MSVC.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   169
#if GMOCK_WCHAR_T_IS_NATIVE_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   170
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U);  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   171
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   172
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   173
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U);  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   174
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0);     // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   175
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   176
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   177
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL);  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   178
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L);     // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   179
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   180
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   181
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   182
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   183
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   184
#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   185
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   186
}  // namespace internal
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   187
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   188
// When an unexpected function call is encountered, Google Mock will
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   189
// let it return a default value if the user has specified one for its
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   190
// return type, or if the return type has a built-in default value;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   191
// otherwise Google Mock won't know what value to return and will have
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   192
// to abort the process.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   193
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   194
// The DefaultValue<T> class allows a user to specify the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   195
// default value for a type T that is both copyable and publicly
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   196
// destructible (i.e. anything that can be used as a function return
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   197
// type).  The usage is:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   198
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   199
//   // Sets the default value for type T to be foo.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   200
//   DefaultValue<T>::Set(foo);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   201
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   202
class DefaultValue {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   203
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   204
  // Sets the default value for type T; requires T to be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   205
  // copy-constructable and have a public destructor.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   206
  static void Set(T x) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   207
    delete producer_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   208
    producer_ = new FixedValueProducer(x);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   209
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   210
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   211
  // Provides a factory function to be called to generate the default value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   212
  // This method can be used even if T is only move-constructible, but it is not
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   213
  // limited to that case.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   214
  typedef T (*FactoryFunction)();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   215
  static void SetFactory(FactoryFunction factory) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   216
    delete producer_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   217
    producer_ = new FactoryValueProducer(factory);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   218
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   219
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   220
  // Unsets the default value for type T.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   221
  static void Clear() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   222
    delete producer_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   223
    producer_ = NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   224
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   225
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   226
  // Returns true iff the user has set the default value for type T.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   227
  static bool IsSet() { return producer_ != NULL; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   228
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   229
  // Returns true if T has a default return value set by the user or there
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   230
  // exists a built-in default value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   231
  static bool Exists() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   232
    return IsSet() || internal::BuiltInDefaultValue<T>::Exists();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   233
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   234
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   235
  // Returns the default value for type T if the user has set one;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   236
  // otherwise returns the built-in default value. Requires that Exists()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   237
  // is true, which ensures that the return value is well-defined.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   238
  static T Get() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   239
    return producer_ == NULL ?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   240
        internal::BuiltInDefaultValue<T>::Get() : producer_->Produce();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   241
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   242
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   243
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   244
  class ValueProducer {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   245
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   246
    virtual ~ValueProducer() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   247
    virtual T Produce() = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   248
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   249
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   250
  class FixedValueProducer : public ValueProducer {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   251
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   252
    explicit FixedValueProducer(T value) : value_(value) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   253
    virtual T Produce() { return value_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   254
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   255
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   256
    const T value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   257
    GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   258
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   259
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   260
  class FactoryValueProducer : public ValueProducer {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   261
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   262
    explicit FactoryValueProducer(FactoryFunction factory)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   263
        : factory_(factory) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   264
    virtual T Produce() { return factory_(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   265
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   266
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   267
    const FactoryFunction factory_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   268
    GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   269
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   270
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   271
  static ValueProducer* producer_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   272
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   273
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   274
// This partial specialization allows a user to set default values for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   275
// reference types.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   276
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   277
class DefaultValue<T&> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   278
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   279
  // Sets the default value for type T&.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   280
  static void Set(T& x) {  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   281
    address_ = &x;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   282
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   283
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   284
  // Unsets the default value for type T&.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   285
  static void Clear() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   286
    address_ = NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   287
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   288
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   289
  // Returns true iff the user has set the default value for type T&.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   290
  static bool IsSet() { return address_ != NULL; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   291
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   292
  // Returns true if T has a default return value set by the user or there
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   293
  // exists a built-in default value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   294
  static bool Exists() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   295
    return IsSet() || internal::BuiltInDefaultValue<T&>::Exists();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   296
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   297
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   298
  // Returns the default value for type T& if the user has set one;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   299
  // otherwise returns the built-in default value if there is one;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   300
  // otherwise aborts the process.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   301
  static T& Get() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   302
    return address_ == NULL ?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   303
        internal::BuiltInDefaultValue<T&>::Get() : *address_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   304
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   305
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   306
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   307
  static T* address_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   308
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   309
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   310
// This specialization allows DefaultValue<void>::Get() to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   311
// compile.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   312
template <>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   313
class DefaultValue<void> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   314
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   315
  static bool Exists() { return true; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   316
  static void Get() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   317
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   318
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   319
// Points to the user-set default value for type T.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   320
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   321
typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   322
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   323
// Points to the user-set default value for type T&.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   324
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   325
T* DefaultValue<T&>::address_ = NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   326
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   327
// Implement this interface to define an action for function type F.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   328
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   329
class ActionInterface {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   330
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   331
  typedef typename internal::Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   332
  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   333
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   334
  ActionInterface() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   335
  virtual ~ActionInterface() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   336
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   337
  // Performs the action.  This method is not const, as in general an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   338
  // action can have side effects and be stateful.  For example, a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   339
  // get-the-next-element-from-the-collection action will need to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   340
  // remember the current element.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   341
  virtual Result Perform(const ArgumentTuple& args) = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   342
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   343
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   344
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   345
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   346
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   347
// An Action<F> is a copyable and IMMUTABLE (except by assignment)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   348
// object that represents an action to be taken when a mock function
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   349
// of type F is called.  The implementation of Action<T> is just a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   350
// linked_ptr to const ActionInterface<T>, so copying is fairly cheap.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   351
// Don't inherit from Action!
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   352
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   353
// You can view an object implementing ActionInterface<F> as a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   354
// concrete action (including its current state), and an Action<F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   355
// object as a handle to it.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   356
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   357
class Action {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   358
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   359
  typedef typename internal::Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   360
  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   361
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   362
  // Constructs a null Action.  Needed for storing Action objects in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   363
  // STL containers.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   364
  Action() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   365
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   366
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   367
  // Construct an Action from a specified callable.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   368
  // This cannot take std::function directly, because then Action would not be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   369
  // directly constructible from lambda (it would require two conversions).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   370
  template <typename G,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   371
            typename = typename ::std::enable_if<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   372
                ::std::is_constructible<::std::function<F>, G>::value>::type>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   373
  Action(G&& fun) : fun_(::std::forward<G>(fun)) {}  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   374
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   375
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   376
  // Constructs an Action from its implementation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   377
  explicit Action(ActionInterface<F>* impl) : impl_(impl) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   378
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   379
  // This constructor allows us to turn an Action<Func> object into an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   380
  // Action<F>, as long as F's arguments can be implicitly converted
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   381
  // to Func's and Func's return type can be implicitly converted to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   382
  // F's.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   383
  template <typename Func>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   384
  explicit Action(const Action<Func>& action);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   385
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   386
  // Returns true iff this is the DoDefault() action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   387
  bool IsDoDefault() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   388
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   389
    return impl_ == nullptr && fun_ == nullptr;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   390
#else
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   391
    return impl_ == NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   392
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   393
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   394
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   395
  // Performs the action.  Note that this method is const even though
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   396
  // the corresponding method in ActionInterface is not.  The reason
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   397
  // is that a const Action<F> means that it cannot be re-bound to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   398
  // another concrete action, not that the concrete action it binds to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   399
  // cannot change state.  (Think of the difference between a const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   400
  // pointer and a pointer to const.)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   401
  Result Perform(ArgumentTuple args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   402
    if (IsDoDefault()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   403
      internal::IllegalDoDefault(__FILE__, __LINE__);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   404
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   405
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   406
    if (fun_ != nullptr) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   407
      return internal::Apply(fun_, ::std::move(args));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   408
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   409
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   410
    return impl_->Perform(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   411
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   412
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   413
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   414
  template <typename F1, typename F2>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   415
  friend class internal::ActionAdaptor;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   416
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   417
  template <typename G>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   418
  friend class Action;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   419
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   420
  // In C++11, Action can be implemented either as a generic functor (through
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   421
  // std::function), or legacy ActionInterface. In C++98, only ActionInterface
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   422
  // is available. The invariants are as follows:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   423
  // * in C++98, impl_ is null iff this is the default action
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   424
  // * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   425
  //   this is the default action
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   426
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   427
  ::std::function<F> fun_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   428
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   429
  internal::linked_ptr<ActionInterface<F> > impl_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   430
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   431
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   432
// The PolymorphicAction class template makes it easy to implement a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   433
// polymorphic action (i.e. an action that can be used in mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   434
// functions of than one type, e.g. Return()).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   435
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   436
// To define a polymorphic action, a user first provides a COPYABLE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   437
// implementation class that has a Perform() method template:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   438
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   439
//   class FooAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   440
//    public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   441
//     template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   442
//     Result Perform(const ArgumentTuple& args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   443
//       // Processes the arguments and returns a result, using
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   444
//       // tr1::get<N>(args) to get the N-th (0-based) argument in the tuple.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   445
//     }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   446
//     ...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   447
//   };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   448
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   449
// Then the user creates the polymorphic action using
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   450
// MakePolymorphicAction(object) where object has type FooAction.  See
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   451
// the definition of Return(void) and SetArgumentPointee<N>(value) for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   452
// complete examples.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   453
template <typename Impl>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   454
class PolymorphicAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   455
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   456
  explicit PolymorphicAction(const Impl& impl) : impl_(impl) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   457
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   458
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   459
  operator Action<F>() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   460
    return Action<F>(new MonomorphicImpl<F>(impl_));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   461
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   462
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   463
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   464
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   465
  class MonomorphicImpl : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   466
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   467
    typedef typename internal::Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   468
    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   469
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   470
    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   471
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   472
    virtual Result Perform(const ArgumentTuple& args) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   473
      return impl_.template Perform<Result>(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   474
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   475
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   476
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   477
    Impl impl_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   478
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   479
    GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   480
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   481
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   482
  Impl impl_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   483
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   484
  GTEST_DISALLOW_ASSIGN_(PolymorphicAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   485
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   486
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   487
// Creates an Action from its implementation and returns it.  The
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   488
// created Action object owns the implementation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   489
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   490
Action<F> MakeAction(ActionInterface<F>* impl) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   491
  return Action<F>(impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   492
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   493
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   494
// Creates a polymorphic action from its implementation.  This is
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   495
// easier to use than the PolymorphicAction<Impl> constructor as it
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   496
// doesn't require you to explicitly write the template argument, e.g.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   497
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   498
//   MakePolymorphicAction(foo);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   499
// vs
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   500
//   PolymorphicAction<TypeOfFoo>(foo);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   501
template <typename Impl>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   502
inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   503
  return PolymorphicAction<Impl>(impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   504
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   505
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   506
namespace internal {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   507
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   508
// Allows an Action<F2> object to pose as an Action<F1>, as long as F2
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   509
// and F1 are compatible.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   510
template <typename F1, typename F2>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   511
class ActionAdaptor : public ActionInterface<F1> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   512
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   513
  typedef typename internal::Function<F1>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   514
  typedef typename internal::Function<F1>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   515
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   516
  explicit ActionAdaptor(const Action<F2>& from) : impl_(from.impl_) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   517
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   518
  virtual Result Perform(const ArgumentTuple& args) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   519
    return impl_->Perform(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   520
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   521
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   522
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   523
  const internal::linked_ptr<ActionInterface<F2> > impl_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   524
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   525
  GTEST_DISALLOW_ASSIGN_(ActionAdaptor);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   526
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   527
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   528
// Helper struct to specialize ReturnAction to execute a move instead of a copy
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   529
// on return. Useful for move-only types, but could be used on any type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   530
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   531
struct ByMoveWrapper {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   532
  explicit ByMoveWrapper(T value) : payload(internal::move(value)) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   533
  T payload;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   534
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   535
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   536
// Implements the polymorphic Return(x) action, which can be used in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   537
// any function that returns the type of x, regardless of the argument
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   538
// types.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   539
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   540
// Note: The value passed into Return must be converted into
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   541
// Function<F>::Result when this action is cast to Action<F> rather than
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   542
// when that action is performed. This is important in scenarios like
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   543
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   544
// MOCK_METHOD1(Method, T(U));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   545
// ...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   546
// {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   547
//   Foo foo;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   548
//   X x(&foo);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   549
//   EXPECT_CALL(mock, Method(_)).WillOnce(Return(x));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   550
// }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   551
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   552
// In the example above the variable x holds reference to foo which leaves
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   553
// scope and gets destroyed.  If copying X just copies a reference to foo,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   554
// that copy will be left with a hanging reference.  If conversion to T
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   555
// makes a copy of foo, the above code is safe. To support that scenario, we
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   556
// need to make sure that the type conversion happens inside the EXPECT_CALL
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   557
// statement, and conversion of the result of Return to Action<T(U)> is a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   558
// good place for that.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   559
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   560
// The real life example of the above scenario happens when an invocation
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   561
// of gtl::Container() is passed into Return.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   562
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   563
template <typename R>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   564
class ReturnAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   565
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   566
  // Constructs a ReturnAction object from the value to be returned.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   567
  // 'value' is passed by value instead of by const reference in order
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   568
  // to allow Return("string literal") to compile.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   569
  explicit ReturnAction(R value) : value_(new R(internal::move(value))) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   570
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   571
  // This template type conversion operator allows Return(x) to be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   572
  // used in ANY function that returns x's type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   573
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   574
  operator Action<F>() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   575
    // Assert statement belongs here because this is the best place to verify
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   576
    // conditions on F. It produces the clearest error messages
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   577
    // in most compilers.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   578
    // Impl really belongs in this scope as a local class but can't
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   579
    // because MSVC produces duplicate symbols in different translation units
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   580
    // in this case. Until MS fixes that bug we put Impl into the class scope
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   581
    // and put the typedef both here (for use in assert statement) and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   582
    // in the Impl class. But both definitions must be the same.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   583
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   584
    GTEST_COMPILE_ASSERT_(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   585
        !is_reference<Result>::value,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   586
        use_ReturnRef_instead_of_Return_to_return_a_reference);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   587
    return Action<F>(new Impl<R, F>(value_));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   588
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   589
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   590
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   591
  // Implements the Return(x) action for a particular function type F.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   592
  template <typename R_, typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   593
  class Impl : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   594
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   595
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   596
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   597
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   598
    // The implicit cast is necessary when Result has more than one
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   599
    // single-argument constructor (e.g. Result is std::vector<int>) and R
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   600
    // has a type conversion operator template.  In that case, value_(value)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   601
    // won't compile as the compiler doesn't known which constructor of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   602
    // Result to call.  ImplicitCast_ forces the compiler to convert R to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   603
    // Result without considering explicit constructors, thus resolving the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   604
    // ambiguity. value_ is then initialized using its copy constructor.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   605
    explicit Impl(const linked_ptr<R>& value)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   606
        : value_before_cast_(*value),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   607
          value_(ImplicitCast_<Result>(value_before_cast_)) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   608
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   609
    virtual Result Perform(const ArgumentTuple&) { return value_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   610
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   611
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   612
    GTEST_COMPILE_ASSERT_(!is_reference<Result>::value,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   613
                          Result_cannot_be_a_reference_type);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   614
    // We save the value before casting just in case it is being cast to a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   615
    // wrapper type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   616
    R value_before_cast_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   617
    Result value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   618
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   619
    GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   620
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   621
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   622
  // Partially specialize for ByMoveWrapper. This version of ReturnAction will
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   623
  // move its contents instead.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   624
  template <typename R_, typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   625
  class Impl<ByMoveWrapper<R_>, F> : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   626
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   627
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   628
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   629
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   630
    explicit Impl(const linked_ptr<R>& wrapper)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   631
        : performed_(false), wrapper_(wrapper) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   632
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   633
    virtual Result Perform(const ArgumentTuple&) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   634
      GTEST_CHECK_(!performed_)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   635
          << "A ByMove() action should only be performed once.";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   636
      performed_ = true;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   637
      return internal::move(wrapper_->payload);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   638
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   639
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   640
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   641
    bool performed_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   642
    const linked_ptr<R> wrapper_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   643
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   644
    GTEST_DISALLOW_ASSIGN_(Impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   645
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   646
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   647
  const linked_ptr<R> value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   648
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   649
  GTEST_DISALLOW_ASSIGN_(ReturnAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   650
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   651
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   652
// Implements the ReturnNull() action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   653
class ReturnNullAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   654
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   655
  // Allows ReturnNull() to be used in any pointer-returning function. In C++11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   656
  // this is enforced by returning nullptr, and in non-C++11 by asserting a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   657
  // pointer type on compile time.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   658
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   659
  static Result Perform(const ArgumentTuple&) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   660
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   661
    return nullptr;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   662
#else
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   663
    GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   664
                          ReturnNull_can_be_used_to_return_a_pointer_only);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   665
    return NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   666
#endif  // GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   667
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   668
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   669
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   670
// Implements the Return() action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   671
class ReturnVoidAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   672
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   673
  // Allows Return() to be used in any void-returning function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   674
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   675
  static void Perform(const ArgumentTuple&) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   676
    CompileAssertTypesEqual<void, Result>();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   677
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   678
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   679
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   680
// Implements the polymorphic ReturnRef(x) action, which can be used
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   681
// in any function that returns a reference to the type of x,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   682
// regardless of the argument types.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   683
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   684
class ReturnRefAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   685
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   686
  // Constructs a ReturnRefAction object from the reference to be returned.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   687
  explicit ReturnRefAction(T& ref) : ref_(ref) {}  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   688
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   689
  // This template type conversion operator allows ReturnRef(x) to be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   690
  // used in ANY function that returns a reference to x's type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   691
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   692
  operator Action<F>() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   693
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   694
    // Asserts that the function return type is a reference.  This
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   695
    // catches the user error of using ReturnRef(x) when Return(x)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   696
    // should be used, and generates some helpful error message.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   697
    GTEST_COMPILE_ASSERT_(internal::is_reference<Result>::value,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   698
                          use_Return_instead_of_ReturnRef_to_return_a_value);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   699
    return Action<F>(new Impl<F>(ref_));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   700
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   701
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   702
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   703
  // Implements the ReturnRef(x) action for a particular function type F.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   704
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   705
  class Impl : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   706
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   707
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   708
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   709
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   710
    explicit Impl(T& ref) : ref_(ref) {}  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   711
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   712
    virtual Result Perform(const ArgumentTuple&) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   713
      return ref_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   714
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   715
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   716
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   717
    T& ref_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   718
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   719
    GTEST_DISALLOW_ASSIGN_(Impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   720
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   721
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   722
  T& ref_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   723
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   724
  GTEST_DISALLOW_ASSIGN_(ReturnRefAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   725
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   726
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   727
// Implements the polymorphic ReturnRefOfCopy(x) action, which can be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   728
// used in any function that returns a reference to the type of x,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   729
// regardless of the argument types.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   730
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   731
class ReturnRefOfCopyAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   732
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   733
  // Constructs a ReturnRefOfCopyAction object from the reference to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   734
  // be returned.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   735
  explicit ReturnRefOfCopyAction(const T& value) : value_(value) {}  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   736
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   737
  // This template type conversion operator allows ReturnRefOfCopy(x) to be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   738
  // used in ANY function that returns a reference to x's type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   739
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   740
  operator Action<F>() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   741
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   742
    // Asserts that the function return type is a reference.  This
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   743
    // catches the user error of using ReturnRefOfCopy(x) when Return(x)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   744
    // should be used, and generates some helpful error message.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   745
    GTEST_COMPILE_ASSERT_(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   746
        internal::is_reference<Result>::value,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   747
        use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   748
    return Action<F>(new Impl<F>(value_));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   749
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   750
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   751
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   752
  // Implements the ReturnRefOfCopy(x) action for a particular function type F.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   753
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   754
  class Impl : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   755
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   756
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   757
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   758
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   759
    explicit Impl(const T& value) : value_(value) {}  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   760
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   761
    virtual Result Perform(const ArgumentTuple&) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   762
      return value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   763
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   764
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   765
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   766
    T value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   767
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   768
    GTEST_DISALLOW_ASSIGN_(Impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   769
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   770
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   771
  const T value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   772
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   773
  GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   774
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   775
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   776
// Implements the polymorphic DoDefault() action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   777
class DoDefaultAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   778
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   779
  // This template type conversion operator allows DoDefault() to be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   780
  // used in any function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   781
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   782
  operator Action<F>() const { return Action<F>(); }  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   783
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   784
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   785
// Implements the Assign action to set a given pointer referent to a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   786
// particular value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   787
template <typename T1, typename T2>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   788
class AssignAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   789
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   790
  AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   791
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   792
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   793
  void Perform(const ArgumentTuple& /* args */) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   794
    *ptr_ = value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   795
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   796
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   797
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   798
  T1* const ptr_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   799
  const T2 value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   800
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   801
  GTEST_DISALLOW_ASSIGN_(AssignAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   802
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   803
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   804
#if !GTEST_OS_WINDOWS_MOBILE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   805
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   806
// Implements the SetErrnoAndReturn action to simulate return from
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   807
// various system calls and libc functions.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   808
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   809
class SetErrnoAndReturnAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   810
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   811
  SetErrnoAndReturnAction(int errno_value, T result)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   812
      : errno_(errno_value),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   813
        result_(result) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   814
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   815
  Result Perform(const ArgumentTuple& /* args */) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   816
    errno = errno_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   817
    return result_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   818
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   819
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   820
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   821
  const int errno_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   822
  const T result_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   823
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   824
  GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   825
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   826
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   827
#endif  // !GTEST_OS_WINDOWS_MOBILE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   828
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   829
// Implements the SetArgumentPointee<N>(x) action for any function
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   830
// whose N-th argument (0-based) is a pointer to x's type.  The
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   831
// template parameter kIsProto is true iff type A is ProtocolMessage,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   832
// proto2::Message, or a sub-class of those.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   833
template <size_t N, typename A, bool kIsProto>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   834
class SetArgumentPointeeAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   835
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   836
  // Constructs an action that sets the variable pointed to by the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   837
  // N-th function argument to 'value'.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   838
  explicit SetArgumentPointeeAction(const A& value) : value_(value) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   839
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   840
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   841
  void Perform(const ArgumentTuple& args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   842
    CompileAssertTypesEqual<void, Result>();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   843
    *::testing::get<N>(args) = value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   844
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   845
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   846
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   847
  const A value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   848
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   849
  GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   850
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   851
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   852
template <size_t N, typename Proto>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   853
class SetArgumentPointeeAction<N, Proto, true> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   854
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   855
  // Constructs an action that sets the variable pointed to by the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   856
  // N-th function argument to 'proto'.  Both ProtocolMessage and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   857
  // proto2::Message have the CopyFrom() method, so the same
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   858
  // implementation works for both.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   859
  explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   860
    proto_->CopyFrom(proto);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   861
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   862
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   863
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   864
  void Perform(const ArgumentTuple& args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   865
    CompileAssertTypesEqual<void, Result>();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   866
    ::testing::get<N>(args)->CopyFrom(*proto_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   867
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   868
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   869
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   870
  const internal::linked_ptr<Proto> proto_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   871
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   872
  GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   873
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   874
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   875
// Implements the InvokeWithoutArgs(f) action.  The template argument
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   876
// FunctionImpl is the implementation type of f, which can be either a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   877
// function pointer or a functor.  InvokeWithoutArgs(f) can be used as an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   878
// Action<F> as long as f's type is compatible with F (i.e. f can be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   879
// assigned to a tr1::function<F>).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   880
template <typename FunctionImpl>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   881
class InvokeWithoutArgsAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   882
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   883
  // The c'tor makes a copy of function_impl (either a function
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   884
  // pointer or a functor).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   885
  explicit InvokeWithoutArgsAction(FunctionImpl function_impl)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   886
      : function_impl_(function_impl) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   887
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   888
  // Allows InvokeWithoutArgs(f) to be used as any action whose type is
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   889
  // compatible with f.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   890
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   891
  Result Perform(const ArgumentTuple&) { return function_impl_(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   892
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   893
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   894
  FunctionImpl function_impl_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   895
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   896
  GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   897
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   898
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   899
// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   900
template <class Class, typename MethodPtr>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   901
class InvokeMethodWithoutArgsAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   902
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   903
  InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   904
      : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   905
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   906
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   907
  Result Perform(const ArgumentTuple&) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   908
    return (obj_ptr_->*method_ptr_)();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   909
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   910
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   911
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   912
  Class* const obj_ptr_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   913
  const MethodPtr method_ptr_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   914
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   915
  GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   916
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   917
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   918
// Implements the InvokeWithoutArgs(callback) action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   919
template <typename CallbackType>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   920
class InvokeCallbackWithoutArgsAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   921
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   922
  // The c'tor takes ownership of the callback.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   923
  explicit InvokeCallbackWithoutArgsAction(CallbackType* callback)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   924
      : callback_(callback) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   925
    callback->CheckIsRepeatable();  // Makes sure the callback is permanent.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   926
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   927
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   928
  // This type conversion operator template allows Invoke(callback) to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   929
  // be used wherever the callback's return type can be implicitly
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   930
  // converted to that of the mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   931
  template <typename Result, typename ArgumentTuple>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   932
  Result Perform(const ArgumentTuple&) const { return callback_->Run(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   933
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   934
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   935
  const internal::linked_ptr<CallbackType> callback_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   936
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   937
  GTEST_DISALLOW_ASSIGN_(InvokeCallbackWithoutArgsAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   938
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   939
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   940
// Implements the IgnoreResult(action) action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   941
template <typename A>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   942
class IgnoreResultAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   943
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   944
  explicit IgnoreResultAction(const A& action) : action_(action) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   945
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   946
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   947
  operator Action<F>() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   948
    // Assert statement belongs here because this is the best place to verify
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   949
    // conditions on F. It produces the clearest error messages
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   950
    // in most compilers.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   951
    // Impl really belongs in this scope as a local class but can't
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   952
    // because MSVC produces duplicate symbols in different translation units
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   953
    // in this case. Until MS fixes that bug we put Impl into the class scope
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   954
    // and put the typedef both here (for use in assert statement) and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   955
    // in the Impl class. But both definitions must be the same.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   956
    typedef typename internal::Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   957
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   958
    // Asserts at compile time that F returns void.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   959
    CompileAssertTypesEqual<void, Result>();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   960
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   961
    return Action<F>(new Impl<F>(action_));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   962
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   963
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   964
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   965
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   966
  class Impl : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   967
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   968
    typedef typename internal::Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   969
    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   970
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   971
    explicit Impl(const A& action) : action_(action) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   972
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   973
    virtual void Perform(const ArgumentTuple& args) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   974
      // Performs the action and ignores its result.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   975
      action_.Perform(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   976
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   977
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   978
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   979
    // Type OriginalFunction is the same as F except that its return
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   980
    // type is IgnoredValue.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   981
    typedef typename internal::Function<F>::MakeResultIgnoredValue
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   982
        OriginalFunction;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   983
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   984
    const Action<OriginalFunction> action_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   985
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   986
    GTEST_DISALLOW_ASSIGN_(Impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   987
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   988
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   989
  const A action_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   990
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   991
  GTEST_DISALLOW_ASSIGN_(IgnoreResultAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   992
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   993
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   994
// A ReferenceWrapper<T> object represents a reference to type T,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   995
// which can be either const or not.  It can be explicitly converted
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   996
// from, and implicitly converted to, a T&.  Unlike a reference,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   997
// ReferenceWrapper<T> can be copied and can survive template type
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   998
// inference.  This is used to support by-reference arguments in the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   999
// InvokeArgument<N>(...) action.  The idea was from "reference
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1000
// wrappers" in tr1, which we don't have in our source tree yet.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1001
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1002
class ReferenceWrapper {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1003
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1004
  // Constructs a ReferenceWrapper<T> object from a T&.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1005
  explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {}  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1006
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1007
  // Allows a ReferenceWrapper<T> object to be implicitly converted to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1008
  // a T&.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1009
  operator T&() const { return *pointer_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1010
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1011
  T* pointer_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1012
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1013
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1014
// Allows the expression ByRef(x) to be printed as a reference to x.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1015
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1016
void PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1017
  T& value = ref;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1018
  UniversalPrinter<T&>::Print(value, os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1019
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1020
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1021
// Does two actions sequentially.  Used for implementing the DoAll(a1,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1022
// a2, ...) action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1023
template <typename Action1, typename Action2>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1024
class DoBothAction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1025
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1026
  DoBothAction(Action1 action1, Action2 action2)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1027
      : action1_(action1), action2_(action2) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1028
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1029
  // This template type conversion operator allows DoAll(a1, ..., a_n)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1030
  // to be used in ANY function of compatible type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1031
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1032
  operator Action<F>() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1033
    return Action<F>(new Impl<F>(action1_, action2_));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1034
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1035
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1036
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1037
  // Implements the DoAll(...) action for a particular function type F.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1038
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1039
  class Impl : public ActionInterface<F> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1040
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1041
    typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1042
    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1043
    typedef typename Function<F>::MakeResultVoid VoidResult;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1044
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1045
    Impl(const Action<VoidResult>& action1, const Action<F>& action2)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1046
        : action1_(action1), action2_(action2) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1047
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1048
    virtual Result Perform(const ArgumentTuple& args) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1049
      action1_.Perform(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1050
      return action2_.Perform(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1051
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1052
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1053
   private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1054
    const Action<VoidResult> action1_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1055
    const Action<F> action2_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1056
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1057
    GTEST_DISALLOW_ASSIGN_(Impl);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1058
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1059
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1060
  Action1 action1_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1061
  Action2 action2_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1062
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1063
  GTEST_DISALLOW_ASSIGN_(DoBothAction);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1064
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1065
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1066
}  // namespace internal
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1067
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1068
// An Unused object can be implicitly constructed from ANY value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1069
// This is handy when defining actions that ignore some or all of the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1070
// mock function arguments.  For example, given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1071
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1072
//   MOCK_METHOD3(Foo, double(const string& label, double x, double y));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1073
//   MOCK_METHOD3(Bar, double(int index, double x, double y));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1074
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1075
// instead of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1076
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1077
//   double DistanceToOriginWithLabel(const string& label, double x, double y) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1078
//     return sqrt(x*x + y*y);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1079
//   }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1080
//   double DistanceToOriginWithIndex(int index, double x, double y) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1081
//     return sqrt(x*x + y*y);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1082
//   }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1083
//   ...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1084
//   EXPECT_CALL(mock, Foo("abc", _, _))
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1085
//       .WillOnce(Invoke(DistanceToOriginWithLabel));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1086
//   EXPECT_CALL(mock, Bar(5, _, _))
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1087
//       .WillOnce(Invoke(DistanceToOriginWithIndex));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1088
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1089
// you could write
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1090
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1091
//   // We can declare any uninteresting argument as Unused.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1092
//   double DistanceToOrigin(Unused, double x, double y) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1093
//     return sqrt(x*x + y*y);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1094
//   }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1095
//   ...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1096
//   EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1097
//   EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1098
typedef internal::IgnoredValue Unused;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1099
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1100
// This constructor allows us to turn an Action<From> object into an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1101
// Action<To>, as long as To's arguments can be implicitly converted
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1102
// to From's and From's return type cann be implicitly converted to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1103
// To's.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1104
template <typename To>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1105
template <typename From>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1106
Action<To>::Action(const Action<From>& from)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1107
    :
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1108
#if GTEST_LANG_CXX11
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1109
      fun_(from.fun_),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1110
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1111
      impl_(from.impl_ == NULL ? NULL
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1112
                               : new internal::ActionAdaptor<To, From>(from)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1113
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1114
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1115
// Creates an action that returns 'value'.  'value' is passed by value
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1116
// instead of const reference - otherwise Return("string literal")
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1117
// will trigger a compiler error about using array as initializer.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1118
template <typename R>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1119
internal::ReturnAction<R> Return(R value) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1120
  return internal::ReturnAction<R>(internal::move(value));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1121
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1122
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1123
// Creates an action that returns NULL.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1124
inline PolymorphicAction<internal::ReturnNullAction> ReturnNull() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1125
  return MakePolymorphicAction(internal::ReturnNullAction());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1126
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1127
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1128
// Creates an action that returns from a void function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1129
inline PolymorphicAction<internal::ReturnVoidAction> Return() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1130
  return MakePolymorphicAction(internal::ReturnVoidAction());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1131
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1132
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1133
// Creates an action that returns the reference to a variable.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1134
template <typename R>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1135
inline internal::ReturnRefAction<R> ReturnRef(R& x) {  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1136
  return internal::ReturnRefAction<R>(x);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1137
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1138
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1139
// Creates an action that returns the reference to a copy of the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1140
// argument.  The copy is created when the action is constructed and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1141
// lives as long as the action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1142
template <typename R>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1143
inline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1144
  return internal::ReturnRefOfCopyAction<R>(x);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1145
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1146
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1147
// Modifies the parent action (a Return() action) to perform a move of the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1148
// argument instead of a copy.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1149
// Return(ByMove()) actions can only be executed once and will assert this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1150
// invariant.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1151
template <typename R>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1152
internal::ByMoveWrapper<R> ByMove(R x) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1153
  return internal::ByMoveWrapper<R>(internal::move(x));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1154
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1155
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1156
// Creates an action that does the default action for the give mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1157
inline internal::DoDefaultAction DoDefault() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1158
  return internal::DoDefaultAction();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1159
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1160
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1161
// Creates an action that sets the variable pointed by the N-th
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1162
// (0-based) function argument to 'value'.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1163
template <size_t N, typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1164
PolymorphicAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1165
  internal::SetArgumentPointeeAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1166
    N, T, internal::IsAProtocolMessage<T>::value> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1167
SetArgPointee(const T& x) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1168
  return MakePolymorphicAction(internal::SetArgumentPointeeAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1169
      N, T, internal::IsAProtocolMessage<T>::value>(x));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1170
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1171
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1172
#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1173
// This overload allows SetArgPointee() to accept a string literal.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1174
// GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1175
// this overload from the templated version and emit a compile error.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1176
template <size_t N>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1177
PolymorphicAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1178
  internal::SetArgumentPointeeAction<N, const char*, false> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1179
SetArgPointee(const char* p) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1180
  return MakePolymorphicAction(internal::SetArgumentPointeeAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1181
      N, const char*, false>(p));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1182
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1183
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1184
template <size_t N>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1185
PolymorphicAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1186
  internal::SetArgumentPointeeAction<N, const wchar_t*, false> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1187
SetArgPointee(const wchar_t* p) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1188
  return MakePolymorphicAction(internal::SetArgumentPointeeAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1189
      N, const wchar_t*, false>(p));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1190
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1191
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1192
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1193
// The following version is DEPRECATED.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1194
template <size_t N, typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1195
PolymorphicAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1196
  internal::SetArgumentPointeeAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1197
    N, T, internal::IsAProtocolMessage<T>::value> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1198
SetArgumentPointee(const T& x) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1199
  return MakePolymorphicAction(internal::SetArgumentPointeeAction<
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1200
      N, T, internal::IsAProtocolMessage<T>::value>(x));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1201
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1202
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1203
// Creates an action that sets a pointer referent to a given value.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1204
template <typename T1, typename T2>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1205
PolymorphicAction<internal::AssignAction<T1, T2> > Assign(T1* ptr, T2 val) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1206
  return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1207
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1208
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1209
#if !GTEST_OS_WINDOWS_MOBILE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1210
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1211
// Creates an action that sets errno and returns the appropriate error.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1212
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1213
PolymorphicAction<internal::SetErrnoAndReturnAction<T> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1214
SetErrnoAndReturn(int errval, T result) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1215
  return MakePolymorphicAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1216
      internal::SetErrnoAndReturnAction<T>(errval, result));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1217
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1218
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1219
#endif  // !GTEST_OS_WINDOWS_MOBILE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1220
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1221
// Various overloads for InvokeWithoutArgs().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1222
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1223
// Creates an action that invokes 'function_impl' with no argument.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1224
template <typename FunctionImpl>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1225
PolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1226
InvokeWithoutArgs(FunctionImpl function_impl) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1227
  return MakePolymorphicAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1228
      internal::InvokeWithoutArgsAction<FunctionImpl>(function_impl));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1229
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1230
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1231
// Creates an action that invokes the given method on the given object
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1232
// with no argument.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1233
template <class Class, typename MethodPtr>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1234
PolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1235
InvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1236
  return MakePolymorphicAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1237
      internal::InvokeMethodWithoutArgsAction<Class, MethodPtr>(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1238
          obj_ptr, method_ptr));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1239
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1240
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1241
// Creates an action that performs an_action and throws away its
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1242
// result.  In other words, it changes the return type of an_action to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1243
// void.  an_action MUST NOT return void, or the code won't compile.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1244
template <typename A>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1245
inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1246
  return internal::IgnoreResultAction<A>(an_action);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1247
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1248
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1249
// Creates a reference wrapper for the given L-value.  If necessary,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1250
// you can explicitly specify the type of the reference.  For example,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1251
// suppose 'derived' is an object of type Derived, ByRef(derived)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1252
// would wrap a Derived&.  If you want to wrap a const Base& instead,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1253
// where Base is a base class of Derived, just write:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1254
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1255
//   ByRef<const Base>(derived)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1256
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1257
inline internal::ReferenceWrapper<T> ByRef(T& l_value) {  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1258
  return internal::ReferenceWrapper<T>(l_value);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1259
}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1260
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1261
}  // namespace testing
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1262
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1263
#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_