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