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