1 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!! 2 3 // Copyright 2007, Google Inc. 4 // All rights reserved. 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are 8 // met: 9 // 10 // * Redistributions of source code must retain the above copyright 11 // notice, this list of conditions and the following disclaimer. 12 // * Redistributions in binary form must reproduce the above 13 // copyright notice, this list of conditions and the following disclaimer 14 // in the documentation and/or other materials provided with the 15 // distribution. 16 // * Neither the name of Google Inc. nor the names of its 17 // contributors may be used to endorse or promote products derived from 18 // this software without specific prior written permission. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 // 32 // Author: wan (at) google.com (Zhanyong Wan) 33 34 // Google Mock - a framework for writing C++ mock classes. 35 // 36 // This file implements some commonly used variadic actions. 37 38 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 39 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 40 41 #include "gmock/gmock-actions.h" 42 #include "gmock/internal/gmock-port.h" 43 44 namespace testing { 45 namespace internal { 46 47 // InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary 48 // function or method with the unpacked values, where F is a function 49 // type that takes N arguments. 50 template <typename Result, typename ArgumentTuple> 51 class InvokeHelper; 52 53 template <typename R> 54 class InvokeHelper<R, ::testing::tuple<> > { 55 public: 56 template <typename Function> 57 static R Invoke(Function function, const ::testing::tuple<>&) { 58 return function(); 59 } 60 61 template <class Class, typename MethodPtr> 62 static R InvokeMethod(Class* obj_ptr, 63 MethodPtr method_ptr, 64 const ::testing::tuple<>&) { 65 return (obj_ptr->*method_ptr)(); 66 } 67 }; 68 69 template <typename R, typename A1> 70 class InvokeHelper<R, ::testing::tuple<A1> > { 71 public: 72 template <typename Function> 73 static R Invoke(Function function, const ::testing::tuple<A1>& args) { 74 return function(get<0>(args)); 75 } 76 77 template <class Class, typename MethodPtr> 78 static R InvokeMethod(Class* obj_ptr, 79 MethodPtr method_ptr, 80 const ::testing::tuple<A1>& args) { 81 return (obj_ptr->*method_ptr)(get<0>(args)); 82 } 83 }; 84 85 template <typename R, typename A1, typename A2> 86 class InvokeHelper<R, ::testing::tuple<A1, A2> > { 87 public: 88 template <typename Function> 89 static R Invoke(Function function, const ::testing::tuple<A1, A2>& args) { 90 return function(get<0>(args), get<1>(args)); 91 } 92 93 template <class Class, typename MethodPtr> 94 static R InvokeMethod(Class* obj_ptr, 95 MethodPtr method_ptr, 96 const ::testing::tuple<A1, A2>& args) { 97 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args)); 98 } 99 }; 100 101 template <typename R, typename A1, typename A2, typename A3> 102 class InvokeHelper<R, ::testing::tuple<A1, A2, A3> > { 103 public: 104 template <typename Function> 105 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3>& args) { 106 return function(get<0>(args), get<1>(args), get<2>(args)); 107 } 108 109 template <class Class, typename MethodPtr> 110 static R InvokeMethod(Class* obj_ptr, 111 MethodPtr method_ptr, 112 const ::testing::tuple<A1, A2, A3>& args) { 113 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 114 get<2>(args)); 115 } 116 }; 117 118 template <typename R, typename A1, typename A2, typename A3, typename A4> 119 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > { 120 public: 121 template <typename Function> 122 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, 123 A4>& args) { 124 return function(get<0>(args), get<1>(args), get<2>(args), 125 get<3>(args)); 126 } 127 128 template <class Class, typename MethodPtr> 129 static R InvokeMethod(Class* obj_ptr, 130 MethodPtr method_ptr, 131 const ::testing::tuple<A1, A2, A3, A4>& args) { 132 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 133 get<2>(args), get<3>(args)); 134 } 135 }; 136 137 template <typename R, typename A1, typename A2, typename A3, typename A4, 138 typename A5> 139 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > { 140 public: 141 template <typename Function> 142 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, 143 A5>& args) { 144 return function(get<0>(args), get<1>(args), get<2>(args), 145 get<3>(args), get<4>(args)); 146 } 147 148 template <class Class, typename MethodPtr> 149 static R InvokeMethod(Class* obj_ptr, 150 MethodPtr method_ptr, 151 const ::testing::tuple<A1, A2, A3, A4, A5>& args) { 152 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 153 get<2>(args), get<3>(args), get<4>(args)); 154 } 155 }; 156 157 template <typename R, typename A1, typename A2, typename A3, typename A4, 158 typename A5, typename A6> 159 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > { 160 public: 161 template <typename Function> 162 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5, 163 A6>& args) { 164 return function(get<0>(args), get<1>(args), get<2>(args), 165 get<3>(args), get<4>(args), get<5>(args)); 166 } 167 168 template <class Class, typename MethodPtr> 169 static R InvokeMethod(Class* obj_ptr, 170 MethodPtr method_ptr, 171 const ::testing::tuple<A1, A2, A3, A4, A5, A6>& args) { 172 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 173 get<2>(args), get<3>(args), get<4>(args), get<5>(args)); 174 } 175 }; 176 177 template <typename R, typename A1, typename A2, typename A3, typename A4, 178 typename A5, typename A6, typename A7> 179 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > { 180 public: 181 template <typename Function> 182 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5, 183 A6, A7>& args) { 184 return function(get<0>(args), get<1>(args), get<2>(args), 185 get<3>(args), get<4>(args), get<5>(args), get<6>(args)); 186 } 187 188 template <class Class, typename MethodPtr> 189 static R InvokeMethod(Class* obj_ptr, 190 MethodPtr method_ptr, 191 const ::testing::tuple<A1, A2, A3, A4, A5, A6, 192 A7>& args) { 193 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 194 get<2>(args), get<3>(args), get<4>(args), get<5>(args), 195 get<6>(args)); 196 } 197 }; 198 199 template <typename R, typename A1, typename A2, typename A3, typename A4, 200 typename A5, typename A6, typename A7, typename A8> 201 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > { 202 public: 203 template <typename Function> 204 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5, 205 A6, A7, A8>& args) { 206 return function(get<0>(args), get<1>(args), get<2>(args), 207 get<3>(args), get<4>(args), get<5>(args), get<6>(args), 208 get<7>(args)); 209 } 210 211 template <class Class, typename MethodPtr> 212 static R InvokeMethod(Class* obj_ptr, 213 MethodPtr method_ptr, 214 const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, 215 A8>& args) { 216 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 217 get<2>(args), get<3>(args), get<4>(args), get<5>(args), 218 get<6>(args), get<7>(args)); 219 } 220 }; 221 222 template <typename R, typename A1, typename A2, typename A3, typename A4, 223 typename A5, typename A6, typename A7, typename A8, typename A9> 224 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > { 225 public: 226 template <typename Function> 227 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5, 228 A6, A7, A8, A9>& args) { 229 return function(get<0>(args), get<1>(args), get<2>(args), 230 get<3>(args), get<4>(args), get<5>(args), get<6>(args), 231 get<7>(args), get<8>(args)); 232 } 233 234 template <class Class, typename MethodPtr> 235 static R InvokeMethod(Class* obj_ptr, 236 MethodPtr method_ptr, 237 const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, 238 A9>& args) { 239 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 240 get<2>(args), get<3>(args), get<4>(args), get<5>(args), 241 get<6>(args), get<7>(args), get<8>(args)); 242 } 243 }; 244 245 template <typename R, typename A1, typename A2, typename A3, typename A4, 246 typename A5, typename A6, typename A7, typename A8, typename A9, 247 typename A10> 248 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, 249 A10> > { 250 public: 251 template <typename Function> 252 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5, 253 A6, A7, A8, A9, A10>& args) { 254 return function(get<0>(args), get<1>(args), get<2>(args), 255 get<3>(args), get<4>(args), get<5>(args), get<6>(args), 256 get<7>(args), get<8>(args), get<9>(args)); 257 } 258 259 template <class Class, typename MethodPtr> 260 static R InvokeMethod(Class* obj_ptr, 261 MethodPtr method_ptr, 262 const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, 263 A9, A10>& args) { 264 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), 265 get<2>(args), get<3>(args), get<4>(args), get<5>(args), 266 get<6>(args), get<7>(args), get<8>(args), get<9>(args)); 267 } 268 }; 269 270 // An INTERNAL macro for extracting the type of a tuple field. It's 271 // subject to change without notice - DO NOT USE IN USER CODE! 272 #define GMOCK_FIELD_(Tuple, N) \ 273 typename ::testing::tuple_element<N, Tuple>::type 274 275 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the 276 // type of an n-ary function whose i-th (1-based) argument type is the 277 // k{i}-th (0-based) field of ArgumentTuple, which must be a tuple 278 // type, and whose return type is Result. For example, 279 // SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type 280 // is int(bool, long). 281 // 282 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args) 283 // returns the selected fields (k1, k2, ..., k_n) of args as a tuple. 284 // For example, 285 // SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select( 286 // ::testing::make_tuple(true, 'a', 2.5)) 287 // returns tuple (2.5, true). 288 // 289 // The numbers in list k1, k2, ..., k_n must be >= 0, where n can be 290 // in the range [0, 10]. Duplicates are allowed and they don't have 291 // to be in an ascending or descending order. 292 293 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 294 int k4, int k5, int k6, int k7, int k8, int k9, int k10> 295 class SelectArgs { 296 public: 297 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 298 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 299 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 300 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), 301 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9), 302 GMOCK_FIELD_(ArgumentTuple, k10)); 303 typedef typename Function<type>::ArgumentTuple SelectedArgs; 304 static SelectedArgs Select(const ArgumentTuple& args) { 305 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 306 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args), 307 get<k8>(args), get<k9>(args), get<k10>(args)); 308 } 309 }; 310 311 template <typename Result, typename ArgumentTuple> 312 class SelectArgs<Result, ArgumentTuple, 313 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 314 public: 315 typedef Result type(); 316 typedef typename Function<type>::ArgumentTuple SelectedArgs; 317 static SelectedArgs Select(const ArgumentTuple& /* args */) { 318 return SelectedArgs(); 319 } 320 }; 321 322 template <typename Result, typename ArgumentTuple, int k1> 323 class SelectArgs<Result, ArgumentTuple, 324 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 325 public: 326 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1)); 327 typedef typename Function<type>::ArgumentTuple SelectedArgs; 328 static SelectedArgs Select(const ArgumentTuple& args) { 329 return SelectedArgs(get<k1>(args)); 330 } 331 }; 332 333 template <typename Result, typename ArgumentTuple, int k1, int k2> 334 class SelectArgs<Result, ArgumentTuple, 335 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> { 336 public: 337 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 338 GMOCK_FIELD_(ArgumentTuple, k2)); 339 typedef typename Function<type>::ArgumentTuple SelectedArgs; 340 static SelectedArgs Select(const ArgumentTuple& args) { 341 return SelectedArgs(get<k1>(args), get<k2>(args)); 342 } 343 }; 344 345 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3> 346 class SelectArgs<Result, ArgumentTuple, 347 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> { 348 public: 349 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 350 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3)); 351 typedef typename Function<type>::ArgumentTuple SelectedArgs; 352 static SelectedArgs Select(const ArgumentTuple& args) { 353 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args)); 354 } 355 }; 356 357 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 358 int k4> 359 class SelectArgs<Result, ArgumentTuple, 360 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> { 361 public: 362 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 363 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 364 GMOCK_FIELD_(ArgumentTuple, k4)); 365 typedef typename Function<type>::ArgumentTuple SelectedArgs; 366 static SelectedArgs Select(const ArgumentTuple& args) { 367 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 368 get<k4>(args)); 369 } 370 }; 371 372 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 373 int k4, int k5> 374 class SelectArgs<Result, ArgumentTuple, 375 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> { 376 public: 377 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 378 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 379 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5)); 380 typedef typename Function<type>::ArgumentTuple SelectedArgs; 381 static SelectedArgs Select(const ArgumentTuple& args) { 382 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 383 get<k4>(args), get<k5>(args)); 384 } 385 }; 386 387 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 388 int k4, int k5, int k6> 389 class SelectArgs<Result, ArgumentTuple, 390 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> { 391 public: 392 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 393 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 394 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 395 GMOCK_FIELD_(ArgumentTuple, k6)); 396 typedef typename Function<type>::ArgumentTuple SelectedArgs; 397 static SelectedArgs Select(const ArgumentTuple& args) { 398 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 399 get<k4>(args), get<k5>(args), get<k6>(args)); 400 } 401 }; 402 403 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 404 int k4, int k5, int k6, int k7> 405 class SelectArgs<Result, ArgumentTuple, 406 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> { 407 public: 408 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 409 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 410 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 411 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7)); 412 typedef typename Function<type>::ArgumentTuple SelectedArgs; 413 static SelectedArgs Select(const ArgumentTuple& args) { 414 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 415 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args)); 416 } 417 }; 418 419 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 420 int k4, int k5, int k6, int k7, int k8> 421 class SelectArgs<Result, ArgumentTuple, 422 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> { 423 public: 424 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 425 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 426 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 427 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), 428 GMOCK_FIELD_(ArgumentTuple, k8)); 429 typedef typename Function<type>::ArgumentTuple SelectedArgs; 430 static SelectedArgs Select(const ArgumentTuple& args) { 431 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 432 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args), 433 get<k8>(args)); 434 } 435 }; 436 437 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 438 int k4, int k5, int k6, int k7, int k8, int k9> 439 class SelectArgs<Result, ArgumentTuple, 440 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> { 441 public: 442 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 443 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 444 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 445 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), 446 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9)); 447 typedef typename Function<type>::ArgumentTuple SelectedArgs; 448 static SelectedArgs Select(const ArgumentTuple& args) { 449 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 450 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args), 451 get<k8>(args), get<k9>(args)); 452 } 453 }; 454 455 #undef GMOCK_FIELD_ 456 457 // Implements the WithArgs action. 458 template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1, 459 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 460 int k9 = -1, int k10 = -1> 461 class WithArgsAction { 462 public: 463 explicit WithArgsAction(const InnerAction& action) : action_(action) {} 464 465 template <typename F> 466 operator Action<F>() const { return MakeAction(new Impl<F>(action_)); } 467 468 private: 469 template <typename F> 470 class Impl : public ActionInterface<F> { 471 public: 472 typedef typename Function<F>::Result Result; 473 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 474 475 explicit Impl(const InnerAction& action) : action_(action) {} 476 477 virtual Result Perform(const ArgumentTuple& args) { 478 return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4, 479 k5, k6, k7, k8, k9, k10>::Select(args)); 480 } 481 482 private: 483 typedef typename SelectArgs<Result, ArgumentTuple, 484 k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType; 485 486 Action<InnerFunctionType> action_; 487 }; 488 489 const InnerAction action_; 490 491 GTEST_DISALLOW_ASSIGN_(WithArgsAction); 492 }; 493 494 // A macro from the ACTION* family (defined later in this file) 495 // defines an action that can be used in a mock function. Typically, 496 // these actions only care about a subset of the arguments of the mock 497 // function. For example, if such an action only uses the second 498 // argument, it can be used in any mock function that takes >= 2 499 // arguments where the type of the second argument is compatible. 500 // 501 // Therefore, the action implementation must be prepared to take more 502 // arguments than it needs. The ExcessiveArg type is used to 503 // represent those excessive arguments. In order to keep the compiler 504 // error messages tractable, we define it in the testing namespace 505 // instead of testing::internal. However, this is an INTERNAL TYPE 506 // and subject to change without notice, so a user MUST NOT USE THIS 507 // TYPE DIRECTLY. 508 struct ExcessiveArg {}; 509 510 // A helper class needed for implementing the ACTION* macros. 511 template <typename Result, class Impl> 512 class ActionHelper { 513 public: 514 static Result Perform(Impl* impl, const ::testing::tuple<>& args) { 515 return impl->template gmock_PerformImpl<>(args, ExcessiveArg(), 516 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 517 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 518 ExcessiveArg()); 519 } 520 521 template <typename A0> 522 static Result Perform(Impl* impl, const ::testing::tuple<A0>& args) { 523 return impl->template gmock_PerformImpl<A0>(args, get<0>(args), 524 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 525 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 526 ExcessiveArg()); 527 } 528 529 template <typename A0, typename A1> 530 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1>& args) { 531 return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args), 532 get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 533 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 534 ExcessiveArg()); 535 } 536 537 template <typename A0, typename A1, typename A2> 538 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2>& args) { 539 return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args), 540 get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(), 541 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 542 ExcessiveArg()); 543 } 544 545 template <typename A0, typename A1, typename A2, typename A3> 546 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, 547 A3>& args) { 548 return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args), 549 get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(), 550 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 551 ExcessiveArg()); 552 } 553 554 template <typename A0, typename A1, typename A2, typename A3, typename A4> 555 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, 556 A4>& args) { 557 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args, 558 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), 559 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 560 ExcessiveArg()); 561 } 562 563 template <typename A0, typename A1, typename A2, typename A3, typename A4, 564 typename A5> 565 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4, 566 A5>& args) { 567 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args, 568 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), 569 get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 570 ExcessiveArg()); 571 } 572 573 template <typename A0, typename A1, typename A2, typename A3, typename A4, 574 typename A5, typename A6> 575 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4, 576 A5, A6>& args) { 577 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args, 578 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), 579 get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(), 580 ExcessiveArg()); 581 } 582 583 template <typename A0, typename A1, typename A2, typename A3, typename A4, 584 typename A5, typename A6, typename A7> 585 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4, 586 A5, A6, A7>& args) { 587 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, 588 A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), 589 get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(), 590 ExcessiveArg()); 591 } 592 593 template <typename A0, typename A1, typename A2, typename A3, typename A4, 594 typename A5, typename A6, typename A7, typename A8> 595 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4, 596 A5, A6, A7, A8>& args) { 597 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, 598 A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), 599 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), 600 ExcessiveArg()); 601 } 602 603 template <typename A0, typename A1, typename A2, typename A3, typename A4, 604 typename A5, typename A6, typename A7, typename A8, typename A9> 605 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4, 606 A5, A6, A7, A8, A9>& args) { 607 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8, 608 A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), 609 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), 610 get<9>(args)); 611 } 612 }; 613 614 } // namespace internal 615 616 // Various overloads for Invoke(). 617 618 // WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes 619 // the selected arguments of the mock function to an_action and 620 // performs it. It serves as an adaptor between actions with 621 // different argument lists. C++ doesn't support default arguments for 622 // function templates, so we have to overload it. 623 template <int k1, typename InnerAction> 624 inline internal::WithArgsAction<InnerAction, k1> 625 WithArgs(const InnerAction& action) { 626 return internal::WithArgsAction<InnerAction, k1>(action); 627 } 628 629 template <int k1, int k2, typename InnerAction> 630 inline internal::WithArgsAction<InnerAction, k1, k2> 631 WithArgs(const InnerAction& action) { 632 return internal::WithArgsAction<InnerAction, k1, k2>(action); 633 } 634 635 template <int k1, int k2, int k3, typename InnerAction> 636 inline internal::WithArgsAction<InnerAction, k1, k2, k3> 637 WithArgs(const InnerAction& action) { 638 return internal::WithArgsAction<InnerAction, k1, k2, k3>(action); 639 } 640 641 template <int k1, int k2, int k3, int k4, typename InnerAction> 642 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4> 643 WithArgs(const InnerAction& action) { 644 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action); 645 } 646 647 template <int k1, int k2, int k3, int k4, int k5, typename InnerAction> 648 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5> 649 WithArgs(const InnerAction& action) { 650 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action); 651 } 652 653 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction> 654 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6> 655 WithArgs(const InnerAction& action) { 656 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action); 657 } 658 659 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, 660 typename InnerAction> 661 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7> 662 WithArgs(const InnerAction& action) { 663 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, 664 k7>(action); 665 } 666 667 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 668 typename InnerAction> 669 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8> 670 WithArgs(const InnerAction& action) { 671 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, 672 k8>(action); 673 } 674 675 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 676 int k9, typename InnerAction> 677 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9> 678 WithArgs(const InnerAction& action) { 679 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, 680 k9>(action); 681 } 682 683 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 684 int k9, int k10, typename InnerAction> 685 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, 686 k9, k10> 687 WithArgs(const InnerAction& action) { 688 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, 689 k9, k10>(action); 690 } 691 692 // Creates an action that does actions a1, a2, ..., sequentially in 693 // each invocation. 694 template <typename Action1, typename Action2> 695 inline internal::DoBothAction<Action1, Action2> 696 DoAll(Action1 a1, Action2 a2) { 697 return internal::DoBothAction<Action1, Action2>(a1, a2); 698 } 699 700 template <typename Action1, typename Action2, typename Action3> 701 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 702 Action3> > 703 DoAll(Action1 a1, Action2 a2, Action3 a3) { 704 return DoAll(a1, DoAll(a2, a3)); 705 } 706 707 template <typename Action1, typename Action2, typename Action3, 708 typename Action4> 709 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 710 internal::DoBothAction<Action3, Action4> > > 711 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) { 712 return DoAll(a1, DoAll(a2, a3, a4)); 713 } 714 715 template <typename Action1, typename Action2, typename Action3, 716 typename Action4, typename Action5> 717 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 718 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 719 Action5> > > > 720 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) { 721 return DoAll(a1, DoAll(a2, a3, a4, a5)); 722 } 723 724 template <typename Action1, typename Action2, typename Action3, 725 typename Action4, typename Action5, typename Action6> 726 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 727 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 728 internal::DoBothAction<Action5, Action6> > > > > 729 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) { 730 return DoAll(a1, DoAll(a2, a3, a4, a5, a6)); 731 } 732 733 template <typename Action1, typename Action2, typename Action3, 734 typename Action4, typename Action5, typename Action6, typename Action7> 735 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 736 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 737 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 738 Action7> > > > > > 739 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 740 Action7 a7) { 741 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7)); 742 } 743 744 template <typename Action1, typename Action2, typename Action3, 745 typename Action4, typename Action5, typename Action6, typename Action7, 746 typename Action8> 747 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 748 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 749 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 750 internal::DoBothAction<Action7, Action8> > > > > > > 751 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 752 Action7 a7, Action8 a8) { 753 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8)); 754 } 755 756 template <typename Action1, typename Action2, typename Action3, 757 typename Action4, typename Action5, typename Action6, typename Action7, 758 typename Action8, typename Action9> 759 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 760 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 761 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 762 internal::DoBothAction<Action7, internal::DoBothAction<Action8, 763 Action9> > > > > > > > 764 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 765 Action7 a7, Action8 a8, Action9 a9) { 766 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9)); 767 } 768 769 template <typename Action1, typename Action2, typename Action3, 770 typename Action4, typename Action5, typename Action6, typename Action7, 771 typename Action8, typename Action9, typename Action10> 772 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 773 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 774 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 775 internal::DoBothAction<Action7, internal::DoBothAction<Action8, 776 internal::DoBothAction<Action9, Action10> > > > > > > > > 777 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 778 Action7 a7, Action8 a8, Action9 a9, Action10 a10) { 779 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10)); 780 } 781 782 } // namespace testing 783 784 // The ACTION* family of macros can be used in a namespace scope to 785 // define custom actions easily. The syntax: 786 // 787 // ACTION(name) { statements; } 788 // 789 // will define an action with the given name that executes the 790 // statements. The value returned by the statements will be used as 791 // the return value of the action. Inside the statements, you can 792 // refer to the K-th (0-based) argument of the mock function by 793 // 'argK', and refer to its type by 'argK_type'. For example: 794 // 795 // ACTION(IncrementArg1) { 796 // arg1_type temp = arg1; 797 // return ++(*temp); 798 // } 799 // 800 // allows you to write 801 // 802 // ...WillOnce(IncrementArg1()); 803 // 804 // You can also refer to the entire argument tuple and its type by 805 // 'args' and 'args_type', and refer to the mock function type and its 806 // return type by 'function_type' and 'return_type'. 807 // 808 // Note that you don't need to specify the types of the mock function 809 // arguments. However rest assured that your code is still type-safe: 810 // you'll get a compiler error if *arg1 doesn't support the ++ 811 // operator, or if the type of ++(*arg1) isn't compatible with the 812 // mock function's return type, for example. 813 // 814 // Sometimes you'll want to parameterize the action. For that you can use 815 // another macro: 816 // 817 // ACTION_P(name, param_name) { statements; } 818 // 819 // For example: 820 // 821 // ACTION_P(Add, n) { return arg0 + n; } 822 // 823 // will allow you to write: 824 // 825 // ...WillOnce(Add(5)); 826 // 827 // Note that you don't need to provide the type of the parameter 828 // either. If you need to reference the type of a parameter named 829 // 'foo', you can write 'foo_type'. For example, in the body of 830 // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type 831 // of 'n'. 832 // 833 // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support 834 // multi-parameter actions. 835 // 836 // For the purpose of typing, you can view 837 // 838 // ACTION_Pk(Foo, p1, ..., pk) { ... } 839 // 840 // as shorthand for 841 // 842 // template <typename p1_type, ..., typename pk_type> 843 // FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... } 844 // 845 // In particular, you can provide the template type arguments 846 // explicitly when invoking Foo(), as in Foo<long, bool>(5, false); 847 // although usually you can rely on the compiler to infer the types 848 // for you automatically. You can assign the result of expression 849 // Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ..., 850 // pk_type>. This can be useful when composing actions. 851 // 852 // You can also overload actions with different numbers of parameters: 853 // 854 // ACTION_P(Plus, a) { ... } 855 // ACTION_P2(Plus, a, b) { ... } 856 // 857 // While it's tempting to always use the ACTION* macros when defining 858 // a new action, you should also consider implementing ActionInterface 859 // or using MakePolymorphicAction() instead, especially if you need to 860 // use the action a lot. While these approaches require more work, 861 // they give you more control on the types of the mock function 862 // arguments and the action parameters, which in general leads to 863 // better compiler error messages that pay off in the long run. They 864 // also allow overloading actions based on parameter types (as opposed 865 // to just based on the number of parameters). 866 // 867 // CAVEAT: 868 // 869 // ACTION*() can only be used in a namespace scope. The reason is 870 // that C++ doesn't yet allow function-local types to be used to 871 // instantiate templates. The up-coming C++0x standard will fix this. 872 // Once that's done, we'll consider supporting using ACTION*() inside 873 // a function. 874 // 875 // MORE INFORMATION: 876 // 877 // To learn more about using these macros, please search for 'ACTION' 878 // on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md 879 880 // An internal macro needed for implementing ACTION*(). 881 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ 882 const args_type& args GTEST_ATTRIBUTE_UNUSED_, \ 883 arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \ 884 arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \ 885 arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \ 886 arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \ 887 arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \ 888 arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \ 889 arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \ 890 arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \ 891 arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \ 892 arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_ 893 894 // Sometimes you want to give an action explicit template parameters 895 // that cannot be inferred from its value parameters. ACTION() and 896 // ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that 897 // and can be viewed as an extension to ACTION() and ACTION_P*(). 898 // 899 // The syntax: 900 // 901 // ACTION_TEMPLATE(ActionName, 902 // HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), 903 // AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } 904 // 905 // defines an action template that takes m explicit template 906 // parameters and n value parameters. name_i is the name of the i-th 907 // template parameter, and kind_i specifies whether it's a typename, 908 // an integral constant, or a template. p_i is the name of the i-th 909 // value parameter. 910 // 911 // Example: 912 // 913 // // DuplicateArg<k, T>(output) converts the k-th argument of the mock 914 // // function to type T and copies it to *output. 915 // ACTION_TEMPLATE(DuplicateArg, 916 // HAS_2_TEMPLATE_PARAMS(int, k, typename, T), 917 // AND_1_VALUE_PARAMS(output)) { 918 // *output = T(::testing::get<k>(args)); 919 // } 920 // ... 921 // int n; 922 // EXPECT_CALL(mock, Foo(_, _)) 923 // .WillOnce(DuplicateArg<1, unsigned char>(&n)); 924 // 925 // To create an instance of an action template, write: 926 // 927 // ActionName<t1, ..., t_m>(v1, ..., v_n) 928 // 929 // where the ts are the template arguments and the vs are the value 930 // arguments. The value argument types are inferred by the compiler. 931 // If you want to explicitly specify the value argument types, you can 932 // provide additional template arguments: 933 // 934 // ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n) 935 // 936 // where u_i is the desired type of v_i. 937 // 938 // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the 939 // number of value parameters, but not on the number of template 940 // parameters. Without the restriction, the meaning of the following 941 // is unclear: 942 // 943 // OverloadedAction<int, bool>(x); 944 // 945 // Are we using a single-template-parameter action where 'bool' refers 946 // to the type of x, or are we using a two-template-parameter action 947 // where the compiler is asked to infer the type of x? 948 // 949 // Implementation notes: 950 // 951 // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and 952 // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for 953 // implementing ACTION_TEMPLATE. The main trick we use is to create 954 // new macro invocations when expanding a macro. For example, we have 955 // 956 // #define ACTION_TEMPLATE(name, template_params, value_params) 957 // ... GMOCK_INTERNAL_DECL_##template_params ... 958 // 959 // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) 960 // to expand to 961 // 962 // ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... 963 // 964 // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the 965 // preprocessor will continue to expand it to 966 // 967 // ... typename T ... 968 // 969 // This technique conforms to the C++ standard and is portable. It 970 // allows us to implement action templates using O(N) code, where N is 971 // the maximum number of template/value parameters supported. Without 972 // using it, we'd have to devote O(N^2) amount of code to implement all 973 // combinations of m and n. 974 975 // Declares the template parameters. 976 #define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0 977 #define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ 978 name1) kind0 name0, kind1 name1 979 #define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 980 kind2, name2) kind0 name0, kind1 name1, kind2 name2 981 #define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 982 kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \ 983 kind3 name3 984 #define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 985 kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \ 986 kind2 name2, kind3 name3, kind4 name4 987 #define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 988 kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \ 989 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5 990 #define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 991 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 992 name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ 993 kind5 name5, kind6 name6 994 #define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 995 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 996 kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \ 997 kind4 name4, kind5 name5, kind6 name6, kind7 name7 998 #define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 999 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 1000 kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \ 1001 kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \ 1002 kind8 name8 1003 #define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ 1004 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 1005 name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \ 1006 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \ 1007 kind6 name6, kind7 name7, kind8 name8, kind9 name9 1008 1009 // Lists the template parameters. 1010 #define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0 1011 #define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ 1012 name1) name0, name1 1013 #define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1014 kind2, name2) name0, name1, name2 1015 #define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1016 kind2, name2, kind3, name3) name0, name1, name2, name3 1017 #define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1018 kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \ 1019 name4 1020 #define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1021 kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \ 1022 name2, name3, name4, name5 1023 #define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1024 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 1025 name6) name0, name1, name2, name3, name4, name5, name6 1026 #define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1027 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 1028 kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7 1029 #define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 1030 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 1031 kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \ 1032 name6, name7, name8 1033 #define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ 1034 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 1035 name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \ 1036 name3, name4, name5, name6, name7, name8, name9 1037 1038 // Declares the types of value parameters. 1039 #define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS() 1040 #define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type 1041 #define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \ 1042 typename p0##_type, typename p1##_type 1043 #define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \ 1044 typename p0##_type, typename p1##_type, typename p2##_type 1045 #define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ 1046 typename p0##_type, typename p1##_type, typename p2##_type, \ 1047 typename p3##_type 1048 #define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ 1049 typename p0##_type, typename p1##_type, typename p2##_type, \ 1050 typename p3##_type, typename p4##_type 1051 #define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ 1052 typename p0##_type, typename p1##_type, typename p2##_type, \ 1053 typename p3##_type, typename p4##_type, typename p5##_type 1054 #define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1055 p6) , typename p0##_type, typename p1##_type, typename p2##_type, \ 1056 typename p3##_type, typename p4##_type, typename p5##_type, \ 1057 typename p6##_type 1058 #define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1059 p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \ 1060 typename p3##_type, typename p4##_type, typename p5##_type, \ 1061 typename p6##_type, typename p7##_type 1062 #define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1063 p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \ 1064 typename p3##_type, typename p4##_type, typename p5##_type, \ 1065 typename p6##_type, typename p7##_type, typename p8##_type 1066 #define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1067 p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \ 1068 typename p2##_type, typename p3##_type, typename p4##_type, \ 1069 typename p5##_type, typename p6##_type, typename p7##_type, \ 1070 typename p8##_type, typename p9##_type 1071 1072 // Initializes the value parameters. 1073 #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\ 1074 () 1075 #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\ 1076 (p0##_type gmock_p0) : p0(gmock_p0) 1077 #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\ 1078 (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1) 1079 #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\ 1080 (p0##_type gmock_p0, p1##_type gmock_p1, \ 1081 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) 1082 #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\ 1083 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1084 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1085 p3(gmock_p3) 1086 #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\ 1087 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1088 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \ 1089 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) 1090 #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\ 1091 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1092 p3##_type gmock_p3, p4##_type gmock_p4, \ 1093 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1094 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) 1095 #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\ 1096 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1097 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1098 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1099 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) 1100 #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\ 1101 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1102 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1103 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \ 1104 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 1105 p7(gmock_p7) 1106 #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1107 p7, p8)\ 1108 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1109 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1110 p6##_type gmock_p6, p7##_type gmock_p7, \ 1111 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1112 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 1113 p8(gmock_p8) 1114 #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1115 p7, p8, p9)\ 1116 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1117 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1118 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 1119 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1120 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 1121 p8(gmock_p8), p9(gmock_p9) 1122 1123 // Declares the fields for storing the value parameters. 1124 #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() 1125 #define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0; 1126 #define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \ 1127 p1##_type p1; 1128 #define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \ 1129 p1##_type p1; p2##_type p2; 1130 #define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \ 1131 p1##_type p1; p2##_type p2; p3##_type p3; 1132 #define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ 1133 p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; 1134 #define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ 1135 p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ 1136 p5##_type p5; 1137 #define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1138 p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ 1139 p5##_type p5; p6##_type p6; 1140 #define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1141 p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ 1142 p5##_type p5; p6##_type p6; p7##_type p7; 1143 #define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1144 p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ 1145 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; 1146 #define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1147 p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ 1148 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \ 1149 p9##_type p9; 1150 1151 // Lists the value parameters. 1152 #define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS() 1153 #define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0 1154 #define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1 1155 #define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2 1156 #define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3 1157 #define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \ 1158 p2, p3, p4 1159 #define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \ 1160 p1, p2, p3, p4, p5 1161 #define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1162 p6) p0, p1, p2, p3, p4, p5, p6 1163 #define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1164 p7) p0, p1, p2, p3, p4, p5, p6, p7 1165 #define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1166 p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8 1167 #define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1168 p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 1169 1170 // Lists the value parameter types. 1171 #define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS() 1172 #define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type 1173 #define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \ 1174 p1##_type 1175 #define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \ 1176 p1##_type, p2##_type 1177 #define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ 1178 p0##_type, p1##_type, p2##_type, p3##_type 1179 #define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ 1180 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type 1181 #define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ 1182 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type 1183 #define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1184 p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ 1185 p6##_type 1186 #define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1187 p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1188 p5##_type, p6##_type, p7##_type 1189 #define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1190 p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1191 p5##_type, p6##_type, p7##_type, p8##_type 1192 #define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1193 p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1194 p5##_type, p6##_type, p7##_type, p8##_type, p9##_type 1195 1196 // Declares the value parameters. 1197 #define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS() 1198 #define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0 1199 #define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \ 1200 p1##_type p1 1201 #define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \ 1202 p1##_type p1, p2##_type p2 1203 #define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \ 1204 p1##_type p1, p2##_type p2, p3##_type p3 1205 #define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ 1206 p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4 1207 #define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ 1208 p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 1209 p5##_type p5 1210 #define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 1211 p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 1212 p5##_type p5, p6##_type p6 1213 #define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1214 p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 1215 p5##_type p5, p6##_type p6, p7##_type p7 1216 #define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1217 p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1218 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8 1219 #define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1220 p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1221 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 1222 p9##_type p9 1223 1224 // The suffix of the class template implementing the action template. 1225 #define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS() 1226 #define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P 1227 #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2 1228 #define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3 1229 #define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4 1230 #define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5 1231 #define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6 1232 #define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7 1233 #define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1234 p7) P8 1235 #define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1236 p7, p8) P9 1237 #define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 1238 p7, p8, p9) P10 1239 1240 // The name of the class template implementing the action template. 1241 #define GMOCK_ACTION_CLASS_(name, value_params)\ 1242 GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) 1243 1244 #define ACTION_TEMPLATE(name, template_params, value_params)\ 1245 template <GMOCK_INTERNAL_DECL_##template_params\ 1246 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 1247 class GMOCK_ACTION_CLASS_(name, value_params) {\ 1248 public:\ 1249 explicit GMOCK_ACTION_CLASS_(name, value_params)\ 1250 GMOCK_INTERNAL_INIT_##value_params {}\ 1251 template <typename F>\ 1252 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1253 public:\ 1254 typedef F function_type;\ 1255 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1256 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1257 args_type;\ 1258 explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ 1259 virtual return_type Perform(const args_type& args) {\ 1260 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1261 Perform(this, args);\ 1262 }\ 1263 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1264 typename arg3_type, typename arg4_type, typename arg5_type, \ 1265 typename arg6_type, typename arg7_type, typename arg8_type, \ 1266 typename arg9_type>\ 1267 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1268 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1269 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1270 arg9_type arg9) const;\ 1271 GMOCK_INTERNAL_DEFN_##value_params\ 1272 private:\ 1273 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1274 };\ 1275 template <typename F> operator ::testing::Action<F>() const {\ 1276 return ::testing::Action<F>(\ 1277 new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\ 1278 }\ 1279 GMOCK_INTERNAL_DEFN_##value_params\ 1280 private:\ 1281 GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ 1282 };\ 1283 template <GMOCK_INTERNAL_DECL_##template_params\ 1284 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 1285 inline GMOCK_ACTION_CLASS_(name, value_params)<\ 1286 GMOCK_INTERNAL_LIST_##template_params\ 1287 GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ 1288 GMOCK_INTERNAL_DECL_##value_params) {\ 1289 return GMOCK_ACTION_CLASS_(name, value_params)<\ 1290 GMOCK_INTERNAL_LIST_##template_params\ 1291 GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ 1292 GMOCK_INTERNAL_LIST_##value_params);\ 1293 }\ 1294 template <GMOCK_INTERNAL_DECL_##template_params\ 1295 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 1296 template <typename F>\ 1297 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1298 typename arg3_type, typename arg4_type, typename arg5_type, \ 1299 typename arg6_type, typename arg7_type, typename arg8_type, \ 1300 typename arg9_type>\ 1301 typename ::testing::internal::Function<F>::Result\ 1302 GMOCK_ACTION_CLASS_(name, value_params)<\ 1303 GMOCK_INTERNAL_LIST_##template_params\ 1304 GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\ 1305 gmock_PerformImpl(\ 1306 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1307 1308 #define ACTION(name)\ 1309 class name##Action {\ 1310 public:\ 1311 name##Action() {}\ 1312 template <typename F>\ 1313 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1314 public:\ 1315 typedef F function_type;\ 1316 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1317 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1318 args_type;\ 1319 gmock_Impl() {}\ 1320 virtual return_type Perform(const args_type& args) {\ 1321 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1322 Perform(this, args);\ 1323 }\ 1324 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1325 typename arg3_type, typename arg4_type, typename arg5_type, \ 1326 typename arg6_type, typename arg7_type, typename arg8_type, \ 1327 typename arg9_type>\ 1328 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1329 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1330 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1331 arg9_type arg9) const;\ 1332 private:\ 1333 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1334 };\ 1335 template <typename F> operator ::testing::Action<F>() const {\ 1336 return ::testing::Action<F>(new gmock_Impl<F>());\ 1337 }\ 1338 private:\ 1339 GTEST_DISALLOW_ASSIGN_(name##Action);\ 1340 };\ 1341 inline name##Action name() {\ 1342 return name##Action();\ 1343 }\ 1344 template <typename F>\ 1345 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1346 typename arg3_type, typename arg4_type, typename arg5_type, \ 1347 typename arg6_type, typename arg7_type, typename arg8_type, \ 1348 typename arg9_type>\ 1349 typename ::testing::internal::Function<F>::Result\ 1350 name##Action::gmock_Impl<F>::gmock_PerformImpl(\ 1351 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1352 1353 #define ACTION_P(name, p0)\ 1354 template <typename p0##_type>\ 1355 class name##ActionP {\ 1356 public:\ 1357 explicit name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\ 1358 template <typename F>\ 1359 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1360 public:\ 1361 typedef F function_type;\ 1362 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1363 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1364 args_type;\ 1365 explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\ 1366 virtual return_type Perform(const args_type& args) {\ 1367 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1368 Perform(this, args);\ 1369 }\ 1370 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1371 typename arg3_type, typename arg4_type, typename arg5_type, \ 1372 typename arg6_type, typename arg7_type, typename arg8_type, \ 1373 typename arg9_type>\ 1374 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1375 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1376 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1377 arg9_type arg9) const;\ 1378 p0##_type p0;\ 1379 private:\ 1380 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1381 };\ 1382 template <typename F> operator ::testing::Action<F>() const {\ 1383 return ::testing::Action<F>(new gmock_Impl<F>(p0));\ 1384 }\ 1385 p0##_type p0;\ 1386 private:\ 1387 GTEST_DISALLOW_ASSIGN_(name##ActionP);\ 1388 };\ 1389 template <typename p0##_type>\ 1390 inline name##ActionP<p0##_type> name(p0##_type p0) {\ 1391 return name##ActionP<p0##_type>(p0);\ 1392 }\ 1393 template <typename p0##_type>\ 1394 template <typename F>\ 1395 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1396 typename arg3_type, typename arg4_type, typename arg5_type, \ 1397 typename arg6_type, typename arg7_type, typename arg8_type, \ 1398 typename arg9_type>\ 1399 typename ::testing::internal::Function<F>::Result\ 1400 name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1401 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1402 1403 #define ACTION_P2(name, p0, p1)\ 1404 template <typename p0##_type, typename p1##_type>\ 1405 class name##ActionP2 {\ 1406 public:\ 1407 name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 1408 p1(gmock_p1) {}\ 1409 template <typename F>\ 1410 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1411 public:\ 1412 typedef F function_type;\ 1413 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1414 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1415 args_type;\ 1416 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 1417 p1(gmock_p1) {}\ 1418 virtual return_type Perform(const args_type& args) {\ 1419 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1420 Perform(this, args);\ 1421 }\ 1422 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1423 typename arg3_type, typename arg4_type, typename arg5_type, \ 1424 typename arg6_type, typename arg7_type, typename arg8_type, \ 1425 typename arg9_type>\ 1426 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1427 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1428 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1429 arg9_type arg9) const;\ 1430 p0##_type p0;\ 1431 p1##_type p1;\ 1432 private:\ 1433 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1434 };\ 1435 template <typename F> operator ::testing::Action<F>() const {\ 1436 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\ 1437 }\ 1438 p0##_type p0;\ 1439 p1##_type p1;\ 1440 private:\ 1441 GTEST_DISALLOW_ASSIGN_(name##ActionP2);\ 1442 };\ 1443 template <typename p0##_type, typename p1##_type>\ 1444 inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \ 1445 p1##_type p1) {\ 1446 return name##ActionP2<p0##_type, p1##_type>(p0, p1);\ 1447 }\ 1448 template <typename p0##_type, typename p1##_type>\ 1449 template <typename F>\ 1450 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1451 typename arg3_type, typename arg4_type, typename arg5_type, \ 1452 typename arg6_type, typename arg7_type, typename arg8_type, \ 1453 typename arg9_type>\ 1454 typename ::testing::internal::Function<F>::Result\ 1455 name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1456 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1457 1458 #define ACTION_P3(name, p0, p1, p2)\ 1459 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1460 class name##ActionP3 {\ 1461 public:\ 1462 name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \ 1463 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 1464 template <typename F>\ 1465 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1466 public:\ 1467 typedef F function_type;\ 1468 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1469 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1470 args_type;\ 1471 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ 1472 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 1473 virtual return_type Perform(const args_type& args) {\ 1474 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1475 Perform(this, args);\ 1476 }\ 1477 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1478 typename arg3_type, typename arg4_type, typename arg5_type, \ 1479 typename arg6_type, typename arg7_type, typename arg8_type, \ 1480 typename arg9_type>\ 1481 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1482 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1483 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1484 arg9_type arg9) const;\ 1485 p0##_type p0;\ 1486 p1##_type p1;\ 1487 p2##_type p2;\ 1488 private:\ 1489 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1490 };\ 1491 template <typename F> operator ::testing::Action<F>() const {\ 1492 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\ 1493 }\ 1494 p0##_type p0;\ 1495 p1##_type p1;\ 1496 p2##_type p2;\ 1497 private:\ 1498 GTEST_DISALLOW_ASSIGN_(name##ActionP3);\ 1499 };\ 1500 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1501 inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ 1502 p1##_type p1, p2##_type p2) {\ 1503 return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\ 1504 }\ 1505 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1506 template <typename F>\ 1507 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1508 typename arg3_type, typename arg4_type, typename arg5_type, \ 1509 typename arg6_type, typename arg7_type, typename arg8_type, \ 1510 typename arg9_type>\ 1511 typename ::testing::internal::Function<F>::Result\ 1512 name##ActionP3<p0##_type, p1##_type, \ 1513 p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1514 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1515 1516 #define ACTION_P4(name, p0, p1, p2, p3)\ 1517 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1518 typename p3##_type>\ 1519 class name##ActionP4 {\ 1520 public:\ 1521 name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \ 1522 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ 1523 p2(gmock_p2), p3(gmock_p3) {}\ 1524 template <typename F>\ 1525 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1526 public:\ 1527 typedef F function_type;\ 1528 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1529 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1530 args_type;\ 1531 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1532 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1533 p3(gmock_p3) {}\ 1534 virtual return_type Perform(const args_type& args) {\ 1535 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1536 Perform(this, args);\ 1537 }\ 1538 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1539 typename arg3_type, typename arg4_type, typename arg5_type, \ 1540 typename arg6_type, typename arg7_type, typename arg8_type, \ 1541 typename arg9_type>\ 1542 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1543 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1544 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1545 arg9_type arg9) const;\ 1546 p0##_type p0;\ 1547 p1##_type p1;\ 1548 p2##_type p2;\ 1549 p3##_type p3;\ 1550 private:\ 1551 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1552 };\ 1553 template <typename F> operator ::testing::Action<F>() const {\ 1554 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\ 1555 }\ 1556 p0##_type p0;\ 1557 p1##_type p1;\ 1558 p2##_type p2;\ 1559 p3##_type p3;\ 1560 private:\ 1561 GTEST_DISALLOW_ASSIGN_(name##ActionP4);\ 1562 };\ 1563 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1564 typename p3##_type>\ 1565 inline name##ActionP4<p0##_type, p1##_type, p2##_type, \ 1566 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 1567 p3##_type p3) {\ 1568 return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \ 1569 p2, p3);\ 1570 }\ 1571 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1572 typename p3##_type>\ 1573 template <typename F>\ 1574 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1575 typename arg3_type, typename arg4_type, typename arg5_type, \ 1576 typename arg6_type, typename arg7_type, typename arg8_type, \ 1577 typename arg9_type>\ 1578 typename ::testing::internal::Function<F>::Result\ 1579 name##ActionP4<p0##_type, p1##_type, p2##_type, \ 1580 p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1581 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1582 1583 #define ACTION_P5(name, p0, p1, p2, p3, p4)\ 1584 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1585 typename p3##_type, typename p4##_type>\ 1586 class name##ActionP5 {\ 1587 public:\ 1588 name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \ 1589 p2##_type gmock_p2, p3##_type gmock_p3, \ 1590 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1591 p3(gmock_p3), p4(gmock_p4) {}\ 1592 template <typename F>\ 1593 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1594 public:\ 1595 typedef F function_type;\ 1596 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1597 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1598 args_type;\ 1599 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1600 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \ 1601 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\ 1602 virtual return_type Perform(const args_type& args) {\ 1603 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1604 Perform(this, args);\ 1605 }\ 1606 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1607 typename arg3_type, typename arg4_type, typename arg5_type, \ 1608 typename arg6_type, typename arg7_type, typename arg8_type, \ 1609 typename arg9_type>\ 1610 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1611 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1612 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1613 arg9_type arg9) const;\ 1614 p0##_type p0;\ 1615 p1##_type p1;\ 1616 p2##_type p2;\ 1617 p3##_type p3;\ 1618 p4##_type p4;\ 1619 private:\ 1620 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1621 };\ 1622 template <typename F> operator ::testing::Action<F>() const {\ 1623 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\ 1624 }\ 1625 p0##_type p0;\ 1626 p1##_type p1;\ 1627 p2##_type p2;\ 1628 p3##_type p3;\ 1629 p4##_type p4;\ 1630 private:\ 1631 GTEST_DISALLOW_ASSIGN_(name##ActionP5);\ 1632 };\ 1633 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1634 typename p3##_type, typename p4##_type>\ 1635 inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1636 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1637 p4##_type p4) {\ 1638 return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1639 p4##_type>(p0, p1, p2, p3, p4);\ 1640 }\ 1641 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1642 typename p3##_type, typename p4##_type>\ 1643 template <typename F>\ 1644 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1645 typename arg3_type, typename arg4_type, typename arg5_type, \ 1646 typename arg6_type, typename arg7_type, typename arg8_type, \ 1647 typename arg9_type>\ 1648 typename ::testing::internal::Function<F>::Result\ 1649 name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1650 p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1651 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1652 1653 #define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\ 1654 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1655 typename p3##_type, typename p4##_type, typename p5##_type>\ 1656 class name##ActionP6 {\ 1657 public:\ 1658 name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \ 1659 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1660 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1661 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ 1662 template <typename F>\ 1663 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1664 public:\ 1665 typedef F function_type;\ 1666 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1667 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1668 args_type;\ 1669 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1670 p3##_type gmock_p3, p4##_type gmock_p4, \ 1671 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1672 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ 1673 virtual return_type Perform(const args_type& args) {\ 1674 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1675 Perform(this, args);\ 1676 }\ 1677 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1678 typename arg3_type, typename arg4_type, typename arg5_type, \ 1679 typename arg6_type, typename arg7_type, typename arg8_type, \ 1680 typename arg9_type>\ 1681 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1682 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1683 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1684 arg9_type arg9) const;\ 1685 p0##_type p0;\ 1686 p1##_type p1;\ 1687 p2##_type p2;\ 1688 p3##_type p3;\ 1689 p4##_type p4;\ 1690 p5##_type p5;\ 1691 private:\ 1692 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1693 };\ 1694 template <typename F> operator ::testing::Action<F>() const {\ 1695 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\ 1696 }\ 1697 p0##_type p0;\ 1698 p1##_type p1;\ 1699 p2##_type p2;\ 1700 p3##_type p3;\ 1701 p4##_type p4;\ 1702 p5##_type p5;\ 1703 private:\ 1704 GTEST_DISALLOW_ASSIGN_(name##ActionP6);\ 1705 };\ 1706 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1707 typename p3##_type, typename p4##_type, typename p5##_type>\ 1708 inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 1709 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 1710 p3##_type p3, p4##_type p4, p5##_type p5) {\ 1711 return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 1712 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\ 1713 }\ 1714 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1715 typename p3##_type, typename p4##_type, typename p5##_type>\ 1716 template <typename F>\ 1717 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1718 typename arg3_type, typename arg4_type, typename arg5_type, \ 1719 typename arg6_type, typename arg7_type, typename arg8_type, \ 1720 typename arg9_type>\ 1721 typename ::testing::internal::Function<F>::Result\ 1722 name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1723 p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1724 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1725 1726 #define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\ 1727 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1728 typename p3##_type, typename p4##_type, typename p5##_type, \ 1729 typename p6##_type>\ 1730 class name##ActionP7 {\ 1731 public:\ 1732 name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \ 1733 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1734 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ 1735 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ 1736 p6(gmock_p6) {}\ 1737 template <typename F>\ 1738 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1739 public:\ 1740 typedef F function_type;\ 1741 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1742 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1743 args_type;\ 1744 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1745 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1746 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1747 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ 1748 virtual return_type Perform(const args_type& args) {\ 1749 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1750 Perform(this, args);\ 1751 }\ 1752 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1753 typename arg3_type, typename arg4_type, typename arg5_type, \ 1754 typename arg6_type, typename arg7_type, typename arg8_type, \ 1755 typename arg9_type>\ 1756 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1757 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1758 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1759 arg9_type arg9) const;\ 1760 p0##_type p0;\ 1761 p1##_type p1;\ 1762 p2##_type p2;\ 1763 p3##_type p3;\ 1764 p4##_type p4;\ 1765 p5##_type p5;\ 1766 p6##_type p6;\ 1767 private:\ 1768 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1769 };\ 1770 template <typename F> operator ::testing::Action<F>() const {\ 1771 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 1772 p6));\ 1773 }\ 1774 p0##_type p0;\ 1775 p1##_type p1;\ 1776 p2##_type p2;\ 1777 p3##_type p3;\ 1778 p4##_type p4;\ 1779 p5##_type p5;\ 1780 p6##_type p6;\ 1781 private:\ 1782 GTEST_DISALLOW_ASSIGN_(name##ActionP7);\ 1783 };\ 1784 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1785 typename p3##_type, typename p4##_type, typename p5##_type, \ 1786 typename p6##_type>\ 1787 inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 1788 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \ 1789 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 1790 p6##_type p6) {\ 1791 return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 1792 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\ 1793 }\ 1794 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1795 typename p3##_type, typename p4##_type, typename p5##_type, \ 1796 typename p6##_type>\ 1797 template <typename F>\ 1798 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1799 typename arg3_type, typename arg4_type, typename arg5_type, \ 1800 typename arg6_type, typename arg7_type, typename arg8_type, \ 1801 typename arg9_type>\ 1802 typename ::testing::internal::Function<F>::Result\ 1803 name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1804 p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1805 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1806 1807 #define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\ 1808 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1809 typename p3##_type, typename p4##_type, typename p5##_type, \ 1810 typename p6##_type, typename p7##_type>\ 1811 class name##ActionP8 {\ 1812 public:\ 1813 name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \ 1814 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1815 p5##_type gmock_p5, p6##_type gmock_p6, \ 1816 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1817 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 1818 p7(gmock_p7) {}\ 1819 template <typename F>\ 1820 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1821 public:\ 1822 typedef F function_type;\ 1823 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1824 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1825 args_type;\ 1826 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1827 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1828 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \ 1829 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \ 1830 p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ 1831 virtual return_type Perform(const args_type& args) {\ 1832 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1833 Perform(this, args);\ 1834 }\ 1835 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1836 typename arg3_type, typename arg4_type, typename arg5_type, \ 1837 typename arg6_type, typename arg7_type, typename arg8_type, \ 1838 typename arg9_type>\ 1839 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1840 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1841 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1842 arg9_type arg9) const;\ 1843 p0##_type p0;\ 1844 p1##_type p1;\ 1845 p2##_type p2;\ 1846 p3##_type p3;\ 1847 p4##_type p4;\ 1848 p5##_type p5;\ 1849 p6##_type p6;\ 1850 p7##_type p7;\ 1851 private:\ 1852 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1853 };\ 1854 template <typename F> operator ::testing::Action<F>() const {\ 1855 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 1856 p6, p7));\ 1857 }\ 1858 p0##_type p0;\ 1859 p1##_type p1;\ 1860 p2##_type p2;\ 1861 p3##_type p3;\ 1862 p4##_type p4;\ 1863 p5##_type p5;\ 1864 p6##_type p6;\ 1865 p7##_type p7;\ 1866 private:\ 1867 GTEST_DISALLOW_ASSIGN_(name##ActionP8);\ 1868 };\ 1869 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1870 typename p3##_type, typename p4##_type, typename p5##_type, \ 1871 typename p6##_type, typename p7##_type>\ 1872 inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 1873 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \ 1874 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 1875 p6##_type p6, p7##_type p7) {\ 1876 return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 1877 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \ 1878 p6, p7);\ 1879 }\ 1880 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1881 typename p3##_type, typename p4##_type, typename p5##_type, \ 1882 typename p6##_type, typename p7##_type>\ 1883 template <typename F>\ 1884 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1885 typename arg3_type, typename arg4_type, typename arg5_type, \ 1886 typename arg6_type, typename arg7_type, typename arg8_type, \ 1887 typename arg9_type>\ 1888 typename ::testing::internal::Function<F>::Result\ 1889 name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1890 p5##_type, p6##_type, \ 1891 p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1892 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1893 1894 #define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\ 1895 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1896 typename p3##_type, typename p4##_type, typename p5##_type, \ 1897 typename p6##_type, typename p7##_type, typename p8##_type>\ 1898 class name##ActionP9 {\ 1899 public:\ 1900 name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \ 1901 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1902 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 1903 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1904 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 1905 p8(gmock_p8) {}\ 1906 template <typename F>\ 1907 class gmock_Impl : public ::testing::ActionInterface<F> {\ 1908 public:\ 1909 typedef F function_type;\ 1910 typedef typename ::testing::internal::Function<F>::Result return_type;\ 1911 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 1912 args_type;\ 1913 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1914 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1915 p6##_type gmock_p6, p7##_type gmock_p7, \ 1916 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1917 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 1918 p7(gmock_p7), p8(gmock_p8) {}\ 1919 virtual return_type Perform(const args_type& args) {\ 1920 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 1921 Perform(this, args);\ 1922 }\ 1923 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1924 typename arg3_type, typename arg4_type, typename arg5_type, \ 1925 typename arg6_type, typename arg7_type, typename arg8_type, \ 1926 typename arg9_type>\ 1927 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 1928 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 1929 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 1930 arg9_type arg9) const;\ 1931 p0##_type p0;\ 1932 p1##_type p1;\ 1933 p2##_type p2;\ 1934 p3##_type p3;\ 1935 p4##_type p4;\ 1936 p5##_type p5;\ 1937 p6##_type p6;\ 1938 p7##_type p7;\ 1939 p8##_type p8;\ 1940 private:\ 1941 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1942 };\ 1943 template <typename F> operator ::testing::Action<F>() const {\ 1944 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 1945 p6, p7, p8));\ 1946 }\ 1947 p0##_type p0;\ 1948 p1##_type p1;\ 1949 p2##_type p2;\ 1950 p3##_type p3;\ 1951 p4##_type p4;\ 1952 p5##_type p5;\ 1953 p6##_type p6;\ 1954 p7##_type p7;\ 1955 p8##_type p8;\ 1956 private:\ 1957 GTEST_DISALLOW_ASSIGN_(name##ActionP9);\ 1958 };\ 1959 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1960 typename p3##_type, typename p4##_type, typename p5##_type, \ 1961 typename p6##_type, typename p7##_type, typename p8##_type>\ 1962 inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 1963 p4##_type, p5##_type, p6##_type, p7##_type, \ 1964 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1965 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ 1966 p8##_type p8) {\ 1967 return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 1968 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \ 1969 p3, p4, p5, p6, p7, p8);\ 1970 }\ 1971 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1972 typename p3##_type, typename p4##_type, typename p5##_type, \ 1973 typename p6##_type, typename p7##_type, typename p8##_type>\ 1974 template <typename F>\ 1975 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 1976 typename arg3_type, typename arg4_type, typename arg5_type, \ 1977 typename arg6_type, typename arg7_type, typename arg8_type, \ 1978 typename arg9_type>\ 1979 typename ::testing::internal::Function<F>::Result\ 1980 name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1981 p5##_type, p6##_type, p7##_type, \ 1982 p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 1983 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 1984 1985 #define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\ 1986 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1987 typename p3##_type, typename p4##_type, typename p5##_type, \ 1988 typename p6##_type, typename p7##_type, typename p8##_type, \ 1989 typename p9##_type>\ 1990 class name##ActionP10 {\ 1991 public:\ 1992 name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \ 1993 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1994 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 1995 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ 1996 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 1997 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ 1998 template <typename F>\ 1999 class gmock_Impl : public ::testing::ActionInterface<F> {\ 2000 public:\ 2001 typedef F function_type;\ 2002 typedef typename ::testing::internal::Function<F>::Result return_type;\ 2003 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 2004 args_type;\ 2005 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 2006 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 2007 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 2008 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 2009 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 2010 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ 2011 virtual return_type Perform(const args_type& args) {\ 2012 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 2013 Perform(this, args);\ 2014 }\ 2015 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 2016 typename arg3_type, typename arg4_type, typename arg5_type, \ 2017 typename arg6_type, typename arg7_type, typename arg8_type, \ 2018 typename arg9_type>\ 2019 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 2020 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 2021 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 2022 arg9_type arg9) const;\ 2023 p0##_type p0;\ 2024 p1##_type p1;\ 2025 p2##_type p2;\ 2026 p3##_type p3;\ 2027 p4##_type p4;\ 2028 p5##_type p5;\ 2029 p6##_type p6;\ 2030 p7##_type p7;\ 2031 p8##_type p8;\ 2032 p9##_type p9;\ 2033 private:\ 2034 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 2035 };\ 2036 template <typename F> operator ::testing::Action<F>() const {\ 2037 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 2038 p6, p7, p8, p9));\ 2039 }\ 2040 p0##_type p0;\ 2041 p1##_type p1;\ 2042 p2##_type p2;\ 2043 p3##_type p3;\ 2044 p4##_type p4;\ 2045 p5##_type p5;\ 2046 p6##_type p6;\ 2047 p7##_type p7;\ 2048 p8##_type p8;\ 2049 p9##_type p9;\ 2050 private:\ 2051 GTEST_DISALLOW_ASSIGN_(name##ActionP10);\ 2052 };\ 2053 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2054 typename p3##_type, typename p4##_type, typename p5##_type, \ 2055 typename p6##_type, typename p7##_type, typename p8##_type, \ 2056 typename p9##_type>\ 2057 inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2058 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2059 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 2060 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 2061 p9##_type p9) {\ 2062 return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2063 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \ 2064 p1, p2, p3, p4, p5, p6, p7, p8, p9);\ 2065 }\ 2066 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2067 typename p3##_type, typename p4##_type, typename p5##_type, \ 2068 typename p6##_type, typename p7##_type, typename p8##_type, \ 2069 typename p9##_type>\ 2070 template <typename F>\ 2071 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 2072 typename arg3_type, typename arg4_type, typename arg5_type, \ 2073 typename arg6_type, typename arg7_type, typename arg8_type, \ 2074 typename arg9_type>\ 2075 typename ::testing::internal::Function<F>::Result\ 2076 name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 2077 p5##_type, p6##_type, p7##_type, p8##_type, \ 2078 p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 2079 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 2080 2081 namespace testing { 2082 2083 2084 // The ACTION*() macros trigger warning C4100 (unreferenced formal 2085 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 2086 // the macro definition, as the warnings are generated when the macro 2087 // is expanded and macro expansion cannot contain #pragma. Therefore 2088 // we suppress them here. 2089 #ifdef _MSC_VER 2090 # pragma warning(push) 2091 # pragma warning(disable:4100) 2092 #endif 2093 2094 // Various overloads for InvokeArgument<N>(). 2095 // 2096 // The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th 2097 // (0-based) argument, which must be a k-ary callable, of the mock 2098 // function, with arguments a1, a2, ..., a_k. 2099 // 2100 // Notes: 2101 // 2102 // 1. The arguments are passed by value by default. If you need to 2103 // pass an argument by reference, wrap it inside ByRef(). For 2104 // example, 2105 // 2106 // InvokeArgument<1>(5, string("Hello"), ByRef(foo)) 2107 // 2108 // passes 5 and string("Hello") by value, and passes foo by 2109 // reference. 2110 // 2111 // 2. If the callable takes an argument by reference but ByRef() is 2112 // not used, it will receive the reference to a copy of the value, 2113 // instead of the original value. For example, when the 0-th 2114 // argument of the mock function takes a const string&, the action 2115 // 2116 // InvokeArgument<0>(string("Hello")) 2117 // 2118 // makes a copy of the temporary string("Hello") object and passes a 2119 // reference of the copy, instead of the original temporary object, 2120 // to the callable. This makes it easy for a user to define an 2121 // InvokeArgument action from temporary values and have it performed 2122 // later. 2123 2124 namespace internal { 2125 namespace invoke_argument { 2126 2127 // Appears in InvokeArgumentAdl's argument list to help avoid 2128 // accidental calls to user functions of the same name. 2129 struct AdlTag {}; 2130 2131 // InvokeArgumentAdl - a helper for InvokeArgument. 2132 // The basic overloads are provided here for generic functors. 2133 // Overloads for other custom-callables are provided in the 2134 // internal/custom/callback-actions.h header. 2135 2136 template <typename R, typename F> 2137 R InvokeArgumentAdl(AdlTag, F f) { 2138 return f(); 2139 } 2140 template <typename R, typename F, typename A1> 2141 R InvokeArgumentAdl(AdlTag, F f, A1 a1) { 2142 return f(a1); 2143 } 2144 template <typename R, typename F, typename A1, typename A2> 2145 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2) { 2146 return f(a1, a2); 2147 } 2148 template <typename R, typename F, typename A1, typename A2, typename A3> 2149 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3) { 2150 return f(a1, a2, a3); 2151 } 2152 template <typename R, typename F, typename A1, typename A2, typename A3, 2153 typename A4> 2154 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4) { 2155 return f(a1, a2, a3, a4); 2156 } 2157 template <typename R, typename F, typename A1, typename A2, typename A3, 2158 typename A4, typename A5> 2159 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { 2160 return f(a1, a2, a3, a4, a5); 2161 } 2162 template <typename R, typename F, typename A1, typename A2, typename A3, 2163 typename A4, typename A5, typename A6> 2164 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { 2165 return f(a1, a2, a3, a4, a5, a6); 2166 } 2167 template <typename R, typename F, typename A1, typename A2, typename A3, 2168 typename A4, typename A5, typename A6, typename A7> 2169 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2170 A7 a7) { 2171 return f(a1, a2, a3, a4, a5, a6, a7); 2172 } 2173 template <typename R, typename F, typename A1, typename A2, typename A3, 2174 typename A4, typename A5, typename A6, typename A7, typename A8> 2175 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2176 A7 a7, A8 a8) { 2177 return f(a1, a2, a3, a4, a5, a6, a7, a8); 2178 } 2179 template <typename R, typename F, typename A1, typename A2, typename A3, 2180 typename A4, typename A5, typename A6, typename A7, typename A8, 2181 typename A9> 2182 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2183 A7 a7, A8 a8, A9 a9) { 2184 return f(a1, a2, a3, a4, a5, a6, a7, a8, a9); 2185 } 2186 template <typename R, typename F, typename A1, typename A2, typename A3, 2187 typename A4, typename A5, typename A6, typename A7, typename A8, 2188 typename A9, typename A10> 2189 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2190 A7 a7, A8 a8, A9 a9, A10 a10) { 2191 return f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); 2192 } 2193 } // namespace invoke_argument 2194 } // namespace internal 2195 2196 ACTION_TEMPLATE(InvokeArgument, 2197 HAS_1_TEMPLATE_PARAMS(int, k), 2198 AND_0_VALUE_PARAMS()) { 2199 using internal::invoke_argument::InvokeArgumentAdl; 2200 return InvokeArgumentAdl<return_type>( 2201 internal::invoke_argument::AdlTag(), 2202 ::testing::get<k>(args)); 2203 } 2204 2205 ACTION_TEMPLATE(InvokeArgument, 2206 HAS_1_TEMPLATE_PARAMS(int, k), 2207 AND_1_VALUE_PARAMS(p0)) { 2208 using internal::invoke_argument::InvokeArgumentAdl; 2209 return InvokeArgumentAdl<return_type>( 2210 internal::invoke_argument::AdlTag(), 2211 ::testing::get<k>(args), p0); 2212 } 2213 2214 ACTION_TEMPLATE(InvokeArgument, 2215 HAS_1_TEMPLATE_PARAMS(int, k), 2216 AND_2_VALUE_PARAMS(p0, p1)) { 2217 using internal::invoke_argument::InvokeArgumentAdl; 2218 return InvokeArgumentAdl<return_type>( 2219 internal::invoke_argument::AdlTag(), 2220 ::testing::get<k>(args), p0, p1); 2221 } 2222 2223 ACTION_TEMPLATE(InvokeArgument, 2224 HAS_1_TEMPLATE_PARAMS(int, k), 2225 AND_3_VALUE_PARAMS(p0, p1, p2)) { 2226 using internal::invoke_argument::InvokeArgumentAdl; 2227 return InvokeArgumentAdl<return_type>( 2228 internal::invoke_argument::AdlTag(), 2229 ::testing::get<k>(args), p0, p1, p2); 2230 } 2231 2232 ACTION_TEMPLATE(InvokeArgument, 2233 HAS_1_TEMPLATE_PARAMS(int, k), 2234 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { 2235 using internal::invoke_argument::InvokeArgumentAdl; 2236 return InvokeArgumentAdl<return_type>( 2237 internal::invoke_argument::AdlTag(), 2238 ::testing::get<k>(args), p0, p1, p2, p3); 2239 } 2240 2241 ACTION_TEMPLATE(InvokeArgument, 2242 HAS_1_TEMPLATE_PARAMS(int, k), 2243 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { 2244 using internal::invoke_argument::InvokeArgumentAdl; 2245 return InvokeArgumentAdl<return_type>( 2246 internal::invoke_argument::AdlTag(), 2247 ::testing::get<k>(args), p0, p1, p2, p3, p4); 2248 } 2249 2250 ACTION_TEMPLATE(InvokeArgument, 2251 HAS_1_TEMPLATE_PARAMS(int, k), 2252 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { 2253 using internal::invoke_argument::InvokeArgumentAdl; 2254 return InvokeArgumentAdl<return_type>( 2255 internal::invoke_argument::AdlTag(), 2256 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5); 2257 } 2258 2259 ACTION_TEMPLATE(InvokeArgument, 2260 HAS_1_TEMPLATE_PARAMS(int, k), 2261 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { 2262 using internal::invoke_argument::InvokeArgumentAdl; 2263 return InvokeArgumentAdl<return_type>( 2264 internal::invoke_argument::AdlTag(), 2265 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6); 2266 } 2267 2268 ACTION_TEMPLATE(InvokeArgument, 2269 HAS_1_TEMPLATE_PARAMS(int, k), 2270 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { 2271 using internal::invoke_argument::InvokeArgumentAdl; 2272 return InvokeArgumentAdl<return_type>( 2273 internal::invoke_argument::AdlTag(), 2274 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7); 2275 } 2276 2277 ACTION_TEMPLATE(InvokeArgument, 2278 HAS_1_TEMPLATE_PARAMS(int, k), 2279 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { 2280 using internal::invoke_argument::InvokeArgumentAdl; 2281 return InvokeArgumentAdl<return_type>( 2282 internal::invoke_argument::AdlTag(), 2283 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8); 2284 } 2285 2286 ACTION_TEMPLATE(InvokeArgument, 2287 HAS_1_TEMPLATE_PARAMS(int, k), 2288 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { 2289 using internal::invoke_argument::InvokeArgumentAdl; 2290 return InvokeArgumentAdl<return_type>( 2291 internal::invoke_argument::AdlTag(), 2292 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); 2293 } 2294 2295 // Various overloads for ReturnNew<T>(). 2296 // 2297 // The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new 2298 // instance of type T, constructed on the heap with constructor arguments 2299 // a1, a2, ..., and a_k. The caller assumes ownership of the returned value. 2300 ACTION_TEMPLATE(ReturnNew, 2301 HAS_1_TEMPLATE_PARAMS(typename, T), 2302 AND_0_VALUE_PARAMS()) { 2303 return new T(); 2304 } 2305 2306 ACTION_TEMPLATE(ReturnNew, 2307 HAS_1_TEMPLATE_PARAMS(typename, T), 2308 AND_1_VALUE_PARAMS(p0)) { 2309 return new T(p0); 2310 } 2311 2312 ACTION_TEMPLATE(ReturnNew, 2313 HAS_1_TEMPLATE_PARAMS(typename, T), 2314 AND_2_VALUE_PARAMS(p0, p1)) { 2315 return new T(p0, p1); 2316 } 2317 2318 ACTION_TEMPLATE(ReturnNew, 2319 HAS_1_TEMPLATE_PARAMS(typename, T), 2320 AND_3_VALUE_PARAMS(p0, p1, p2)) { 2321 return new T(p0, p1, p2); 2322 } 2323 2324 ACTION_TEMPLATE(ReturnNew, 2325 HAS_1_TEMPLATE_PARAMS(typename, T), 2326 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { 2327 return new T(p0, p1, p2, p3); 2328 } 2329 2330 ACTION_TEMPLATE(ReturnNew, 2331 HAS_1_TEMPLATE_PARAMS(typename, T), 2332 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { 2333 return new T(p0, p1, p2, p3, p4); 2334 } 2335 2336 ACTION_TEMPLATE(ReturnNew, 2337 HAS_1_TEMPLATE_PARAMS(typename, T), 2338 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { 2339 return new T(p0, p1, p2, p3, p4, p5); 2340 } 2341 2342 ACTION_TEMPLATE(ReturnNew, 2343 HAS_1_TEMPLATE_PARAMS(typename, T), 2344 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { 2345 return new T(p0, p1, p2, p3, p4, p5, p6); 2346 } 2347 2348 ACTION_TEMPLATE(ReturnNew, 2349 HAS_1_TEMPLATE_PARAMS(typename, T), 2350 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { 2351 return new T(p0, p1, p2, p3, p4, p5, p6, p7); 2352 } 2353 2354 ACTION_TEMPLATE(ReturnNew, 2355 HAS_1_TEMPLATE_PARAMS(typename, T), 2356 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { 2357 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8); 2358 } 2359 2360 ACTION_TEMPLATE(ReturnNew, 2361 HAS_1_TEMPLATE_PARAMS(typename, T), 2362 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { 2363 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); 2364 } 2365 2366 #ifdef _MSC_VER 2367 # pragma warning(pop) 2368 #endif 2369 2370 } // namespace testing 2371 2372 // Include any custom actions added by the local installation. 2373 // We must include this header at the end to make sure it can use the 2374 // declarations from this file. 2375 #include "gmock/internal/custom/gmock-generated-actions.h" 2376 2377 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 2378