Austin Schuh | 0cbef62 | 2015-09-06 17:34:52 -0700 | [diff] [blame^] | 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 | #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ |
| 42 | #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ |
| 43 | |
| 44 | #include "gmock/internal/gmock-port.h" |
| 45 | |
| 46 | namespace testing { |
| 47 | |
| 48 | template <typename T> |
| 49 | class Matcher; |
| 50 | |
| 51 | namespace internal { |
| 52 | |
| 53 | // An IgnoredValue object can be implicitly constructed from ANY value. |
| 54 | // This is used in implementing the IgnoreResult(a) action. |
| 55 | class IgnoredValue { |
| 56 | public: |
| 57 | // This constructor template allows any value to be implicitly |
| 58 | // converted to IgnoredValue. The object has no data member and |
| 59 | // doesn't try to remember anything about the argument. We |
| 60 | // deliberately omit the 'explicit' keyword in order to allow the |
| 61 | // conversion to be implicit. |
| 62 | template <typename T> |
| 63 | IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit) |
| 64 | }; |
| 65 | |
| 66 | // MatcherTuple<T>::type is a tuple type where each field is a Matcher |
| 67 | // for the corresponding field in tuple type T. |
| 68 | template <typename Tuple> |
| 69 | struct MatcherTuple; |
| 70 | |
| 71 | template <> |
| 72 | struct MatcherTuple< ::testing::tuple<> > { |
| 73 | typedef ::testing::tuple< > type; |
| 74 | }; |
| 75 | |
| 76 | template <typename A1> |
| 77 | struct MatcherTuple< ::testing::tuple<A1> > { |
| 78 | typedef ::testing::tuple<Matcher<A1> > type; |
| 79 | }; |
| 80 | |
| 81 | template <typename A1, typename A2> |
| 82 | struct MatcherTuple< ::testing::tuple<A1, A2> > { |
| 83 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2> > type; |
| 84 | }; |
| 85 | |
| 86 | template <typename A1, typename A2, typename A3> |
| 87 | struct MatcherTuple< ::testing::tuple<A1, A2, A3> > { |
| 88 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type; |
| 89 | }; |
| 90 | |
| 91 | template <typename A1, typename A2, typename A3, typename A4> |
| 92 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4> > { |
| 93 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, |
| 94 | Matcher<A4> > type; |
| 95 | }; |
| 96 | |
| 97 | template <typename A1, typename A2, typename A3, typename A4, typename A5> |
| 98 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5> > { |
| 99 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, |
| 100 | Matcher<A5> > type; |
| 101 | }; |
| 102 | |
| 103 | template <typename A1, typename A2, typename A3, typename A4, typename A5, |
| 104 | typename A6> |
| 105 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6> > { |
| 106 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, |
| 107 | Matcher<A5>, Matcher<A6> > type; |
| 108 | }; |
| 109 | |
| 110 | template <typename A1, typename A2, typename A3, typename A4, typename A5, |
| 111 | typename A6, typename A7> |
| 112 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > { |
| 113 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, |
| 114 | Matcher<A5>, Matcher<A6>, Matcher<A7> > type; |
| 115 | }; |
| 116 | |
| 117 | template <typename A1, typename A2, typename A3, typename A4, typename A5, |
| 118 | typename A6, typename A7, typename A8> |
| 119 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > { |
| 120 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, |
| 121 | Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> > type; |
| 122 | }; |
| 123 | |
| 124 | template <typename A1, typename A2, typename A3, typename A4, typename A5, |
| 125 | typename A6, typename A7, typename A8, typename A9> |
| 126 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > { |
| 127 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, |
| 128 | Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9> > type; |
| 129 | }; |
| 130 | |
| 131 | template <typename A1, typename A2, typename A3, typename A4, typename A5, |
| 132 | typename A6, typename A7, typename A8, typename A9, typename A10> |
| 133 | struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, |
| 134 | A10> > { |
| 135 | typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, |
| 136 | Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9>, |
| 137 | Matcher<A10> > type; |
| 138 | }; |
| 139 | |
| 140 | // Template struct Function<F>, where F must be a function type, contains |
| 141 | // the following typedefs: |
| 142 | // |
| 143 | // Result: the function's return type. |
| 144 | // ArgumentN: the type of the N-th argument, where N starts with 1. |
| 145 | // ArgumentTuple: the tuple type consisting of all parameters of F. |
| 146 | // ArgumentMatcherTuple: the tuple type consisting of Matchers for all |
| 147 | // parameters of F. |
| 148 | // MakeResultVoid: the function type obtained by substituting void |
| 149 | // for the return type of F. |
| 150 | // MakeResultIgnoredValue: |
| 151 | // the function type obtained by substituting Something |
| 152 | // for the return type of F. |
| 153 | template <typename F> |
| 154 | struct Function; |
| 155 | |
| 156 | template <typename R> |
| 157 | struct Function<R()> { |
| 158 | typedef R Result; |
| 159 | typedef ::testing::tuple<> ArgumentTuple; |
| 160 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 161 | typedef void MakeResultVoid(); |
| 162 | typedef IgnoredValue MakeResultIgnoredValue(); |
| 163 | }; |
| 164 | |
| 165 | template <typename R, typename A1> |
| 166 | struct Function<R(A1)> |
| 167 | : Function<R()> { |
| 168 | typedef A1 Argument1; |
| 169 | typedef ::testing::tuple<A1> ArgumentTuple; |
| 170 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 171 | typedef void MakeResultVoid(A1); |
| 172 | typedef IgnoredValue MakeResultIgnoredValue(A1); |
| 173 | }; |
| 174 | |
| 175 | template <typename R, typename A1, typename A2> |
| 176 | struct Function<R(A1, A2)> |
| 177 | : Function<R(A1)> { |
| 178 | typedef A2 Argument2; |
| 179 | typedef ::testing::tuple<A1, A2> ArgumentTuple; |
| 180 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 181 | typedef void MakeResultVoid(A1, A2); |
| 182 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2); |
| 183 | }; |
| 184 | |
| 185 | template <typename R, typename A1, typename A2, typename A3> |
| 186 | struct Function<R(A1, A2, A3)> |
| 187 | : Function<R(A1, A2)> { |
| 188 | typedef A3 Argument3; |
| 189 | typedef ::testing::tuple<A1, A2, A3> ArgumentTuple; |
| 190 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 191 | typedef void MakeResultVoid(A1, A2, A3); |
| 192 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3); |
| 193 | }; |
| 194 | |
| 195 | template <typename R, typename A1, typename A2, typename A3, typename A4> |
| 196 | struct Function<R(A1, A2, A3, A4)> |
| 197 | : Function<R(A1, A2, A3)> { |
| 198 | typedef A4 Argument4; |
| 199 | typedef ::testing::tuple<A1, A2, A3, A4> ArgumentTuple; |
| 200 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 201 | typedef void MakeResultVoid(A1, A2, A3, A4); |
| 202 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4); |
| 203 | }; |
| 204 | |
| 205 | template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 206 | typename A5> |
| 207 | struct Function<R(A1, A2, A3, A4, A5)> |
| 208 | : Function<R(A1, A2, A3, A4)> { |
| 209 | typedef A5 Argument5; |
| 210 | typedef ::testing::tuple<A1, A2, A3, A4, A5> ArgumentTuple; |
| 211 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 212 | typedef void MakeResultVoid(A1, A2, A3, A4, A5); |
| 213 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5); |
| 214 | }; |
| 215 | |
| 216 | template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 217 | typename A5, typename A6> |
| 218 | struct Function<R(A1, A2, A3, A4, A5, A6)> |
| 219 | : Function<R(A1, A2, A3, A4, A5)> { |
| 220 | typedef A6 Argument6; |
| 221 | typedef ::testing::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple; |
| 222 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 223 | typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6); |
| 224 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6); |
| 225 | }; |
| 226 | |
| 227 | template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 228 | typename A5, typename A6, typename A7> |
| 229 | struct Function<R(A1, A2, A3, A4, A5, A6, A7)> |
| 230 | : Function<R(A1, A2, A3, A4, A5, A6)> { |
| 231 | typedef A7 Argument7; |
| 232 | typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple; |
| 233 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 234 | typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7); |
| 235 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7); |
| 236 | }; |
| 237 | |
| 238 | template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 239 | typename A5, typename A6, typename A7, typename A8> |
| 240 | struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> |
| 241 | : Function<R(A1, A2, A3, A4, A5, A6, A7)> { |
| 242 | typedef A8 Argument8; |
| 243 | typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple; |
| 244 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 245 | typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8); |
| 246 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8); |
| 247 | }; |
| 248 | |
| 249 | template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 250 | typename A5, typename A6, typename A7, typename A8, typename A9> |
| 251 | struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> |
| 252 | : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> { |
| 253 | typedef A9 Argument9; |
| 254 | typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple; |
| 255 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 256 | typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9); |
| 257 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, |
| 258 | A9); |
| 259 | }; |
| 260 | |
| 261 | template <typename R, typename A1, typename A2, typename A3, typename A4, |
| 262 | typename A5, typename A6, typename A7, typename A8, typename A9, |
| 263 | typename A10> |
| 264 | struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> |
| 265 | : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> { |
| 266 | typedef A10 Argument10; |
| 267 | typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, |
| 268 | A10> ArgumentTuple; |
| 269 | typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; |
| 270 | typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); |
| 271 | typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, |
| 272 | A9, A10); |
| 273 | }; |
| 274 | |
| 275 | } // namespace internal |
| 276 | |
| 277 | } // namespace testing |
| 278 | |
| 279 | #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ |