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@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 44namespace testing { 45 46template <typename T> 47class Matcher; 48 49namespace internal { 50 51// An IgnoredValue object can be implicitly constructed from ANY value. 52// This is used in implementing the IgnoreResult(a) action. 53class 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. 66template <typename Tuple> 67struct MatcherTuple; 68 69template <> 70struct MatcherTuple< ::std::tr1::tuple<> > { 71 typedef ::std::tr1::tuple< > type; 72}; 73 74template <typename A1> 75struct MatcherTuple< ::std::tr1::tuple<A1> > { 76 typedef ::std::tr1::tuple<Matcher<A1> > type; 77}; 78 79template <typename A1, typename A2> 80struct MatcherTuple< ::std::tr1::tuple<A1, A2> > { 81 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2> > type; 82}; 83 84template <typename A1, typename A2, typename A3> 85struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3> > { 86 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type; 87}; 88 89template <typename A1, typename A2, typename A3, typename A4> 90struct 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 95template <typename A1, typename A2, typename A3, typename A4, typename A5> 96struct 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 101template <typename A1, typename A2, typename A3, typename A4, typename A5, 102 typename A6> 103struct 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 108template <typename A1, typename A2, typename A3, typename A4, typename A5, 109 typename A6, typename A7> 110struct 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 115template <typename A1, typename A2, typename A3, typename A4, typename A5, 116 typename A6, typename A7, typename A8> 117struct 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 122template <typename A1, typename A2, typename A3, typename A4, typename A5, 123 typename A6, typename A7, typename A8, typename A9> 124struct 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 129template <typename A1, typename A2, typename A3, typename A4, typename A5, 130 typename A6, typename A7, typename A8, typename A9, typename A10> 131struct 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. 151template <typename F> 152struct Function; 153 154template <typename R> 155struct 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 163template <typename R, typename A1> 164struct 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 173template <typename R, typename A1, typename A2> 174struct 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 183template <typename R, typename A1, typename A2, typename A3> 184struct 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 193template <typename R, typename A1, typename A2, typename A3, typename A4> 194struct 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 203template <typename R, typename A1, typename A2, typename A3, typename A4, 204 typename A5> 205struct 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 214template <typename R, typename A1, typename A2, typename A3, typename A4, 215 typename A5, typename A6> 216struct 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 225template <typename R, typename A1, typename A2, typename A3, typename A4, 226 typename A5, typename A6, typename A7> 227struct 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 236template <typename R, typename A1, typename A2, typename A3, typename A4, 237 typename A5, typename A6, typename A7, typename A8> 238struct 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 247template <typename R, typename A1, typename A2, typename A3, typename A4, 248 typename A5, typename A6, typename A7, typename A8, typename A9> 249struct 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 259template <typename R, typename A1, typename A2, typename A3, typename A4, 260 typename A5, typename A6, typename A7, typename A8, typename A9, 261 typename A10> 262struct 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