1$$ -*- mode: c++; -*- 2$$ This is a Pump source file. Please use Pump to convert it to 3$$ gmock-generated-actions.h. 4$$ 5$var n = 10 $$ The maximum arity we support. 6$$}} This meta comment fixes auto-indentation in editors. 7// Copyright 2007, Google Inc. 8// All rights reserved. 9// 10// Redistribution and use in source and binary forms, with or without 11// modification, are permitted provided that the following conditions are 12// met: 13// 14// * Redistributions of source code must retain the above copyright 15// notice, this list of conditions and the following disclaimer. 16// * Redistributions in binary form must reproduce the above 17// copyright notice, this list of conditions and the following disclaimer 18// in the documentation and/or other materials provided with the 19// distribution. 20// * Neither the name of Google Inc. nor the names of its 21// contributors may be used to endorse or promote products derived from 22// this software without specific prior written permission. 23// 24// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 25// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 26// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 27// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 28// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 30// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 34// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 36 37// Google Mock - a framework for writing C++ mock classes. 38// 39// This file implements some commonly used variadic actions. 40 41// GOOGLETEST_CM0002 DO NOT DELETE 42 43#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 44#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 45 46#include "gmock/gmock-actions.h" 47#include "gmock/internal/gmock-port.h" 48 49namespace testing { 50namespace internal { 51 52// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary 53// function, method, or callback with the unpacked values, where F is 54// a function type that takes N arguments. 55template <typename Result, typename ArgumentTuple> 56class InvokeHelper; 57 58 59$var max_callback_arity = 5 60$range i 0..n 61$for i [[ 62$range j 1..i 63$var types = [[$for j [[, typename A$j]]]] 64$var as = [[$for j, [[A$j]]]] 65$var args = [[$if i==0 [[]] $else [[ args]]]] 66$var gets = [[$for j, [[get<$(j - 1)>(args)]]]] 67template <typename R$types> 68class InvokeHelper<R, ::testing::tuple<$as> > { 69 public: 70 template <typename Function> 71 static R Invoke(Function function, const ::testing::tuple<$as>&$args) { 72 return function($gets); 73 } 74 75 template <class Class, typename MethodPtr> 76 static R InvokeMethod(Class* obj_ptr, 77 MethodPtr method_ptr, 78 const ::testing::tuple<$as>&$args) { 79 return (obj_ptr->*method_ptr)($gets); 80 } 81 82 83$if i <= max_callback_arity [[ 84 template <typename CallbackType> 85 static R InvokeCallback(CallbackType* callback, 86 const ::testing::tuple<$as>&$args) { 87 return callback->Run($gets); 88 } 89]] $else [[ 90 // There is no InvokeCallback() for $i-tuples 91]] 92 93}; 94 95 96]] 97// Implements the Invoke(callback) action. 98template <typename CallbackType> 99class InvokeCallbackAction { 100 public: 101 // The c'tor takes ownership of the callback. 102 explicit InvokeCallbackAction(CallbackType* callback) 103 : callback_(callback) { 104 callback->CheckIsRepeatable(); // Makes sure the callback is permanent. 105 } 106 107 // This type conversion operator template allows Invoke(callback) to 108 // be used wherever the callback's type is compatible with that of 109 // the mock function, i.e. if the mock function's arguments can be 110 // implicitly converted to the callback's arguments and the 111 // callback's result can be implicitly converted to the mock 112 // function's result. 113 template <typename Result, typename ArgumentTuple> 114 Result Perform(const ArgumentTuple& args) const { 115 return InvokeHelper<Result, ArgumentTuple>::InvokeCallback( 116 callback_.get(), args); 117 } 118 private: 119 const linked_ptr<CallbackType> callback_; 120}; 121 122// An INTERNAL macro for extracting the type of a tuple field. It's 123// subject to change without notice - DO NOT USE IN USER CODE! 124#define GMOCK_FIELD_(Tuple, N) \ 125 typename ::testing::tuple_element<N, Tuple>::type 126 127$range i 1..n 128 129// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the 130// type of an n-ary function whose i-th (1-based) argument type is the 131// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple 132// type, and whose return type is Result. For example, 133// SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type 134// is int(bool, long). 135// 136// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args) 137// returns the selected fields (k1, k2, ..., k_n) of args as a tuple. 138// For example, 139// SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select( 140// ::testing::make_tuple(true, 'a', 2.5)) 141// returns tuple (2.5, true). 142// 143// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be 144// in the range [0, $n]. Duplicates are allowed and they don't have 145// to be in an ascending or descending order. 146 147template <typename Result, typename ArgumentTuple, $for i, [[int k$i]]> 148class SelectArgs { 149 public: 150 typedef Result type($for i, [[GMOCK_FIELD_(ArgumentTuple, k$i)]]); 151 typedef typename Function<type>::ArgumentTuple SelectedArgs; 152 static SelectedArgs Select(const ArgumentTuple& args) { 153 return SelectedArgs($for i, [[get<k$i>(args)]]); 154 } 155}; 156 157 158$for i [[ 159$range j 1..n 160$range j1 1..i-1 161template <typename Result, typename ArgumentTuple$for j1[[, int k$j1]]> 162class SelectArgs<Result, ArgumentTuple, 163 $for j, [[$if j <= i-1 [[k$j]] $else [[-1]]]]> { 164 public: 165 typedef Result type($for j1, [[GMOCK_FIELD_(ArgumentTuple, k$j1)]]); 166 typedef typename Function<type>::ArgumentTuple SelectedArgs; 167 static SelectedArgs Select(const ArgumentTuple& [[]] 168$if i == 1 [[/* args */]] $else [[args]]) { 169 return SelectedArgs($for j1, [[get<k$j1>(args)]]); 170 } 171}; 172 173 174]] 175#undef GMOCK_FIELD_ 176 177$var ks = [[$for i, [[k$i]]]] 178 179// Implements the WithArgs action. 180template <typename InnerAction, $for i, [[int k$i = -1]]> 181class WithArgsAction { 182 public: 183 explicit WithArgsAction(const InnerAction& action) : action_(action) {} 184 185 template <typename F> 186 operator Action<F>() const { return MakeAction(new Impl<F>(action_)); } 187 188 private: 189 template <typename F> 190 class Impl : public ActionInterface<F> { 191 public: 192 typedef typename Function<F>::Result Result; 193 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 194 195 explicit Impl(const InnerAction& action) : action_(action) {} 196 197 virtual Result Perform(const ArgumentTuple& args) { 198 return action_.Perform(SelectArgs<Result, ArgumentTuple, $ks>::Select(args)); 199 } 200 201 private: 202 typedef typename SelectArgs<Result, ArgumentTuple, 203 $ks>::type InnerFunctionType; 204 205 Action<InnerFunctionType> action_; 206 }; 207 208 const InnerAction action_; 209 210 GTEST_DISALLOW_ASSIGN_(WithArgsAction); 211}; 212 213// A macro from the ACTION* family (defined later in this file) 214// defines an action that can be used in a mock function. Typically, 215// these actions only care about a subset of the arguments of the mock 216// function. For example, if such an action only uses the second 217// argument, it can be used in any mock function that takes >= 2 218// arguments where the type of the second argument is compatible. 219// 220// Therefore, the action implementation must be prepared to take more 221// arguments than it needs. The ExcessiveArg type is used to 222// represent those excessive arguments. In order to keep the compiler 223// error messages tractable, we define it in the testing namespace 224// instead of testing::internal. However, this is an INTERNAL TYPE 225// and subject to change without notice, so a user MUST NOT USE THIS 226// TYPE DIRECTLY. 227struct ExcessiveArg {}; 228 229// A helper class needed for implementing the ACTION* macros. 230template <typename Result, class Impl> 231class ActionHelper { 232 public: 233$range i 0..n 234$for i 235 236[[ 237$var template = [[$if i==0 [[]] $else [[ 238$range j 0..i-1 239 template <$for j, [[typename A$j]]> 240]]]] 241$range j 0..i-1 242$var As = [[$for j, [[A$j]]]] 243$var as = [[$for j, [[get<$j>(args)]]]] 244$range k 1..n-i 245$var eas = [[$for k, [[ExcessiveArg()]]]] 246$var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]] 247$template 248 static Result Perform(Impl* impl, const ::testing::tuple<$As>& args) { 249 return impl->template gmock_PerformImpl<$As>(args, $arg_list); 250 } 251 252]] 253}; 254 255} // namespace internal 256 257// Various overloads for Invoke(). 258 259// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes 260// the selected arguments of the mock function to an_action and 261// performs it. It serves as an adaptor between actions with 262// different argument lists. C++ doesn't support default arguments for 263// function templates, so we have to overload it. 264 265$range i 1..n 266$for i [[ 267$range j 1..i 268template <$for j [[int k$j, ]]typename InnerAction> 269inline internal::WithArgsAction<InnerAction$for j [[, k$j]]> 270WithArgs(const InnerAction& action) { 271 return internal::WithArgsAction<InnerAction$for j [[, k$j]]>(action); 272} 273 274 275]] 276// Creates an action that does actions a1, a2, ..., sequentially in 277// each invocation. 278$range i 2..n 279$for i [[ 280$range j 2..i 281$var types = [[$for j, [[typename Action$j]]]] 282$var Aas = [[$for j [[, Action$j a$j]]]] 283 284template <typename Action1, $types> 285$range k 1..i-1 286 287inline $for k [[internal::DoBothAction<Action$k, ]]Action$i$for k [[>]] 288 289DoAll(Action1 a1$Aas) { 290$if i==2 [[ 291 292 return internal::DoBothAction<Action1, Action2>(a1, a2); 293]] $else [[ 294$range j2 2..i 295 296 return DoAll(a1, DoAll($for j2, [[a$j2]])); 297]] 298 299} 300 301]] 302 303} // namespace testing 304 305// The ACTION* family of macros can be used in a namespace scope to 306// define custom actions easily. The syntax: 307// 308// ACTION(name) { statements; } 309// 310// will define an action with the given name that executes the 311// statements. The value returned by the statements will be used as 312// the return value of the action. Inside the statements, you can 313// refer to the K-th (0-based) argument of the mock function by 314// 'argK', and refer to its type by 'argK_type'. For example: 315// 316// ACTION(IncrementArg1) { 317// arg1_type temp = arg1; 318// return ++(*temp); 319// } 320// 321// allows you to write 322// 323// ...WillOnce(IncrementArg1()); 324// 325// You can also refer to the entire argument tuple and its type by 326// 'args' and 'args_type', and refer to the mock function type and its 327// return type by 'function_type' and 'return_type'. 328// 329// Note that you don't need to specify the types of the mock function 330// arguments. However rest assured that your code is still type-safe: 331// you'll get a compiler error if *arg1 doesn't support the ++ 332// operator, or if the type of ++(*arg1) isn't compatible with the 333// mock function's return type, for example. 334// 335// Sometimes you'll want to parameterize the action. For that you can use 336// another macro: 337// 338// ACTION_P(name, param_name) { statements; } 339// 340// For example: 341// 342// ACTION_P(Add, n) { return arg0 + n; } 343// 344// will allow you to write: 345// 346// ...WillOnce(Add(5)); 347// 348// Note that you don't need to provide the type of the parameter 349// either. If you need to reference the type of a parameter named 350// 'foo', you can write 'foo_type'. For example, in the body of 351// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type 352// of 'n'. 353// 354// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P$n to support 355// multi-parameter actions. 356// 357// For the purpose of typing, you can view 358// 359// ACTION_Pk(Foo, p1, ..., pk) { ... } 360// 361// as shorthand for 362// 363// template <typename p1_type, ..., typename pk_type> 364// FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... } 365// 366// In particular, you can provide the template type arguments 367// explicitly when invoking Foo(), as in Foo<long, bool>(5, false); 368// although usually you can rely on the compiler to infer the types 369// for you automatically. You can assign the result of expression 370// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ..., 371// pk_type>. This can be useful when composing actions. 372// 373// You can also overload actions with different numbers of parameters: 374// 375// ACTION_P(Plus, a) { ... } 376// ACTION_P2(Plus, a, b) { ... } 377// 378// While it's tempting to always use the ACTION* macros when defining 379// a new action, you should also consider implementing ActionInterface 380// or using MakePolymorphicAction() instead, especially if you need to 381// use the action a lot. While these approaches require more work, 382// they give you more control on the types of the mock function 383// arguments and the action parameters, which in general leads to 384// better compiler error messages that pay off in the long run. They 385// also allow overloading actions based on parameter types (as opposed 386// to just based on the number of parameters). 387// 388// CAVEAT: 389// 390// ACTION*() can only be used in a namespace scope. The reason is 391// that C++ doesn't yet allow function-local types to be used to 392// instantiate templates. The up-coming C++0x standard will fix this. 393// Once that's done, we'll consider supporting using ACTION*() inside 394// a function. 395// 396// MORE INFORMATION: 397// 398// To learn more about using these macros, please search for 'ACTION' 399// on https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md 400 401$range i 0..n 402$range k 0..n-1 403 404// An internal macro needed for implementing ACTION*(). 405#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ 406 const args_type& args GTEST_ATTRIBUTE_UNUSED_ 407$for k [[, \ 408 arg$k[[]]_type arg$k GTEST_ATTRIBUTE_UNUSED_]] 409 410 411// Sometimes you want to give an action explicit template parameters 412// that cannot be inferred from its value parameters. ACTION() and 413// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that 414// and can be viewed as an extension to ACTION() and ACTION_P*(). 415// 416// The syntax: 417// 418// ACTION_TEMPLATE(ActionName, 419// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), 420// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } 421// 422// defines an action template that takes m explicit template 423// parameters and n value parameters. name_i is the name of the i-th 424// template parameter, and kind_i specifies whether it's a typename, 425// an integral constant, or a template. p_i is the name of the i-th 426// value parameter. 427// 428// Example: 429// 430// // DuplicateArg<k, T>(output) converts the k-th argument of the mock 431// // function to type T and copies it to *output. 432// ACTION_TEMPLATE(DuplicateArg, 433// HAS_2_TEMPLATE_PARAMS(int, k, typename, T), 434// AND_1_VALUE_PARAMS(output)) { 435// *output = T(::testing::get<k>(args)); 436// } 437// ... 438// int n; 439// EXPECT_CALL(mock, Foo(_, _)) 440// .WillOnce(DuplicateArg<1, unsigned char>(&n)); 441// 442// To create an instance of an action template, write: 443// 444// ActionName<t1, ..., t_m>(v1, ..., v_n) 445// 446// where the ts are the template arguments and the vs are the value 447// arguments. The value argument types are inferred by the compiler. 448// If you want to explicitly specify the value argument types, you can 449// provide additional template arguments: 450// 451// ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n) 452// 453// where u_i is the desired type of v_i. 454// 455// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the 456// number of value parameters, but not on the number of template 457// parameters. Without the restriction, the meaning of the following 458// is unclear: 459// 460// OverloadedAction<int, bool>(x); 461// 462// Are we using a single-template-parameter action where 'bool' refers 463// to the type of x, or are we using a two-template-parameter action 464// where the compiler is asked to infer the type of x? 465// 466// Implementation notes: 467// 468// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and 469// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for 470// implementing ACTION_TEMPLATE. The main trick we use is to create 471// new macro invocations when expanding a macro. For example, we have 472// 473// #define ACTION_TEMPLATE(name, template_params, value_params) 474// ... GMOCK_INTERNAL_DECL_##template_params ... 475// 476// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) 477// to expand to 478// 479// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... 480// 481// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the 482// preprocessor will continue to expand it to 483// 484// ... typename T ... 485// 486// This technique conforms to the C++ standard and is portable. It 487// allows us to implement action templates using O(N) code, where N is 488// the maximum number of template/value parameters supported. Without 489// using it, we'd have to devote O(N^2) amount of code to implement all 490// combinations of m and n. 491 492// Declares the template parameters. 493 494$range j 1..n 495$for j [[ 496$range m 0..j-1 497#define GMOCK_INTERNAL_DECL_HAS_$j[[]] 498_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[kind$m name$m]] 499 500 501]] 502 503// Lists the template parameters. 504 505$for j [[ 506$range m 0..j-1 507#define GMOCK_INTERNAL_LIST_HAS_$j[[]] 508_TEMPLATE_PARAMS($for m, [[kind$m, name$m]]) $for m, [[name$m]] 509 510 511]] 512 513// Declares the types of value parameters. 514 515$for i [[ 516$range j 0..i-1 517#define GMOCK_INTERNAL_DECL_TYPE_AND_$i[[]] 518_VALUE_PARAMS($for j, [[p$j]]) $for j [[, typename p$j##_type]] 519 520 521]] 522 523// Initializes the value parameters. 524 525$for i [[ 526$range j 0..i-1 527#define GMOCK_INTERNAL_INIT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])\ 528 ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(::testing::internal::move(gmock_p$j))]] 529 530 531]] 532 533// Declares the fields for storing the value parameters. 534 535$for i [[ 536$range j 0..i-1 537#define GMOCK_INTERNAL_DEFN_AND_$i[[]] 538_VALUE_PARAMS($for j, [[p$j]]) $for j [[p$j##_type p$j; ]] 539 540 541]] 542 543// Lists the value parameters. 544 545$for i [[ 546$range j 0..i-1 547#define GMOCK_INTERNAL_LIST_AND_$i[[]] 548_VALUE_PARAMS($for j, [[p$j]]) $for j, [[p$j]] 549 550 551]] 552 553// Lists the value parameter types. 554 555$for i [[ 556$range j 0..i-1 557#define GMOCK_INTERNAL_LIST_TYPE_AND_$i[[]] 558_VALUE_PARAMS($for j, [[p$j]]) $for j [[, p$j##_type]] 559 560 561]] 562 563// Declares the value parameters. 564 565$for i [[ 566$range j 0..i-1 567#define GMOCK_INTERNAL_DECL_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] 568$for j, [[p$j##_type p$j]] 569 570 571]] 572 573// The suffix of the class template implementing the action template. 574$for i [[ 575 576 577$range j 0..i-1 578#define GMOCK_INTERNAL_COUNT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]]) [[]] 579$if i==1 [[P]] $elif i>=2 [[P$i]] 580]] 581 582 583// The name of the class template implementing the action template. 584#define GMOCK_ACTION_CLASS_(name, value_params)\ 585 GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) 586 587$range k 0..n-1 588 589#define ACTION_TEMPLATE(name, template_params, value_params)\ 590 template <GMOCK_INTERNAL_DECL_##template_params\ 591 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 592 class GMOCK_ACTION_CLASS_(name, value_params) {\ 593 public:\ 594 explicit GMOCK_ACTION_CLASS_(name, value_params)\ 595 GMOCK_INTERNAL_INIT_##value_params {}\ 596 template <typename F>\ 597 class gmock_Impl : public ::testing::ActionInterface<F> {\ 598 public:\ 599 typedef F function_type;\ 600 typedef typename ::testing::internal::Function<F>::Result return_type;\ 601 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 602 args_type;\ 603 explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ 604 virtual return_type Perform(const args_type& args) {\ 605 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 606 Perform(this, args);\ 607 }\ 608 template <$for k, [[typename arg$k[[]]_type]]>\ 609 return_type gmock_PerformImpl(const args_type& args[[]] 610$for k [[, arg$k[[]]_type arg$k]]) const;\ 611 GMOCK_INTERNAL_DEFN_##value_params\ 612 private:\ 613 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 614 };\ 615 template <typename F> operator ::testing::Action<F>() const {\ 616 return ::testing::Action<F>(\ 617 new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\ 618 }\ 619 GMOCK_INTERNAL_DEFN_##value_params\ 620 private:\ 621 GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ 622 };\ 623 template <GMOCK_INTERNAL_DECL_##template_params\ 624 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 625 inline GMOCK_ACTION_CLASS_(name, value_params)<\ 626 GMOCK_INTERNAL_LIST_##template_params\ 627 GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ 628 GMOCK_INTERNAL_DECL_##value_params) {\ 629 return GMOCK_ACTION_CLASS_(name, value_params)<\ 630 GMOCK_INTERNAL_LIST_##template_params\ 631 GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ 632 GMOCK_INTERNAL_LIST_##value_params);\ 633 }\ 634 template <GMOCK_INTERNAL_DECL_##template_params\ 635 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 636 template <typename F>\ 637 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 638 typename arg3_type, typename arg4_type, typename arg5_type, \ 639 typename arg6_type, typename arg7_type, typename arg8_type, \ 640 typename arg9_type>\ 641 typename ::testing::internal::Function<F>::Result\ 642 GMOCK_ACTION_CLASS_(name, value_params)<\ 643 GMOCK_INTERNAL_LIST_##template_params\ 644 GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\ 645 gmock_PerformImpl(\ 646 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 647 648$for i 649 650[[ 651$var template = [[$if i==0 [[]] $else [[ 652$range j 0..i-1 653 654 template <$for j, [[typename p$j##_type]]>\ 655]]]] 656$var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]] 657 $else [[P$i]]]]]] 658$range j 0..i-1 659$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] 660$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] 661$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::testing::internal::forward<p$j##_type>(gmock_p$j))]]]]]] 662$var param_field_decls = [[$for j 663[[ 664 665 p$j##_type p$j;\ 666]]]] 667$var param_field_decls2 = [[$for j 668[[ 669 670 p$j##_type p$j;\ 671]]]] 672$var params = [[$for j, [[p$j]]]] 673$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] 674$var typename_arg_types = [[$for k, [[typename arg$k[[]]_type]]]] 675$var arg_types_and_names = [[$for k, [[arg$k[[]]_type arg$k]]]] 676$var macro_name = [[$if i==0 [[ACTION]] $elif i==1 [[ACTION_P]] 677 $else [[ACTION_P$i]]]] 678 679#define $macro_name(name$for j [[, p$j]])\$template 680 class $class_name {\ 681 public:\ 682 [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {}\ 683 template <typename F>\ 684 class gmock_Impl : public ::testing::ActionInterface<F> {\ 685 public:\ 686 typedef F function_type;\ 687 typedef typename ::testing::internal::Function<F>::Result return_type;\ 688 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 689 args_type;\ 690 [[$if i==1 [[explicit ]]]]gmock_Impl($ctor_param_list)$inits {}\ 691 virtual return_type Perform(const args_type& args) {\ 692 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 693 Perform(this, args);\ 694 }\ 695 template <$typename_arg_types>\ 696 return_type gmock_PerformImpl(const args_type& args, [[]] 697$arg_types_and_names) const;\$param_field_decls 698 private:\ 699 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 700 };\ 701 template <typename F> operator ::testing::Action<F>() const {\ 702 return ::testing::Action<F>(new gmock_Impl<F>($params));\ 703 }\$param_field_decls2 704 private:\ 705 GTEST_DISALLOW_ASSIGN_($class_name);\ 706 };\$template 707 inline $class_name$param_types name($param_types_and_names) {\ 708 return $class_name$param_types($params);\ 709 }\$template 710 template <typename F>\ 711 template <$typename_arg_types>\ 712 typename ::testing::internal::Function<F>::Result\ 713 $class_name$param_types::gmock_Impl<F>::gmock_PerformImpl(\ 714 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 715]] 716$$ } // This meta comment fixes auto-indentation in Emacs. It won't 717$$ // show up in the generated code. 718 719 720namespace testing { 721 722 723// The ACTION*() macros trigger warning C4100 (unreferenced formal 724// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 725// the macro definition, as the warnings are generated when the macro 726// is expanded and macro expansion cannot contain #pragma. Therefore 727// we suppress them here. 728#ifdef _MSC_VER 729# pragma warning(push) 730# pragma warning(disable:4100) 731#endif 732 733// Various overloads for InvokeArgument<N>(). 734// 735// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th 736// (0-based) argument, which must be a k-ary callable, of the mock 737// function, with arguments a1, a2, ..., a_k. 738// 739// Notes: 740// 741// 1. The arguments are passed by value by default. If you need to 742// pass an argument by reference, wrap it inside ByRef(). For 743// example, 744// 745// InvokeArgument<1>(5, string("Hello"), ByRef(foo)) 746// 747// passes 5 and string("Hello") by value, and passes foo by 748// reference. 749// 750// 2. If the callable takes an argument by reference but ByRef() is 751// not used, it will receive the reference to a copy of the value, 752// instead of the original value. For example, when the 0-th 753// argument of the mock function takes a const string&, the action 754// 755// InvokeArgument<0>(string("Hello")) 756// 757// makes a copy of the temporary string("Hello") object and passes a 758// reference of the copy, instead of the original temporary object, 759// to the callable. This makes it easy for a user to define an 760// InvokeArgument action from temporary values and have it performed 761// later. 762 763namespace internal { 764namespace invoke_argument { 765 766// Appears in InvokeArgumentAdl's argument list to help avoid 767// accidental calls to user functions of the same name. 768struct AdlTag {}; 769 770// InvokeArgumentAdl - a helper for InvokeArgument. 771// The basic overloads are provided here for generic functors. 772// Overloads for other custom-callables are provided in the 773// internal/custom/callback-actions.h header. 774 775$range i 0..n 776$for i 777[[ 778$range j 1..i 779 780template <typename R, typename F[[$for j [[, typename A$j]]]]> 781R InvokeArgumentAdl(AdlTag, F f[[$for j [[, A$j a$j]]]]) { 782 return f([[$for j, [[a$j]]]]); 783} 784]] 785 786} // namespace invoke_argument 787} // namespace internal 788 789$range i 0..n 790$for i [[ 791$range j 0..i-1 792 793ACTION_TEMPLATE(InvokeArgument, 794 HAS_1_TEMPLATE_PARAMS(int, k), 795 AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])) { 796 using internal::invoke_argument::InvokeArgumentAdl; 797 return InvokeArgumentAdl<return_type>( 798 internal::invoke_argument::AdlTag(), 799 ::testing::get<k>(args)$for j [[, p$j]]); 800} 801 802]] 803 804// Various overloads for ReturnNew<T>(). 805// 806// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new 807// instance of type T, constructed on the heap with constructor arguments 808// a1, a2, ..., and a_k. The caller assumes ownership of the returned value. 809$range i 0..n 810$for i [[ 811$range j 0..i-1 812$var ps = [[$for j, [[p$j]]]] 813 814ACTION_TEMPLATE(ReturnNew, 815 HAS_1_TEMPLATE_PARAMS(typename, T), 816 AND_$i[[]]_VALUE_PARAMS($ps)) { 817 return new T($ps); 818} 819 820]] 821 822#ifdef _MSC_VER 823# pragma warning(pop) 824#endif 825 826} // namespace testing 827 828// Include any custom callback actions added by the local installation. 829// We must include this header at the end to make sure it can use the 830// declarations from this file. 831#include "gmock/internal/custom/gmock-generated-actions.h" 832 833#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 834