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