[12746] | 1 | $$ -*- mode: c++; -*-
|
---|
| 2 | $var n = 50 $$ Maximum length of type lists we want to support.
|
---|
| 3 | // Copyright 2008 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 | // Type utilities needed for implementing typed and type-parameterized
|
---|
| 35 | // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
|
---|
| 36 | //
|
---|
| 37 | // Currently we support at most $n types in a list, and at most $n
|
---|
| 38 | // type-parameterized tests in one type-parameterized test case.
|
---|
| 39 | // Please contact googletestframework@googlegroups.com if you need
|
---|
| 40 | // more.
|
---|
| 41 |
|
---|
| 42 | #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
|
---|
| 43 | #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
|
---|
| 44 |
|
---|
| 45 | #include "gtest/internal/gtest-port.h"
|
---|
| 46 |
|
---|
| 47 | // #ifdef __GNUC__ is too general here. It is possible to use gcc without using
|
---|
| 48 | // libstdc++ (which is where cxxabi.h comes from).
|
---|
| 49 | # if GTEST_HAS_CXXABI_H_
|
---|
| 50 | # include <cxxabi.h>
|
---|
| 51 | # elif defined(__HP_aCC)
|
---|
| 52 | # include <acxx_demangle.h>
|
---|
| 53 | # endif // GTEST_HASH_CXXABI_H_
|
---|
| 54 |
|
---|
| 55 | namespace testing {
|
---|
| 56 | namespace internal {
|
---|
| 57 |
|
---|
| 58 | // GetTypeName<T>() returns a human-readable name of type T.
|
---|
| 59 | // NB: This function is also used in Google Mock, so don't move it inside of
|
---|
| 60 | // the typed-test-only section below.
|
---|
| 61 | template <typename T>
|
---|
| 62 | std::string GetTypeName() {
|
---|
| 63 | # if GTEST_HAS_RTTI
|
---|
| 64 |
|
---|
| 65 | const char* const name = typeid(T).name();
|
---|
| 66 | # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
|
---|
| 67 | int status = 0;
|
---|
| 68 | // gcc's implementation of typeid(T).name() mangles the type name,
|
---|
| 69 | // so we have to demangle it.
|
---|
| 70 | # if GTEST_HAS_CXXABI_H_
|
---|
| 71 | using abi::__cxa_demangle;
|
---|
| 72 | # endif // GTEST_HAS_CXXABI_H_
|
---|
| 73 | char* const readable_name = __cxa_demangle(name, 0, 0, &status);
|
---|
| 74 | const std::string name_str(status == 0 ? readable_name : name);
|
---|
| 75 | free(readable_name);
|
---|
| 76 | return name_str;
|
---|
| 77 | # else
|
---|
| 78 | return name;
|
---|
| 79 | # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
|
---|
| 80 |
|
---|
| 81 | # else
|
---|
| 82 |
|
---|
| 83 | return "<type>";
|
---|
| 84 |
|
---|
| 85 | # endif // GTEST_HAS_RTTI
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
---|
| 89 |
|
---|
| 90 | // AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
|
---|
| 91 | // type. This can be used as a compile-time assertion to ensure that
|
---|
| 92 | // two types are equal.
|
---|
| 93 |
|
---|
| 94 | template <typename T1, typename T2>
|
---|
| 95 | struct AssertTypeEq;
|
---|
| 96 |
|
---|
| 97 | template <typename T>
|
---|
| 98 | struct AssertTypeEq<T, T> {
|
---|
| 99 | typedef bool type;
|
---|
| 100 | };
|
---|
| 101 |
|
---|
| 102 | // A unique type used as the default value for the arguments of class
|
---|
| 103 | // template Types. This allows us to simulate variadic templates
|
---|
| 104 | // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
|
---|
| 105 | // support directly.
|
---|
| 106 | struct None {};
|
---|
| 107 |
|
---|
| 108 | // The following family of struct and struct templates are used to
|
---|
| 109 | // represent type lists. In particular, TypesN<T1, T2, ..., TN>
|
---|
| 110 | // represents a type list with N types (T1, T2, ..., and TN) in it.
|
---|
| 111 | // Except for Types0, every struct in the family has two member types:
|
---|
| 112 | // Head for the first type in the list, and Tail for the rest of the
|
---|
| 113 | // list.
|
---|
| 114 |
|
---|
| 115 | // The empty type list.
|
---|
| 116 | struct Types0 {};
|
---|
| 117 |
|
---|
| 118 | // Type lists of length 1, 2, 3, and so on.
|
---|
| 119 |
|
---|
| 120 | template <typename T1>
|
---|
| 121 | struct Types1 {
|
---|
| 122 | typedef T1 Head;
|
---|
| 123 | typedef Types0 Tail;
|
---|
| 124 | };
|
---|
| 125 |
|
---|
| 126 | $range i 2..n
|
---|
| 127 |
|
---|
| 128 | $for i [[
|
---|
| 129 | $range j 1..i
|
---|
| 130 | $range k 2..i
|
---|
| 131 | template <$for j, [[typename T$j]]>
|
---|
| 132 | struct Types$i {
|
---|
| 133 | typedef T1 Head;
|
---|
| 134 | typedef Types$(i-1)<$for k, [[T$k]]> Tail;
|
---|
| 135 | };
|
---|
| 136 |
|
---|
| 137 |
|
---|
| 138 | ]]
|
---|
| 139 |
|
---|
| 140 | } // namespace internal
|
---|
| 141 |
|
---|
| 142 | // We don't want to require the users to write TypesN<...> directly,
|
---|
| 143 | // as that would require them to count the length. Types<...> is much
|
---|
| 144 | // easier to write, but generates horrible messages when there is a
|
---|
| 145 | // compiler error, as gcc insists on printing out each template
|
---|
| 146 | // argument, even if it has the default value (this means Types<int>
|
---|
| 147 | // will appear as Types<int, None, None, ..., None> in the compiler
|
---|
| 148 | // errors).
|
---|
| 149 | //
|
---|
| 150 | // Our solution is to combine the best part of the two approaches: a
|
---|
| 151 | // user would write Types<T1, ..., TN>, and Google Test will translate
|
---|
| 152 | // that to TypesN<T1, ..., TN> internally to make error messages
|
---|
| 153 | // readable. The translation is done by the 'type' member of the
|
---|
| 154 | // Types template.
|
---|
| 155 |
|
---|
| 156 | $range i 1..n
|
---|
| 157 | template <$for i, [[typename T$i = internal::None]]>
|
---|
| 158 | struct Types {
|
---|
| 159 | typedef internal::Types$n<$for i, [[T$i]]> type;
|
---|
| 160 | };
|
---|
| 161 |
|
---|
| 162 | template <>
|
---|
| 163 | struct Types<$for i, [[internal::None]]> {
|
---|
| 164 | typedef internal::Types0 type;
|
---|
| 165 | };
|
---|
| 166 |
|
---|
| 167 | $range i 1..n-1
|
---|
| 168 | $for i [[
|
---|
| 169 | $range j 1..i
|
---|
| 170 | $range k i+1..n
|
---|
| 171 | template <$for j, [[typename T$j]]>
|
---|
| 172 | struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
|
---|
| 173 | typedef internal::Types$i<$for j, [[T$j]]> type;
|
---|
| 174 | };
|
---|
| 175 |
|
---|
| 176 | ]]
|
---|
| 177 |
|
---|
| 178 | namespace internal {
|
---|
| 179 |
|
---|
| 180 | # define GTEST_TEMPLATE_ template <typename T> class
|
---|
| 181 |
|
---|
| 182 | // The template "selector" struct TemplateSel<Tmpl> is used to
|
---|
| 183 | // represent Tmpl, which must be a class template with one type
|
---|
| 184 | // parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
|
---|
| 185 | // as the type Tmpl<T>. This allows us to actually instantiate the
|
---|
| 186 | // template "selected" by TemplateSel<Tmpl>.
|
---|
| 187 | //
|
---|
| 188 | // This trick is necessary for simulating typedef for class templates,
|
---|
| 189 | // which C++ doesn't support directly.
|
---|
| 190 | template <GTEST_TEMPLATE_ Tmpl>
|
---|
| 191 | struct TemplateSel {
|
---|
| 192 | template <typename T>
|
---|
| 193 | struct Bind {
|
---|
| 194 | typedef Tmpl<T> type;
|
---|
| 195 | };
|
---|
| 196 | };
|
---|
| 197 |
|
---|
| 198 | # define GTEST_BIND_(TmplSel, T) \
|
---|
| 199 | TmplSel::template Bind<T>::type
|
---|
| 200 |
|
---|
| 201 | // A unique struct template used as the default value for the
|
---|
| 202 | // arguments of class template Templates. This allows us to simulate
|
---|
| 203 | // variadic templates (e.g. Templates<int>, Templates<int, double>,
|
---|
| 204 | // and etc), which C++ doesn't support directly.
|
---|
| 205 | template <typename T>
|
---|
| 206 | struct NoneT {};
|
---|
| 207 |
|
---|
| 208 | // The following family of struct and struct templates are used to
|
---|
| 209 | // represent template lists. In particular, TemplatesN<T1, T2, ...,
|
---|
| 210 | // TN> represents a list of N templates (T1, T2, ..., and TN). Except
|
---|
| 211 | // for Templates0, every struct in the family has two member types:
|
---|
| 212 | // Head for the selector of the first template in the list, and Tail
|
---|
| 213 | // for the rest of the list.
|
---|
| 214 |
|
---|
| 215 | // The empty template list.
|
---|
| 216 | struct Templates0 {};
|
---|
| 217 |
|
---|
| 218 | // Template lists of length 1, 2, 3, and so on.
|
---|
| 219 |
|
---|
| 220 | template <GTEST_TEMPLATE_ T1>
|
---|
| 221 | struct Templates1 {
|
---|
| 222 | typedef TemplateSel<T1> Head;
|
---|
| 223 | typedef Templates0 Tail;
|
---|
| 224 | };
|
---|
| 225 |
|
---|
| 226 | $range i 2..n
|
---|
| 227 |
|
---|
| 228 | $for i [[
|
---|
| 229 | $range j 1..i
|
---|
| 230 | $range k 2..i
|
---|
| 231 | template <$for j, [[GTEST_TEMPLATE_ T$j]]>
|
---|
| 232 | struct Templates$i {
|
---|
| 233 | typedef TemplateSel<T1> Head;
|
---|
| 234 | typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
|
---|
| 235 | };
|
---|
| 236 |
|
---|
| 237 |
|
---|
| 238 | ]]
|
---|
| 239 |
|
---|
| 240 | // We don't want to require the users to write TemplatesN<...> directly,
|
---|
| 241 | // as that would require them to count the length. Templates<...> is much
|
---|
| 242 | // easier to write, but generates horrible messages when there is a
|
---|
| 243 | // compiler error, as gcc insists on printing out each template
|
---|
| 244 | // argument, even if it has the default value (this means Templates<list>
|
---|
| 245 | // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
|
---|
| 246 | // errors).
|
---|
| 247 | //
|
---|
| 248 | // Our solution is to combine the best part of the two approaches: a
|
---|
| 249 | // user would write Templates<T1, ..., TN>, and Google Test will translate
|
---|
| 250 | // that to TemplatesN<T1, ..., TN> internally to make error messages
|
---|
| 251 | // readable. The translation is done by the 'type' member of the
|
---|
| 252 | // Templates template.
|
---|
| 253 |
|
---|
| 254 | $range i 1..n
|
---|
| 255 | template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
|
---|
| 256 | struct Templates {
|
---|
| 257 | typedef Templates$n<$for i, [[T$i]]> type;
|
---|
| 258 | };
|
---|
| 259 |
|
---|
| 260 | template <>
|
---|
| 261 | struct Templates<$for i, [[NoneT]]> {
|
---|
| 262 | typedef Templates0 type;
|
---|
| 263 | };
|
---|
| 264 |
|
---|
| 265 | $range i 1..n-1
|
---|
| 266 | $for i [[
|
---|
| 267 | $range j 1..i
|
---|
| 268 | $range k i+1..n
|
---|
| 269 | template <$for j, [[GTEST_TEMPLATE_ T$j]]>
|
---|
| 270 | struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
|
---|
| 271 | typedef Templates$i<$for j, [[T$j]]> type;
|
---|
| 272 | };
|
---|
| 273 |
|
---|
| 274 | ]]
|
---|
| 275 |
|
---|
| 276 | // The TypeList template makes it possible to use either a single type
|
---|
| 277 | // or a Types<...> list in TYPED_TEST_CASE() and
|
---|
| 278 | // INSTANTIATE_TYPED_TEST_CASE_P().
|
---|
| 279 |
|
---|
| 280 | template <typename T>
|
---|
| 281 | struct TypeList {
|
---|
| 282 | typedef Types1<T> type;
|
---|
| 283 | };
|
---|
| 284 |
|
---|
| 285 |
|
---|
| 286 | $range i 1..n
|
---|
| 287 | template <$for i, [[typename T$i]]>
|
---|
| 288 | struct TypeList<Types<$for i, [[T$i]]> > {
|
---|
| 289 | typedef typename Types<$for i, [[T$i]]>::type type;
|
---|
| 290 | };
|
---|
| 291 |
|
---|
| 292 | #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
---|
| 293 |
|
---|
| 294 | } // namespace internal
|
---|
| 295 | } // namespace testing
|
---|
| 296 |
|
---|
| 297 | #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
|
---|