1b89a7cc2SEnji Cooper // Copyright 2007, Google Inc. 2b89a7cc2SEnji Cooper // All rights reserved. 3b89a7cc2SEnji Cooper // 4b89a7cc2SEnji Cooper // Redistribution and use in source and binary forms, with or without 5b89a7cc2SEnji Cooper // modification, are permitted provided that the following conditions are 6b89a7cc2SEnji Cooper // met: 7b89a7cc2SEnji Cooper // 8b89a7cc2SEnji Cooper // * Redistributions of source code must retain the above copyright 9b89a7cc2SEnji Cooper // notice, this list of conditions and the following disclaimer. 10b89a7cc2SEnji Cooper // * Redistributions in binary form must reproduce the above 11b89a7cc2SEnji Cooper // copyright notice, this list of conditions and the following disclaimer 12b89a7cc2SEnji Cooper // in the documentation and/or other materials provided with the 13b89a7cc2SEnji Cooper // distribution. 14b89a7cc2SEnji Cooper // * Neither the name of Google Inc. nor the names of its 15b89a7cc2SEnji Cooper // contributors may be used to endorse or promote products derived from 16b89a7cc2SEnji Cooper // this software without specific prior written permission. 17b89a7cc2SEnji Cooper // 18b89a7cc2SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19b89a7cc2SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20b89a7cc2SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21b89a7cc2SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22b89a7cc2SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23b89a7cc2SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24b89a7cc2SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25b89a7cc2SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26b89a7cc2SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b89a7cc2SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28b89a7cc2SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29b89a7cc2SEnji Cooper 30b89a7cc2SEnji Cooper // Google Mock - a framework for writing C++ mock classes. 31b89a7cc2SEnji Cooper // 3228f6c2f2SEnji Cooper // This file implements some commonly used variadic actions. 33b89a7cc2SEnji Cooper 3428f6c2f2SEnji Cooper // IWYU pragma: private, include "gmock/gmock.h" 3528f6c2f2SEnji Cooper // IWYU pragma: friend gmock/.* 36b89a7cc2SEnji Cooper 3728f6c2f2SEnji Cooper #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ 3828f6c2f2SEnji Cooper #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ 39b89a7cc2SEnji Cooper 4028f6c2f2SEnji Cooper #include <memory> 4128f6c2f2SEnji Cooper #include <utility> 42b89a7cc2SEnji Cooper 4328f6c2f2SEnji Cooper #include "gmock/gmock-actions.h" 4428f6c2f2SEnji Cooper #include "gmock/internal/gmock-port.h" 4528f6c2f2SEnji Cooper 4628f6c2f2SEnji Cooper // Include any custom callback actions added by the local installation. 4728f6c2f2SEnji Cooper #include "gmock/internal/custom/gmock-generated-actions.h" 4828f6c2f2SEnji Cooper 4928f6c2f2SEnji Cooper // Sometimes you want to give an action explicit template parameters 5028f6c2f2SEnji Cooper // that cannot be inferred from its value parameters. ACTION() and 5128f6c2f2SEnji Cooper // ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that 5228f6c2f2SEnji Cooper // and can be viewed as an extension to ACTION() and ACTION_P*(). 5328f6c2f2SEnji Cooper // 5428f6c2f2SEnji Cooper // The syntax: 5528f6c2f2SEnji Cooper // 5628f6c2f2SEnji Cooper // ACTION_TEMPLATE(ActionName, 5728f6c2f2SEnji Cooper // HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), 5828f6c2f2SEnji Cooper // AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } 5928f6c2f2SEnji Cooper // 6028f6c2f2SEnji Cooper // defines an action template that takes m explicit template 6128f6c2f2SEnji Cooper // parameters and n value parameters. name_i is the name of the i-th 6228f6c2f2SEnji Cooper // template parameter, and kind_i specifies whether it's a typename, 6328f6c2f2SEnji Cooper // an integral constant, or a template. p_i is the name of the i-th 6428f6c2f2SEnji Cooper // value parameter. 6528f6c2f2SEnji Cooper // 6628f6c2f2SEnji Cooper // Example: 6728f6c2f2SEnji Cooper // 6828f6c2f2SEnji Cooper // // DuplicateArg<k, T>(output) converts the k-th argument of the mock 6928f6c2f2SEnji Cooper // // function to type T and copies it to *output. 7028f6c2f2SEnji Cooper // ACTION_TEMPLATE(DuplicateArg, 7128f6c2f2SEnji Cooper // HAS_2_TEMPLATE_PARAMS(int, k, typename, T), 7228f6c2f2SEnji Cooper // AND_1_VALUE_PARAMS(output)) { 7328f6c2f2SEnji Cooper // *output = T(::std::get<k>(args)); 7428f6c2f2SEnji Cooper // } 7528f6c2f2SEnji Cooper // ... 7628f6c2f2SEnji Cooper // int n; 7728f6c2f2SEnji Cooper // EXPECT_CALL(mock, Foo(_, _)) 7828f6c2f2SEnji Cooper // .WillOnce(DuplicateArg<1, unsigned char>(&n)); 7928f6c2f2SEnji Cooper // 8028f6c2f2SEnji Cooper // To create an instance of an action template, write: 8128f6c2f2SEnji Cooper // 8228f6c2f2SEnji Cooper // ActionName<t1, ..., t_m>(v1, ..., v_n) 8328f6c2f2SEnji Cooper // 8428f6c2f2SEnji Cooper // where the ts are the template arguments and the vs are the value 8528f6c2f2SEnji Cooper // arguments. The value argument types are inferred by the compiler. 8628f6c2f2SEnji Cooper // If you want to explicitly specify the value argument types, you can 8728f6c2f2SEnji Cooper // provide additional template arguments: 8828f6c2f2SEnji Cooper // 8928f6c2f2SEnji Cooper // ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n) 9028f6c2f2SEnji Cooper // 9128f6c2f2SEnji Cooper // where u_i is the desired type of v_i. 9228f6c2f2SEnji Cooper // 9328f6c2f2SEnji Cooper // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the 9428f6c2f2SEnji Cooper // number of value parameters, but not on the number of template 9528f6c2f2SEnji Cooper // parameters. Without the restriction, the meaning of the following 9628f6c2f2SEnji Cooper // is unclear: 9728f6c2f2SEnji Cooper // 9828f6c2f2SEnji Cooper // OverloadedAction<int, bool>(x); 9928f6c2f2SEnji Cooper // 10028f6c2f2SEnji Cooper // Are we using a single-template-parameter action where 'bool' refers 10128f6c2f2SEnji Cooper // to the type of x, or are we using a two-template-parameter action 10228f6c2f2SEnji Cooper // where the compiler is asked to infer the type of x? 10328f6c2f2SEnji Cooper // 10428f6c2f2SEnji Cooper // Implementation notes: 10528f6c2f2SEnji Cooper // 10628f6c2f2SEnji Cooper // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and 10728f6c2f2SEnji Cooper // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for 10828f6c2f2SEnji Cooper // implementing ACTION_TEMPLATE. The main trick we use is to create 10928f6c2f2SEnji Cooper // new macro invocations when expanding a macro. For example, we have 11028f6c2f2SEnji Cooper // 11128f6c2f2SEnji Cooper // #define ACTION_TEMPLATE(name, template_params, value_params) 11228f6c2f2SEnji Cooper // ... GMOCK_INTERNAL_DECL_##template_params ... 11328f6c2f2SEnji Cooper // 11428f6c2f2SEnji Cooper // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) 11528f6c2f2SEnji Cooper // to expand to 11628f6c2f2SEnji Cooper // 11728f6c2f2SEnji Cooper // ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... 11828f6c2f2SEnji Cooper // 11928f6c2f2SEnji Cooper // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the 12028f6c2f2SEnji Cooper // preprocessor will continue to expand it to 12128f6c2f2SEnji Cooper // 12228f6c2f2SEnji Cooper // ... typename T ... 12328f6c2f2SEnji Cooper // 12428f6c2f2SEnji Cooper // This technique conforms to the C++ standard and is portable. It 12528f6c2f2SEnji Cooper // allows us to implement action templates using O(N) code, where N is 12628f6c2f2SEnji Cooper // the maximum number of template/value parameters supported. Without 12728f6c2f2SEnji Cooper // using it, we'd have to devote O(N^2) amount of code to implement all 12828f6c2f2SEnji Cooper // combinations of m and n. 12928f6c2f2SEnji Cooper 13028f6c2f2SEnji Cooper // Declares the template parameters. 13128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0 13228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, name1) \ 13328f6c2f2SEnji Cooper kind0 name0, kind1 name1 13428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 13528f6c2f2SEnji Cooper kind2, name2) \ 13628f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2 13728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 13828f6c2f2SEnji Cooper kind2, name2, kind3, name3) \ 13928f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3 14028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS( \ 14128f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4) \ 14228f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4 14328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 14428f6c2f2SEnji Cooper kind2, name2, kind3, name3, \ 14528f6c2f2SEnji Cooper kind4, name4, kind5, name5) \ 14628f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5 14728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS( \ 14828f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 14928f6c2f2SEnji Cooper kind5, name5, kind6, name6) \ 15028f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ 15128f6c2f2SEnji Cooper kind5 name5, kind6 name6 15228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS( \ 15328f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 15428f6c2f2SEnji Cooper kind5, name5, kind6, name6, kind7, name7) \ 15528f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ 15628f6c2f2SEnji Cooper kind5 name5, kind6 name6, kind7 name7 15728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS( \ 15828f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 15928f6c2f2SEnji Cooper kind5, name5, kind6, name6, kind7, name7, kind8, name8) \ 16028f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ 16128f6c2f2SEnji Cooper kind5 name5, kind6 name6, kind7 name7, kind8 name8 16228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS( \ 16328f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 16428f6c2f2SEnji Cooper kind5, name5, kind6, name6, kind7, name7, kind8, name8, kind9, name9) \ 16528f6c2f2SEnji Cooper kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ 16628f6c2f2SEnji Cooper kind5 name5, kind6 name6, kind7 name7, kind8 name8, kind9 name9 16728f6c2f2SEnji Cooper 16828f6c2f2SEnji Cooper // Lists the template parameters. 16928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0 17028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, name1) \ 17128f6c2f2SEnji Cooper name0, name1 17228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 17328f6c2f2SEnji Cooper kind2, name2) \ 17428f6c2f2SEnji Cooper name0, name1, name2 17528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 17628f6c2f2SEnji Cooper kind2, name2, kind3, name3) \ 17728f6c2f2SEnji Cooper name0, name1, name2, name3 17828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS( \ 17928f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4) \ 18028f6c2f2SEnji Cooper name0, name1, name2, name3, name4 18128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 18228f6c2f2SEnji Cooper kind2, name2, kind3, name3, \ 18328f6c2f2SEnji Cooper kind4, name4, kind5, name5) \ 18428f6c2f2SEnji Cooper name0, name1, name2, name3, name4, name5 18528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS( \ 18628f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 18728f6c2f2SEnji Cooper kind5, name5, kind6, name6) \ 18828f6c2f2SEnji Cooper name0, name1, name2, name3, name4, name5, name6 18928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS( \ 19028f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 19128f6c2f2SEnji Cooper kind5, name5, kind6, name6, kind7, name7) \ 19228f6c2f2SEnji Cooper name0, name1, name2, name3, name4, name5, name6, name7 19328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS( \ 19428f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 19528f6c2f2SEnji Cooper kind5, name5, kind6, name6, kind7, name7, kind8, name8) \ 19628f6c2f2SEnji Cooper name0, name1, name2, name3, name4, name5, name6, name7, name8 19728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS( \ 19828f6c2f2SEnji Cooper kind0, name0, kind1, name1, kind2, name2, kind3, name3, kind4, name4, \ 19928f6c2f2SEnji Cooper kind5, name5, kind6, name6, kind7, name7, kind8, name8, kind9, name9) \ 20028f6c2f2SEnji Cooper name0, name1, name2, name3, name4, name5, name6, name7, name8, name9 20128f6c2f2SEnji Cooper 20228f6c2f2SEnji Cooper // Declares the types of value parameters. 20328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS() 20428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type 20528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) \ 20628f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type 20728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) \ 20828f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type 20928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) \ 21028f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 21128f6c2f2SEnji Cooper typename p3##_type 21228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) \ 21328f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 21428f6c2f2SEnji Cooper typename p3##_type, typename p4##_type 21528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) \ 21628f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 21728f6c2f2SEnji Cooper typename p3##_type, typename p4##_type, typename p5##_type 21828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 21928f6c2f2SEnji Cooper p6) \ 22028f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 22128f6c2f2SEnji Cooper typename p3##_type, typename p4##_type, typename p5##_type, \ 22228f6c2f2SEnji Cooper typename p6##_type 22328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 22428f6c2f2SEnji Cooper p6, p7) \ 22528f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 22628f6c2f2SEnji Cooper typename p3##_type, typename p4##_type, typename p5##_type, \ 22728f6c2f2SEnji Cooper typename p6##_type, typename p7##_type 22828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 22928f6c2f2SEnji Cooper p6, p7, p8) \ 23028f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 23128f6c2f2SEnji Cooper typename p3##_type, typename p4##_type, typename p5##_type, \ 23228f6c2f2SEnji Cooper typename p6##_type, typename p7##_type, typename p8##_type 23328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 23428f6c2f2SEnji Cooper p6, p7, p8, p9) \ 23528f6c2f2SEnji Cooper , typename p0##_type, typename p1##_type, typename p2##_type, \ 23628f6c2f2SEnji Cooper typename p3##_type, typename p4##_type, typename p5##_type, \ 23728f6c2f2SEnji Cooper typename p6##_type, typename p7##_type, typename p8##_type, \ 23828f6c2f2SEnji Cooper typename p9##_type 23928f6c2f2SEnji Cooper 24028f6c2f2SEnji Cooper // Initializes the value parameters. 24128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS() () 24228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0) \ 24328f6c2f2SEnji Cooper (p0##_type gmock_p0) : p0(::std::move(gmock_p0)) 24428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1) \ 24528f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1) \ 24628f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)) 24728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2) \ 24828f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2) \ 24928f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 25028f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 25128f6c2f2SEnji Cooper p2(::std::move(gmock_p2)) 25228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) \ 25328f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 25428f6c2f2SEnji Cooper p3##_type gmock_p3) \ 25528f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 25628f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 25728f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 25828f6c2f2SEnji Cooper p3(::std::move(gmock_p3)) 25928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) \ 26028f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 26128f6c2f2SEnji Cooper p3##_type gmock_p3, p4##_type gmock_p4) \ 26228f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 26328f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 26428f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 26528f6c2f2SEnji Cooper p3(::std::move(gmock_p3)), \ 26628f6c2f2SEnji Cooper p4(::std::move(gmock_p4)) 26728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) \ 26828f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 26928f6c2f2SEnji Cooper p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5) \ 27028f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 27128f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 27228f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 27328f6c2f2SEnji Cooper p3(::std::move(gmock_p3)), \ 27428f6c2f2SEnji Cooper p4(::std::move(gmock_p4)), \ 27528f6c2f2SEnji Cooper p5(::std::move(gmock_p5)) 27628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) \ 27728f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 27828f6c2f2SEnji Cooper p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 27928f6c2f2SEnji Cooper p6##_type gmock_p6) \ 28028f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 28128f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 28228f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 28328f6c2f2SEnji Cooper p3(::std::move(gmock_p3)), \ 28428f6c2f2SEnji Cooper p4(::std::move(gmock_p4)), \ 28528f6c2f2SEnji Cooper p5(::std::move(gmock_p5)), \ 28628f6c2f2SEnji Cooper p6(::std::move(gmock_p6)) 28728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7) \ 28828f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 28928f6c2f2SEnji Cooper p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 29028f6c2f2SEnji Cooper p6##_type gmock_p6, p7##_type gmock_p7) \ 29128f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 29228f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 29328f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 29428f6c2f2SEnji Cooper p3(::std::move(gmock_p3)), \ 29528f6c2f2SEnji Cooper p4(::std::move(gmock_p4)), \ 29628f6c2f2SEnji Cooper p5(::std::move(gmock_p5)), \ 29728f6c2f2SEnji Cooper p6(::std::move(gmock_p6)), \ 29828f6c2f2SEnji Cooper p7(::std::move(gmock_p7)) 29928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, \ 30028f6c2f2SEnji Cooper p8) \ 30128f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 30228f6c2f2SEnji Cooper p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 30328f6c2f2SEnji Cooper p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8) \ 30428f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 30528f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 30628f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 30728f6c2f2SEnji Cooper p3(::std::move(gmock_p3)), \ 30828f6c2f2SEnji Cooper p4(::std::move(gmock_p4)), \ 30928f6c2f2SEnji Cooper p5(::std::move(gmock_p5)), \ 31028f6c2f2SEnji Cooper p6(::std::move(gmock_p6)), \ 31128f6c2f2SEnji Cooper p7(::std::move(gmock_p7)), \ 31228f6c2f2SEnji Cooper p8(::std::move(gmock_p8)) 31328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 31428f6c2f2SEnji Cooper p7, p8, p9) \ 31528f6c2f2SEnji Cooper (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 31628f6c2f2SEnji Cooper p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 31728f6c2f2SEnji Cooper p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 31828f6c2f2SEnji Cooper p9##_type gmock_p9) \ 31928f6c2f2SEnji Cooper : p0(::std::move(gmock_p0)), \ 32028f6c2f2SEnji Cooper p1(::std::move(gmock_p1)), \ 32128f6c2f2SEnji Cooper p2(::std::move(gmock_p2)), \ 32228f6c2f2SEnji Cooper p3(::std::move(gmock_p3)), \ 32328f6c2f2SEnji Cooper p4(::std::move(gmock_p4)), \ 32428f6c2f2SEnji Cooper p5(::std::move(gmock_p5)), \ 32528f6c2f2SEnji Cooper p6(::std::move(gmock_p6)), \ 32628f6c2f2SEnji Cooper p7(::std::move(gmock_p7)), \ 32728f6c2f2SEnji Cooper p8(::std::move(gmock_p8)), \ 32828f6c2f2SEnji Cooper p9(::std::move(gmock_p9)) 32928f6c2f2SEnji Cooper 33028f6c2f2SEnji Cooper // Defines the copy constructor 33128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_0_VALUE_PARAMS() \ 33228f6c2f2SEnji Cooper {} // Avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134 33328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_1_VALUE_PARAMS(...) = default; 33428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_2_VALUE_PARAMS(...) = default; 33528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_3_VALUE_PARAMS(...) = default; 33628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_4_VALUE_PARAMS(...) = default; 33728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_5_VALUE_PARAMS(...) = default; 33828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_6_VALUE_PARAMS(...) = default; 33928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_7_VALUE_PARAMS(...) = default; 34028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_8_VALUE_PARAMS(...) = default; 34128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_9_VALUE_PARAMS(...) = default; 34228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_COPY_AND_10_VALUE_PARAMS(...) = default; 34328f6c2f2SEnji Cooper 34428f6c2f2SEnji Cooper // Declares the fields for storing the value parameters. 34528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() 34628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0; 34728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) \ 34828f6c2f2SEnji Cooper p0##_type p0; \ 34928f6c2f2SEnji Cooper p1##_type p1; 35028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) \ 35128f6c2f2SEnji Cooper p0##_type p0; \ 35228f6c2f2SEnji Cooper p1##_type p1; \ 35328f6c2f2SEnji Cooper p2##_type p2; 35428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) \ 35528f6c2f2SEnji Cooper p0##_type p0; \ 35628f6c2f2SEnji Cooper p1##_type p1; \ 35728f6c2f2SEnji Cooper p2##_type p2; \ 35828f6c2f2SEnji Cooper p3##_type p3; 35928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) \ 36028f6c2f2SEnji Cooper p0##_type p0; \ 36128f6c2f2SEnji Cooper p1##_type p1; \ 36228f6c2f2SEnji Cooper p2##_type p2; \ 36328f6c2f2SEnji Cooper p3##_type p3; \ 36428f6c2f2SEnji Cooper p4##_type p4; 36528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) \ 36628f6c2f2SEnji Cooper p0##_type p0; \ 36728f6c2f2SEnji Cooper p1##_type p1; \ 36828f6c2f2SEnji Cooper p2##_type p2; \ 36928f6c2f2SEnji Cooper p3##_type p3; \ 37028f6c2f2SEnji Cooper p4##_type p4; \ 37128f6c2f2SEnji Cooper p5##_type p5; 37228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) \ 37328f6c2f2SEnji Cooper p0##_type p0; \ 37428f6c2f2SEnji Cooper p1##_type p1; \ 37528f6c2f2SEnji Cooper p2##_type p2; \ 37628f6c2f2SEnji Cooper p3##_type p3; \ 37728f6c2f2SEnji Cooper p4##_type p4; \ 37828f6c2f2SEnji Cooper p5##_type p5; \ 37928f6c2f2SEnji Cooper p6##_type p6; 38028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7) \ 38128f6c2f2SEnji Cooper p0##_type p0; \ 38228f6c2f2SEnji Cooper p1##_type p1; \ 38328f6c2f2SEnji Cooper p2##_type p2; \ 38428f6c2f2SEnji Cooper p3##_type p3; \ 38528f6c2f2SEnji Cooper p4##_type p4; \ 38628f6c2f2SEnji Cooper p5##_type p5; \ 38728f6c2f2SEnji Cooper p6##_type p6; \ 38828f6c2f2SEnji Cooper p7##_type p7; 38928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, \ 39028f6c2f2SEnji Cooper p8) \ 39128f6c2f2SEnji Cooper p0##_type p0; \ 39228f6c2f2SEnji Cooper p1##_type p1; \ 39328f6c2f2SEnji Cooper p2##_type p2; \ 39428f6c2f2SEnji Cooper p3##_type p3; \ 39528f6c2f2SEnji Cooper p4##_type p4; \ 39628f6c2f2SEnji Cooper p5##_type p5; \ 39728f6c2f2SEnji Cooper p6##_type p6; \ 39828f6c2f2SEnji Cooper p7##_type p7; \ 39928f6c2f2SEnji Cooper p8##_type p8; 40028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 40128f6c2f2SEnji Cooper p7, p8, p9) \ 40228f6c2f2SEnji Cooper p0##_type p0; \ 40328f6c2f2SEnji Cooper p1##_type p1; \ 40428f6c2f2SEnji Cooper p2##_type p2; \ 40528f6c2f2SEnji Cooper p3##_type p3; \ 40628f6c2f2SEnji Cooper p4##_type p4; \ 40728f6c2f2SEnji Cooper p5##_type p5; \ 40828f6c2f2SEnji Cooper p6##_type p6; \ 40928f6c2f2SEnji Cooper p7##_type p7; \ 41028f6c2f2SEnji Cooper p8##_type p8; \ 41128f6c2f2SEnji Cooper p9##_type p9; 41228f6c2f2SEnji Cooper 41328f6c2f2SEnji Cooper // Lists the value parameters. 41428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS() 41528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0 41628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1 41728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2 41828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3 41928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) \ 42028f6c2f2SEnji Cooper p0, p1, p2, p3, p4 42128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) \ 42228f6c2f2SEnji Cooper p0, p1, p2, p3, p4, p5 42328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) \ 42428f6c2f2SEnji Cooper p0, p1, p2, p3, p4, p5, p6 42528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7) \ 42628f6c2f2SEnji Cooper p0, p1, p2, p3, p4, p5, p6, p7 42728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, \ 42828f6c2f2SEnji Cooper p8) \ 42928f6c2f2SEnji Cooper p0, p1, p2, p3, p4, p5, p6, p7, p8 43028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 43128f6c2f2SEnji Cooper p7, p8, p9) \ 43228f6c2f2SEnji Cooper p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 43328f6c2f2SEnji Cooper 43428f6c2f2SEnji Cooper // Lists the value parameter types. 43528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS() 43628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type 43728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) \ 43828f6c2f2SEnji Cooper , p0##_type, p1##_type 43928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) \ 44028f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type 44128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) \ 44228f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type 44328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) \ 44428f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type 44528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) \ 44628f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type 44728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 44828f6c2f2SEnji Cooper p6) \ 44928f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type 45028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 45128f6c2f2SEnji Cooper p6, p7) \ 45228f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ 45328f6c2f2SEnji Cooper p6##_type, p7##_type 45428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 45528f6c2f2SEnji Cooper p6, p7, p8) \ 45628f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ 45728f6c2f2SEnji Cooper p6##_type, p7##_type, p8##_type 45828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 45928f6c2f2SEnji Cooper p6, p7, p8, p9) \ 46028f6c2f2SEnji Cooper , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ 46128f6c2f2SEnji Cooper p6##_type, p7##_type, p8##_type, p9##_type 46228f6c2f2SEnji Cooper 46328f6c2f2SEnji Cooper // Declares the value parameters. 46428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS() 46528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0 46628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) \ 46728f6c2f2SEnji Cooper p0##_type p0, p1##_type p1 46828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) \ 46928f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2 47028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) \ 47128f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3 47228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) \ 47328f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4 47428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) \ 47528f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 47628f6c2f2SEnji Cooper p5##_type p5 47728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) \ 47828f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 47928f6c2f2SEnji Cooper p5##_type p5, p6##_type p6 48028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7) \ 48128f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 48228f6c2f2SEnji Cooper p5##_type p5, p6##_type p6, p7##_type p7 48328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, \ 48428f6c2f2SEnji Cooper p8) \ 48528f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 48628f6c2f2SEnji Cooper p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8 48728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 48828f6c2f2SEnji Cooper p7, p8, p9) \ 48928f6c2f2SEnji Cooper p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 49028f6c2f2SEnji Cooper p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, p9##_type p9 49128f6c2f2SEnji Cooper 49228f6c2f2SEnji Cooper // The suffix of the class template implementing the action template. 49328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS() 49428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P 49528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2 49628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3 49728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4 49828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5 49928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6 50028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7 50128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 50228f6c2f2SEnji Cooper p7) \ 50328f6c2f2SEnji Cooper P8 50428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 50528f6c2f2SEnji Cooper p7, p8) \ 50628f6c2f2SEnji Cooper P9 50728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 50828f6c2f2SEnji Cooper p7, p8, p9) \ 50928f6c2f2SEnji Cooper P10 51028f6c2f2SEnji Cooper 51128f6c2f2SEnji Cooper // The name of the class template implementing the action template. 51228f6c2f2SEnji Cooper #define GMOCK_ACTION_CLASS_(name, value_params) \ 51328f6c2f2SEnji Cooper GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) 51428f6c2f2SEnji Cooper 51528f6c2f2SEnji Cooper #define ACTION_TEMPLATE(name, template_params, value_params) \ 51628f6c2f2SEnji Cooper template <GMOCK_INTERNAL_DECL_##template_params \ 51728f6c2f2SEnji Cooper GMOCK_INTERNAL_DECL_TYPE_##value_params> \ 51828f6c2f2SEnji Cooper class GMOCK_ACTION_CLASS_(name, value_params) { \ 51928f6c2f2SEnji Cooper public: \ 52028f6c2f2SEnji Cooper explicit GMOCK_ACTION_CLASS_(name, value_params)( \ 52128f6c2f2SEnji Cooper GMOCK_INTERNAL_DECL_##value_params) \ 52228f6c2f2SEnji Cooper GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \ 52328f6c2f2SEnji Cooper = default; \ 52428f6c2f2SEnji Cooper , \ 52528f6c2f2SEnji Cooper : impl_(std::make_shared<gmock_Impl>( \ 52628f6c2f2SEnji Cooper GMOCK_INTERNAL_LIST_##value_params)){}) \ 52728f6c2f2SEnji Cooper GMOCK_ACTION_CLASS_(name, value_params)(const GMOCK_ACTION_CLASS_( \ 52828f6c2f2SEnji Cooper name, value_params) &) noexcept GMOCK_INTERNAL_DEFN_COPY_ \ 52928f6c2f2SEnji Cooper ##value_params \ 53028f6c2f2SEnji Cooper GMOCK_ACTION_CLASS_(name, value_params)(GMOCK_ACTION_CLASS_( \ 53128f6c2f2SEnji Cooper name, value_params) &&) noexcept GMOCK_INTERNAL_DEFN_COPY_ \ 53228f6c2f2SEnji Cooper ##value_params template <typename F> \ 53328f6c2f2SEnji Cooper operator ::testing::Action<F>() const { \ 53428f6c2f2SEnji Cooper return GMOCK_PP_IF( \ 53528f6c2f2SEnji Cooper GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \ 53628f6c2f2SEnji Cooper (::testing::internal::MakeAction<F, gmock_Impl>()), \ 53728f6c2f2SEnji Cooper (::testing::internal::MakeAction<F>(impl_))); \ 53828f6c2f2SEnji Cooper } \ 53928f6c2f2SEnji Cooper \ 54028f6c2f2SEnji Cooper private: \ 54128f6c2f2SEnji Cooper class gmock_Impl { \ 54228f6c2f2SEnji Cooper public: \ 54328f6c2f2SEnji Cooper explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {} \ 54428f6c2f2SEnji Cooper template <typename function_type, typename return_type, \ 54528f6c2f2SEnji Cooper typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \ 54628f6c2f2SEnji Cooper return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \ 54728f6c2f2SEnji Cooper GMOCK_INTERNAL_DEFN_##value_params \ 54828f6c2f2SEnji Cooper }; \ 54928f6c2f2SEnji Cooper GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), , \ 55028f6c2f2SEnji Cooper std::shared_ptr<const gmock_Impl> impl_;) \ 55128f6c2f2SEnji Cooper }; \ 55228f6c2f2SEnji Cooper template <GMOCK_INTERNAL_DECL_##template_params \ 55328f6c2f2SEnji Cooper GMOCK_INTERNAL_DECL_TYPE_##value_params> \ 55428f6c2f2SEnji Cooper GMOCK_ACTION_CLASS_( \ 55528f6c2f2SEnji Cooper name, value_params)<GMOCK_INTERNAL_LIST_##template_params \ 55628f6c2f2SEnji Cooper GMOCK_INTERNAL_LIST_TYPE_##value_params> \ 55728f6c2f2SEnji Cooper name(GMOCK_INTERNAL_DECL_##value_params) GTEST_MUST_USE_RESULT_; \ 55828f6c2f2SEnji Cooper template <GMOCK_INTERNAL_DECL_##template_params \ 55928f6c2f2SEnji Cooper GMOCK_INTERNAL_DECL_TYPE_##value_params> \ 56028f6c2f2SEnji Cooper inline GMOCK_ACTION_CLASS_( \ 56128f6c2f2SEnji Cooper name, value_params)<GMOCK_INTERNAL_LIST_##template_params \ 56228f6c2f2SEnji Cooper GMOCK_INTERNAL_LIST_TYPE_##value_params> \ 56328f6c2f2SEnji Cooper name(GMOCK_INTERNAL_DECL_##value_params) { \ 56428f6c2f2SEnji Cooper return GMOCK_ACTION_CLASS_( \ 56528f6c2f2SEnji Cooper name, value_params)<GMOCK_INTERNAL_LIST_##template_params \ 56628f6c2f2SEnji Cooper GMOCK_INTERNAL_LIST_TYPE_##value_params>( \ 56728f6c2f2SEnji Cooper GMOCK_INTERNAL_LIST_##value_params); \ 56828f6c2f2SEnji Cooper } \ 56928f6c2f2SEnji Cooper template <GMOCK_INTERNAL_DECL_##template_params \ 57028f6c2f2SEnji Cooper GMOCK_INTERNAL_DECL_TYPE_##value_params> \ 57128f6c2f2SEnji Cooper template <typename function_type, typename return_type, typename args_type, \ 57228f6c2f2SEnji Cooper GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \ 57328f6c2f2SEnji Cooper return_type GMOCK_ACTION_CLASS_( \ 57428f6c2f2SEnji Cooper name, value_params)<GMOCK_INTERNAL_LIST_##template_params \ 57528f6c2f2SEnji Cooper GMOCK_INTERNAL_LIST_TYPE_##value_params>:: \ 57628f6c2f2SEnji Cooper gmock_Impl::gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) \ 57728f6c2f2SEnji Cooper const 578b89a7cc2SEnji Cooper 579b89a7cc2SEnji Cooper namespace testing { 580b89a7cc2SEnji Cooper 581b89a7cc2SEnji Cooper // The ACTION*() macros trigger warning C4100 (unreferenced formal 582b89a7cc2SEnji Cooper // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 583b89a7cc2SEnji Cooper // the macro definition, as the warnings are generated when the macro 584b89a7cc2SEnji Cooper // is expanded and macro expansion cannot contain #pragma. Therefore 585b89a7cc2SEnji Cooper // we suppress them here. 58628f6c2f2SEnji Cooper GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100) 587b89a7cc2SEnji Cooper 58828f6c2f2SEnji Cooper namespace internal { 58928f6c2f2SEnji Cooper 59028f6c2f2SEnji Cooper // internal::InvokeArgument - a helper for InvokeArgument action. 59128f6c2f2SEnji Cooper // The basic overloads are provided here for generic functors. 59228f6c2f2SEnji Cooper // Overloads for other custom-callables are provided in the 59328f6c2f2SEnji Cooper // internal/custom/gmock-generated-actions.h header. 59428f6c2f2SEnji Cooper template <typename F, typename... Args> 595*5ca8c28cSEnji Cooper auto InvokeArgument(F &&f, 596*5ca8c28cSEnji Cooper Args... args) -> decltype(std::forward<F>(f)(args...)) { 597*5ca8c28cSEnji Cooper return std::forward<F>(f)(args...); 598b89a7cc2SEnji Cooper } 599b89a7cc2SEnji Cooper 60028f6c2f2SEnji Cooper template <std::size_t index, typename... Params> 60128f6c2f2SEnji Cooper struct InvokeArgumentAction { 60228f6c2f2SEnji Cooper template <typename... Args, 60328f6c2f2SEnji Cooper typename = typename std::enable_if<(index < sizeof...(Args))>::type> 60428f6c2f2SEnji Cooper auto operator()(Args &&...args) const -> decltype(internal::InvokeArgument( 60528f6c2f2SEnji Cooper std::get<index>(std::forward_as_tuple(std::forward<Args>(args)...)), 60628f6c2f2SEnji Cooper std::declval<const Params &>()...)) { 60728f6c2f2SEnji Cooper internal::FlatTuple<Args &&...> args_tuple(FlatTupleConstructTag{}, 60828f6c2f2SEnji Cooper std::forward<Args>(args)...); 60928f6c2f2SEnji Cooper return params.Apply([&](const Params &...unpacked_params) { 610*5ca8c28cSEnji Cooper auto &&callable = std::move(args_tuple.template Get<index>()); 61128f6c2f2SEnji Cooper return internal::InvokeArgument( 61228f6c2f2SEnji Cooper std::forward<decltype(callable)>(callable), unpacked_params...); 61328f6c2f2SEnji Cooper }); 614b89a7cc2SEnji Cooper } 615b89a7cc2SEnji Cooper 61628f6c2f2SEnji Cooper internal::FlatTuple<Params...> params; 61728f6c2f2SEnji Cooper }; 61828f6c2f2SEnji Cooper 61928f6c2f2SEnji Cooper } // namespace internal 62028f6c2f2SEnji Cooper 62128f6c2f2SEnji Cooper // The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th 62228f6c2f2SEnji Cooper // (0-based) argument, which must be a k-ary callable, of the mock 62328f6c2f2SEnji Cooper // function, with arguments a1, a2, ..., a_k. 62428f6c2f2SEnji Cooper // 62528f6c2f2SEnji Cooper // Notes: 62628f6c2f2SEnji Cooper // 62728f6c2f2SEnji Cooper // 1. The arguments are passed by value by default. If you need to 62828f6c2f2SEnji Cooper // pass an argument by reference, wrap it inside std::ref(). For 62928f6c2f2SEnji Cooper // example, 63028f6c2f2SEnji Cooper // 63128f6c2f2SEnji Cooper // InvokeArgument<1>(5, string("Hello"), std::ref(foo)) 63228f6c2f2SEnji Cooper // 63328f6c2f2SEnji Cooper // passes 5 and string("Hello") by value, and passes foo by 63428f6c2f2SEnji Cooper // reference. 63528f6c2f2SEnji Cooper // 63628f6c2f2SEnji Cooper // 2. If the callable takes an argument by reference but std::ref() is 63728f6c2f2SEnji Cooper // not used, it will receive the reference to a copy of the value, 63828f6c2f2SEnji Cooper // instead of the original value. For example, when the 0-th 63928f6c2f2SEnji Cooper // argument of the mock function takes a const string&, the action 64028f6c2f2SEnji Cooper // 64128f6c2f2SEnji Cooper // InvokeArgument<0>(string("Hello")) 64228f6c2f2SEnji Cooper // 64328f6c2f2SEnji Cooper // makes a copy of the temporary string("Hello") object and passes a 64428f6c2f2SEnji Cooper // reference of the copy, instead of the original temporary object, 64528f6c2f2SEnji Cooper // to the callable. This makes it easy for a user to define an 64628f6c2f2SEnji Cooper // InvokeArgument action from temporary values and have it performed 64728f6c2f2SEnji Cooper // later. 64828f6c2f2SEnji Cooper template <std::size_t index, typename... Params> 64928f6c2f2SEnji Cooper internal::InvokeArgumentAction<index, typename std::decay<Params>::type...> 65028f6c2f2SEnji Cooper InvokeArgument(Params &&...params) { 65128f6c2f2SEnji Cooper return {internal::FlatTuple<typename std::decay<Params>::type...>( 65228f6c2f2SEnji Cooper internal::FlatTupleConstructTag{}, std::forward<Params>(params)...)}; 653b89a7cc2SEnji Cooper } 654b89a7cc2SEnji Cooper 65528f6c2f2SEnji Cooper GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 656b89a7cc2SEnji Cooper 657b89a7cc2SEnji Cooper } // namespace testing 658b89a7cc2SEnji Cooper 65928f6c2f2SEnji Cooper #endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ 660