1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$$ -*- mode: c++; -*-
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$var n = 50  $$ Maximum length of type lists we want to support.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2008 Google Inc.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All Rights Reserved.
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan)
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Type utilities needed for implementing typed and type-parameterized
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Currently we support at most $n types in a list, and at most $n
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// type-parameterized tests in one type-parameterized test case.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Please contact googletestframework@googlegroups.com if you need
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// more.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-port.h"
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-string.h"
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// libstdc++ (which is where cxxabi.h comes from).
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# ifdef __GLIBCXX__
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  include <cxxabi.h>
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif  // __GLIBCXX__
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// GetTypeName<T>() returns a human-readable name of type T.
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// NB: This function is also used in Google Mock, so don't move it inside of
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// the typed-test-only section below.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochString GetTypeName() {
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# if GTEST_HAS_RTTI
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* const name = typeid(T).name();
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  ifdef __GLIBCXX__
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int status = 0;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // gcc's implementation of typeid(T).name() mangles the type name,
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // so we have to demangle it.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const String name_str(status == 0 ? readable_name : name);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  free(readable_name);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return name_str;
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  else
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return name;
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#  endif  // __GLIBCXX__
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# else
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return "<type>";
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# endif  // GTEST_HAS_RTTI
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// type.  This can be used as a compile-time assertion to ensure that
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// two types are equal.
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentemplate <typename T1, typename T2>
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct AssertTypeEq;
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentemplate <typename T>
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct AssertTypeEq<T, T> {
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef bool type;
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A unique type used as the default value for the arguments of class
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// template Types.  This allows us to simulate variadic templates
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// support directly.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct None {};
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following family of struct and struct templates are used to
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// represents a type list with N types (T1, T2, ..., and TN) in it.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Except for Types0, every struct in the family has two member types:
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Head for the first type in the list, and Tail for the rest of the
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// list.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The empty type list.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Types0 {};
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Type lists of length 1, 2, 3, and so on.
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T1>
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Types1 {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef T1 Head;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Types0 Tail;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 2..n
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$for i [[
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range j 1..i
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range k 2..i
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for j, [[typename T$j]]>
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Types$i {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef T1 Head;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Types$(i-1)<$for k, [[T$k]]> Tail;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch]]
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We don't want to require the users to write TypesN<...> directly,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as that would require them to count the length.  Types<...> is much
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// easier to write, but generates horrible messages when there is a
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// compiler error, as gcc insists on printing out each template
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// argument, even if it has the default value (this means Types<int>
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will appear as Types<int, None, None, ..., None> in the compiler
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// errors).
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Our solution is to combine the best part of the two approaches: a
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// user would write Types<T1, ..., TN>, and Google Test will translate
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that to TypesN<T1, ..., TN> internally to make error messages
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// readable.  The translation is done by the 'type' member of the
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Types template.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 1..n
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for i, [[typename T$i = internal::None]]>
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Types {
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef internal::Types$n<$for i, [[T$i]]> type;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <>
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Types<$for i, [[internal::None]]> {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef internal::Types0 type;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 1..n-1
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$for i [[
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range j 1..i
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range k i+1..n
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for j, [[typename T$j]]>
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef internal::Types$i<$for j, [[T$j]]> type;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch]]
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define GTEST_TEMPLATE_ template <typename T> class
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The template "selector" struct TemplateSel<Tmpl> is used to
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// represent Tmpl, which must be a class template with one type
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as the type Tmpl<T>.  This allows us to actually instantiate the
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// template "selected" by TemplateSel<Tmpl>.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This trick is necessary for simulating typedef for class templates,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// which C++ doesn't support directly.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <GTEST_TEMPLATE_ Tmpl>
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct TemplateSel {
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename T>
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Bind {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typedef Tmpl<T> type;
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define GTEST_BIND_(TmplSel, T) \
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TmplSel::template Bind<T>::type
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A unique struct template used as the default value for the
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// arguments of class template Templates.  This allows us to simulate
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// variadic templates (e.g. Templates<int>, Templates<int, double>,
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and etc), which C++ doesn't support directly.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct NoneT {};
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following family of struct and struct templates are used to
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// represent template lists.  In particular, TemplatesN<T1, T2, ...,
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// for Templates0, every struct in the family has two member types:
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Head for the selector of the first template in the list, and Tail
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// for the rest of the list.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The empty template list.
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Templates0 {};
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Template lists of length 1, 2, 3, and so on.
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <GTEST_TEMPLATE_ T1>
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Templates1 {
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef TemplateSel<T1> Head;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Templates0 Tail;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 2..n
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$for i [[
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range j 1..i
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range k 2..i
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for j, [[GTEST_TEMPLATE_ T$j]]>
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Templates$i {
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef TemplateSel<T1> Head;
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch]]
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We don't want to require the users to write TemplatesN<...> directly,
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as that would require them to count the length.  Templates<...> is much
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// easier to write, but generates horrible messages when there is a
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// compiler error, as gcc insists on printing out each template
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// argument, even if it has the default value (this means Templates<list>
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// errors).
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Our solution is to combine the best part of the two approaches: a
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// user would write Templates<T1, ..., TN>, and Google Test will translate
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that to TemplatesN<T1, ..., TN> internally to make error messages
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// readable.  The translation is done by the 'type' member of the
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Templates template.
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 1..n
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Templates {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Templates$n<$for i, [[T$i]]> type;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <>
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Templates<$for i, [[NoneT]]> {
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Templates0 type;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 1..n-1
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$for i [[
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range j 1..i
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range k i+1..n
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for j, [[GTEST_TEMPLATE_ T$j]]>
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Templates$i<$for j, [[T$j]]> type;
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch]]
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The TypeList template makes it possible to use either a single type
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// or a Types<...> list in TYPED_TEST_CASE() and
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// INSTANTIATE_TYPED_TEST_CASE_P().
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct TypeList { typedef Types1<T> type; };
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch$range i 1..n
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <$for i, [[typename T$i]]>
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct TypeList<Types<$for i, [[T$i]]> > {
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Types<$for i, [[T$i]]>::type type;
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
292