1 // This file was GENERATED by command:
   2 //     pump.py gmock-generated-internal-utils.h.pump
   3 // DO NOT EDIT BY HAND!!!
   4 
   5 // Copyright 2007, Google Inc.
   6 // All rights reserved.
   7 //
   8 // Redistribution and use in source and binary forms, with or without
   9 // modification, are permitted provided that the following conditions are
  10 // met:
  11 //
  12 //     * Redistributions of source code must retain the above copyright
  13 // notice, this list of conditions and the following disclaimer.
  14 //     * Redistributions in binary form must reproduce the above
  15 // copyright notice, this list of conditions and the following disclaimer
  16 // in the documentation and/or other materials provided with the
  17 // distribution.
  18 //     * Neither the name of Google Inc. nor the names of its
  19 // contributors may be used to endorse or promote products derived from
  20 // this software without specific prior written permission.
  21 //
  22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  26 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  27 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  28 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33 
  34 
  35 // Google Mock - a framework for writing C++ mock classes.
  36 //
  37 // This file contains template meta-programming utility classes needed
  38 // for implementing Google Mock.
  39 
  40 // GOOGLETEST_CM0002 DO NOT DELETE
  41 
  42 #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
  43 #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
  44 
  45 #include "gmock/internal/gmock-port.h"
  46 
  47 namespace testing {
  48 
  49 template <typename T>
  50 class Matcher;
  51 
  52 namespace internal {
  53 
  54 // An IgnoredValue object can be implicitly constructed from ANY value.
  55 // This is used in implementing the IgnoreResult(a) action.
  56 class IgnoredValue {
  57  public:
  58   // This constructor template allows any value to be implicitly
  59   // converted to IgnoredValue.  The object has no data member and
  60   // doesn't try to remember anything about the argument.  We
  61   // deliberately omit the 'explicit' keyword in order to allow the
  62   // conversion to be implicit.
  63   template <typename T>
  64   IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit)
  65 };
  66 
  67 // MatcherTuple<T>::type is a tuple type where each field is a Matcher
  68 // for the corresponding field in tuple type T.
  69 template <typename Tuple>
  70 struct MatcherTuple;
  71 
  72 template <>
  73 struct MatcherTuple< ::testing::tuple<> > {
  74   typedef ::testing::tuple< > type;
  75 };
  76 
  77 template <typename A1>
  78 struct MatcherTuple< ::testing::tuple<A1> > {
  79   typedef ::testing::tuple<Matcher<A1> > type;
  80 };
  81 
  82 template <typename A1, typename A2>
  83 struct MatcherTuple< ::testing::tuple<A1, A2> > {
  84   typedef ::testing::tuple<Matcher<A1>, Matcher<A2> > type;
  85 };
  86 
  87 template <typename A1, typename A2, typename A3>
  88 struct MatcherTuple< ::testing::tuple<A1, A2, A3> > {
  89   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type;
  90 };
  91 
  92 template <typename A1, typename A2, typename A3, typename A4>
  93 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4> > {
  94   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4> >
  95       type;
  96 };
  97 
  98 template <typename A1, typename A2, typename A3, typename A4, typename A5>
  99 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5> > {
 100   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
 101                            Matcher<A5> >
 102       type;
 103 };
 104 
 105 template <typename A1, typename A2, typename A3, typename A4, typename A5,
 106     typename A6>
 107 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6> > {
 108   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
 109                            Matcher<A5>, Matcher<A6> >
 110       type;
 111 };
 112 
 113 template <typename A1, typename A2, typename A3, typename A4, typename A5,
 114     typename A6, typename A7>
 115 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {
 116   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
 117                            Matcher<A5>, Matcher<A6>, Matcher<A7> >
 118       type;
 119 };
 120 
 121 template <typename A1, typename A2, typename A3, typename A4, typename A5,
 122     typename A6, typename A7, typename A8>
 123 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {
 124   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
 125                            Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> >
 126       type;
 127 };
 128 
 129 template <typename A1, typename A2, typename A3, typename A4, typename A5,
 130     typename A6, typename A7, typename A8, typename A9>
 131 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {
 132   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
 133                            Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,
 134                            Matcher<A9> >
 135       type;
 136 };
 137 
 138 template <typename A1, typename A2, typename A3, typename A4, typename A5,
 139     typename A6, typename A7, typename A8, typename A9, typename A10>
 140 struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
 141     A10> > {
 142   typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
 143                            Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,
 144                            Matcher<A9>, Matcher<A10> >
 145       type;
 146 };
 147 
 148 // Template struct Function<F>, where F must be a function type, contains
 149 // the following typedefs:
 150 //
 151 //   Result:               the function's return type.
 152 //   ArgumentN:            the type of the N-th argument, where N starts with 1.
 153 //   ArgumentTuple:        the tuple type consisting of all parameters of F.
 154 //   ArgumentMatcherTuple: the tuple type consisting of Matchers for all
 155 //                         parameters of F.
 156 //   MakeResultVoid:       the function type obtained by substituting void
 157 //                         for the return type of F.
 158 //   MakeResultIgnoredValue:
 159 //                         the function type obtained by substituting Something
 160 //                         for the return type of F.
 161 template <typename F>
 162 struct Function;
 163 
 164 template <typename R>
 165 struct Function<R()> {
 166   typedef R Result;
 167   typedef ::testing::tuple<> ArgumentTuple;
 168   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 169   typedef void MakeResultVoid();
 170   typedef IgnoredValue MakeResultIgnoredValue();
 171 };
 172 
 173 template <typename R, typename A1>
 174 struct Function<R(A1)>
 175     : Function<R()> {
 176   typedef A1 Argument1;
 177   typedef ::testing::tuple<A1> ArgumentTuple;
 178   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 179   typedef void MakeResultVoid(A1);
 180   typedef IgnoredValue MakeResultIgnoredValue(A1);
 181 };
 182 
 183 template <typename R, typename A1, typename A2>
 184 struct Function<R(A1, A2)>
 185     : Function<R(A1)> {
 186   typedef A2 Argument2;
 187   typedef ::testing::tuple<A1, A2> ArgumentTuple;
 188   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 189   typedef void MakeResultVoid(A1, A2);
 190   typedef IgnoredValue MakeResultIgnoredValue(A1, A2);
 191 };
 192 
 193 template <typename R, typename A1, typename A2, typename A3>
 194 struct Function<R(A1, A2, A3)>
 195     : Function<R(A1, A2)> {
 196   typedef A3 Argument3;
 197   typedef ::testing::tuple<A1, A2, A3> ArgumentTuple;
 198   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 199   typedef void MakeResultVoid(A1, A2, A3);
 200   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3);
 201 };
 202 
 203 template <typename R, typename A1, typename A2, typename A3, typename A4>
 204 struct Function<R(A1, A2, A3, A4)>
 205     : Function<R(A1, A2, A3)> {
 206   typedef A4 Argument4;
 207   typedef ::testing::tuple<A1, A2, A3, A4> ArgumentTuple;
 208   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 209   typedef void MakeResultVoid(A1, A2, A3, A4);
 210   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4);
 211 };
 212 
 213 template <typename R, typename A1, typename A2, typename A3, typename A4,
 214     typename A5>
 215 struct Function<R(A1, A2, A3, A4, A5)>
 216     : Function<R(A1, A2, A3, A4)> {
 217   typedef A5 Argument5;
 218   typedef ::testing::tuple<A1, A2, A3, A4, A5> ArgumentTuple;
 219   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 220   typedef void MakeResultVoid(A1, A2, A3, A4, A5);
 221   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5);
 222 };
 223 
 224 template <typename R, typename A1, typename A2, typename A3, typename A4,
 225     typename A5, typename A6>
 226 struct Function<R(A1, A2, A3, A4, A5, A6)>
 227     : Function<R(A1, A2, A3, A4, A5)> {
 228   typedef A6 Argument6;
 229   typedef ::testing::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple;
 230   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 231   typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6);
 232   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6);
 233 };
 234 
 235 template <typename R, typename A1, typename A2, typename A3, typename A4,
 236     typename A5, typename A6, typename A7>
 237 struct Function<R(A1, A2, A3, A4, A5, A6, A7)>
 238     : Function<R(A1, A2, A3, A4, A5, A6)> {
 239   typedef A7 Argument7;
 240   typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple;
 241   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 242   typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7);
 243   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7);
 244 };
 245 
 246 template <typename R, typename A1, typename A2, typename A3, typename A4,
 247     typename A5, typename A6, typename A7, typename A8>
 248 struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)>
 249     : Function<R(A1, A2, A3, A4, A5, A6, A7)> {
 250   typedef A8 Argument8;
 251   typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple;
 252   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 253   typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8);
 254   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8);
 255 };
 256 
 257 template <typename R, typename A1, typename A2, typename A3, typename A4,
 258     typename A5, typename A6, typename A7, typename A8, typename A9>
 259 struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)>
 260     : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> {
 261   typedef A9 Argument9;
 262   typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple;
 263   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 264   typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9);
 265   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,
 266       A9);
 267 };
 268 
 269 template <typename R, typename A1, typename A2, typename A3, typename A4,
 270     typename A5, typename A6, typename A7, typename A8, typename A9,
 271     typename A10>
 272 struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>
 273     : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
 274   typedef A10 Argument10;
 275   typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
 276       A10> ArgumentTuple;
 277   typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
 278   typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
 279   typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,
 280       A9, A10);
 281 };
 282 
 283 }  // namespace internal
 284 
 285 }  // namespace testing
 286 
 287 #endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_