1aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
2aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
3aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
4aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
5aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
6aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
7aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
9aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
10aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
11aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
12aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
13aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
14aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
15aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
16aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
17aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
30aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
31aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
32aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test)
33aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
34aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file defines the public API for Google Test.  It should be
35aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// included by any test program that uses Google Test.
36aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
37aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
38aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// leave some internal implementation details in this header file.
39aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// They are clearly marked by comments like this:
40aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
41aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
42aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
43aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Such code is NOT meant to be used by a user directly, and is subject
44aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
45aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// program!
46aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
47aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Acknowledgment: Google Test borrowed the idea of automatic test
48aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
49aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// easyUnit framework.
50aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
51aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
52aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_H_
53aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
54aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <limits>
55aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <ostream>
56aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <vector>
57aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
58aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
59aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
60aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
61aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
62aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
63aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
64aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
65aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
66aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
67aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
68aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
69aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
70aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
71aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
72aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
73aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
74aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
75aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
76aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
77aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
78aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
79aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
80aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
81aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
82aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
83aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
84aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
85aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
86aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
87aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
88aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
89aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test)
90aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
91aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file declares functions and macros used internally by
92aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test.  They are subject to change without notice.
93aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
94aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
95aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
96aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
97aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
98aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
99aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: wan@google.com (Zhanyong Wan)
127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Low-level types and utilities for porting Google Test to various
129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms.  They are subject to change without notice.  DO NOT USE
130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEM IN USER CODE.
131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file is fundamental to Google Test.  All other Google Test source
133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// files are expected to #include this.  Therefore, it cannot #include
134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// any other Google Test header.
135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user can define the following macros in the build script to
140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// control Google Test's behavior.  If the user doesn't define a macro
141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in this list, Google Test will define it.
142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              is/isn't available.
145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              are enabled.
147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              is/isn't available (some systems define
149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              ::string, which is different to std::string).
150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              is/isn't available (some systems define
152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              ::wstring, which is different to std::wstring).
153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              expressions are/aren't available.
155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              is/isn't available.
157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              enabled.
159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              std::wstring does/doesn't work (Google Test can
161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              be used where std::wstring is unavailable).
162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              is/isn't available.
164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              compiler supports Microsoft's "Structured
166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              Exception Handling".
167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_STREAM_REDIRECTION
168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            - Define it to 1/0 to indicate whether the
169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              platform supports I/O stream redirection using
170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              dup() and dup2().
171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              Test's own tr1 tuple implementation should be
173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              used.  Unused when the user sets
174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              GTEST_HAS_TR1_TUPLE to 0.
175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              is building in C++11/C++98 mode.
177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_LINKED_AS_SHARED_LIBRARY
178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            - Define to 1 when compiling tests that use
179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              Google Test as a shared library (known as
180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              DLL on Windows).
181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_CREATE_SHARED_LIBRARY
182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            - Define to 1 when compiling Google Test itself
183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              as a shared library.
184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header defines the following utilities:
186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros indicating the current platform (defined to 1 if compiled on
188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the given platform; otherwise undefined):
189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_AIX      - IBM AIX
190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_CYGWIN   - Cygwin
191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_HPUX     - HP-UX
192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_LINUX    - Linux
193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_OS_LINUX_ANDROID - Google Android
194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_MAC      - Mac OS X
195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_OS_IOS    - iOS
196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       GTEST_OS_IOS_SIMULATOR - iOS simulator
197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_NACL     - Google Native Client (NaCl)
198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_OPENBSD  - OpenBSD
199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_QNX      - QNX
200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_SOLARIS  - Sun Solaris
201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_SYMBIAN  - Symbian
202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_OS_WINDOWS_MINGW    - MinGW
205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_OS_ZOS      - z/OS
207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// most stable support.  Since core members of the Google Test project
210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// don't have access to other platforms, support for them may be less
211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// stable.  If you notice any problems on your platform, please notify
212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// googletestframework@googlegroups.com (patches for fixing them are
213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// even more welcome!).
214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note that it is possible that none of the GTEST_OS_* macros are defined.
216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros indicating available Google Test features (defined to 1 if
218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the corresponding feature is supported; otherwise undefined):
219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            tests)
221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_DEATH_TEST   - death tests
222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_TYPED_TEST   - typed tests
224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            GTEST_HAS_POSIX_RE (see above) which users can
227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            define themselves.
228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            the above two are mutually exclusive.
230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for basic C++ coding:
233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                              variable don't have to be used.
236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synchronization:
241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                  - synchronization primitives.
243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         synchronization primitives have real implementations
245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         and Google Test is thread-safe; or 0 otherwise.
246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Template meta programming:
248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   IteratorTraits - partial implementation of std::iterator_traits, which
250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                    is not available in libCstd when compiled with Sun C++.
251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Smart pointers:
253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   scoped_ptr     - as in TR2.
254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Regular expressions:
256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   RE             - a simple regular expression class using the POSIX
257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                    Extended Regular Expression syntax on UNIX-like
258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                    platforms, or a reduced regular exception syntax on
259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                    other platforms, including Windows.
260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Logging:
262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_LOG_()   - logs messages at the specified severity level.
263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   LogToStderr()  - directs all log messages to stderr.
264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   FlushInfoLog() - flushes informational log messages.
265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Stdout and stderr capturing:
267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   CaptureStdout()     - starts capturing stdout.
268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GetCapturedStdout() - stops capturing stdout and returns the captured
269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         string.
270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   CaptureStderr()     - starts capturing stderr.
271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GetCapturedStderr() - stops capturing stderr and returns the captured
272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         string.
273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Integer types:
275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TypeWithSize   - maps an integer to a int type.
276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Int32, UInt32, Int64, UInt64, TimeInMillis
277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                  - integers of known sizes.
278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   BiggestInt     - the biggest signed integer type.
279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Command-line utilities:
281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_FLAG()       - references a flag.
282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_DECLARE_*()  - declares a flag.
283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_DEFINE_*()   - defines a flag.
284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GetInjectableArgvs() - returns the command line as a vector of strings.
285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Environment variable utilities:
287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GetEnv()             - gets the value of an environment variable.
288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   BoolFromGTestEnv()   - parses a bool environment variable.
289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Int32FromGTestEnv()  - parses an Int32 environment variable.
290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   StringFromGTestEnv() - parses a string environment variable.
291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <ctype.h>   // for isspace, etc
293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stddef.h>  // for ptrdiff_t
294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdlib.h>
295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdio.h>
296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string.h>
297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef _WIN32_WCE
298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <sys/types.h>
299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <sys/stat.h>
300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // !_WIN32_WCE
301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined __APPLE__
303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <AvailabilityMacros.h>
304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <TargetConditionals.h>
305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <iostream>  // NOLINT
308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <sstream>  // NOLINT
309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string>  // NOLINT
310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG_PREFIX_ "gtest_"
313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_NAME_ "Google Test"
316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines the version of gcc that is used to compile this.
319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __GNUC__
320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 40302 means version 4.3.2.
321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_GCC_VER_ \
322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // __GNUC__
324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines the platform on which Google Test is compiled.
326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __CYGWIN__
327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_CYGWIN 1
328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __SYMBIAN32__
329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_SYMBIAN 1
330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined _WIN32
331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_WINDOWS 1
332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef _WIN32_WCE
333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_OS_WINDOWS_MOBILE 1
334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__MINGW__) || defined(__MINGW32__)
335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_OS_WINDOWS_MINGW 1
336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_OS_WINDOWS_DESKTOP 1
338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // _WIN32_WCE
339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __APPLE__
340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_MAC 1
341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if TARGET_OS_IPHONE
342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_OS_IOS 1
343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  if TARGET_IPHONE_SIMULATOR
344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_OS_IOS_SIMULATOR 1
345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif
346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __linux__
348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_LINUX 1
349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined __ANDROID__
350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_OS_LINUX_ANDROID 1
351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __MVS__
353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_ZOS 1
354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__sun) && defined(__SVR4)
355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_SOLARIS 1
356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(_AIX)
357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_AIX 1
358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__hpux)
359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_HPUX 1
360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __native_client__
361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_NACL 1
362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __OpenBSD__
363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_OPENBSD 1
364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined __QNX__
365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_OS_QNX 1
366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // __CYGWIN__
367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_LANG_CXX11
369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value for __cplusplus, and recent versions of clang, gcc, and
372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// probably other compilers set that too in C++11 mode.
373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Compiling in at least C++11 mode.
375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_LANG_CXX11 1
376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_LANG_CXX11 0
378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Brings in definitions for functions used in the testing::internal::posix
382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace (read, write, close, chdir, isatty, stat). We do not currently
383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use them on Windows Mobile.
384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS
385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This assumes that non-Windows OSes provide unistd.h. For OSes where this
386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is not the case, we need to include headers that provide the functions
387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// mentioned above.
388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <unistd.h>
389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <strings.h>
390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif !GTEST_OS_WINDOWS_MOBILE
391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <direct.h>
392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <io.h>
393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_LINUX_ANDROID
396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used to define __ANDROID_API__ matching the target NDK API level.
397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  include <android/api-level.h>  // NOLINT
398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines this to true iff Google Test can use POSIX regular expressions.
401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_POSIX_RE
402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX_ANDROID
403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Android, <regex.h> is only available starting with Gingerbread.
404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_POSIX_RE
411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On some platforms, <regex.h> needs someone to define size_t, and
413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// won't compile otherwise.  We can #include it here as we already
414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// included <stdlib.h>, which is guaranteed to define size_t through
415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <stddef.h>.
416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <regex.h>  // NOLINT
417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USES_POSIX_RE 1
419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif GTEST_OS_WINDOWS
421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <regex.h> is not available on Windows.  Use our own simple regex
423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation instead.
424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USES_SIMPLE_RE 1
425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <regex.h> may not be available on this platform.  Use our own
429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// simple regex implementation instead.
430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_USES_SIMPLE_RE 1
431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_POSIX_RE
433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_EXCEPTIONS
435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether exceptions are enabled, so we need
436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out.
437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined(_MSC_VER) || defined(__BORLANDC__)
438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macro to enable exceptions, so we'll do the same.
440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Assumes that exceptions are enabled by default.
441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  ifndef _HAS_EXCEPTIONS
442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define _HAS_EXCEPTIONS 1
443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif  // _HAS_EXCEPTIONS
444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__GNUC__) && __EXCEPTIONS
446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_EXCEPTIONS 1
448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__SUNPRO_CC)
449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sun Pro CC supports exceptions.  However, there is no compile-time way of
450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// detecting whether they are enabled or not.  Therefore, we assume that
451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// they are enabled unless the user tells us otherwise.
452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_EXCEPTIONS 1
453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__IBMCPP__) && __EXCEPTIONS
454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_EXCEPTIONS 1
456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__HP_aCC)
457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Exception handling is in effect by default in HP aCC compiler. It has to
458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// be turned of by +noeh compiler option if desired.
459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_EXCEPTIONS 1
460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For other compilers, we assume exceptions are disabled to be
462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// conservative.
463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_EXCEPTIONS 0
464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_EXCEPTIONS
466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !defined(GTEST_HAS_STD_STRING)
468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Even though we don't use this macro any longer, we keep it in case
469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// some clients still depend on it.
470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_STD_STRING 1
471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif !GTEST_HAS_STD_STRING
472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user told us that ::std::string isn't available.
473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# error "Google Test cannot be used where ::std::string isn't available."
474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // !defined(GTEST_HAS_STD_STRING)
475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_GLOBAL_STRING
477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether ::string is available, so we need
478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out.
479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_GLOBAL_STRING 0
481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_STRING
483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_STD_WSTRING
485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether ::std::wstring is available, so we need
486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out.
487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   is available.
489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Cygwin 1.7 and below doesn't support ::std::wstring.
491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Solaris' libc++ doesn't support it either.  Android has
492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// no support for it at least as recent as Froyo (2.2).
493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_STD_WSTRING \
494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_STD_WSTRING
497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_GLOBAL_WSTRING
499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether ::wstring is available, so we need
500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to figure it out.
501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_GLOBAL_WSTRING \
502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_WSTRING
504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether RTTI is available.
506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_RTTI
507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us whether RTTI is enabled, so we need to
508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// figure it out.
509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef _MSC_VER
511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_HAS_RTTI 1
514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_HAS_RTTI 0
516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif
517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  ifdef __GXX_RTTI
522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When building against STLport with the Android NDK and with
523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// -frtti -fno-exceptions, the build fails at link time with undefined
524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// so disable RTTI when detected.
526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter       !defined(__EXCEPTIONS)
528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#    define GTEST_HAS_RTTI 0
529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   else
530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#    define GTEST_HAS_RTTI 1
531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_HAS_RTTI 0
534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif  // __GXX_RTTI
535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// first version with C++ support.
539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__clang__)
540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// both the typeid and dynamic_cast features are present.
545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  ifdef __RTTI_ALL__
548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_HAS_RTTI 1
549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_HAS_RTTI 0
551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif
552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For all other compilers, we assume RTTI is enabled.
556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_RTTI 1
557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // _MSC_VER
559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_RTTI
561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// It's this header's responsibility to #include <typeinfo> when RTTI
563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is enabled.
564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_RTTI
565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <typeinfo>
566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether Google Test can use the pthreads library.
569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_PTHREAD
570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us explicitly, so we assume pthreads support is
571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// available on Linux and Mac.
572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to your compiler flags.
575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    || GTEST_OS_QNX)
577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PTHREAD
578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PTHREAD
580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// true.
582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <pthread.h>  // NOLINT
583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For timespec and nanosleep, used below.
585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <time.h>  // NOLINT
586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether Google Test can use tr1/tuple.  You can define
589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this macro to 0 to prevent Google Test from using tuple (any
590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// feature depending on tuple with be disabled in this mode).
591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_TR1_TUPLE
592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_TR1_TUPLE 0
595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us not to do it, so we assume it's OK.
597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_TR1_TUPLE 1
598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TR1_TUPLE
600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether Google Test's own tr1 tuple implementation
602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// should be used.
603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_USE_OWN_TR1_TUPLE
604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us, so we need to figure it out.
605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We use our own TR1 tuple if we aren't sure the user has an
607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation of it already.  At this time, libstdc++ 4.0.0+ and
608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC 2010 are the only mainstream standard libraries that come
609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pretends to be GCC by defining __GNUC__ and friends, but cannot
611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tuple in a 323 MB Feature Pack download, which we cannot assume the
613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// user has.  QNX's QCC compiler is a modified GCC but it doesn't
614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and it can be used with some compilers that define __GNUC__.
616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can build with clang but need to use gcc4.2's libstdc++).
624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_ENV_HAS_STD_TUPLE_ 1
626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_USE_OWN_TR1_TUPLE 0
630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_USE_OWN_TR1_TUPLE 1
632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_USE_OWN_TR1_TUPLE
635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To avoid conditional compilation everywhere, we make it
637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// gtest-port.h's responsibility to #include the header implementing
638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tr1/tuple.
639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TR1_TUPLE
640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_USE_OWN_TR1_TUPLE
642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file was GENERATED by command:
643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     pump.py gtest-tuple.h.pump
644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DO NOT EDIT BY HAND!!!
645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2009 Google Inc.
647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All Rights Reserved.
648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <utility>  // For ::std::pair.
683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The compiler used in Symbian has a bug that prevents us from declaring the
685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tuple template as a friend (it complains that tuple is redefined).  This
686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// hack bypasses the bug by declaring the members that should otherwise be
687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// private as public.
688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sun Studio versions < 12 also have the above bug.
689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_n_TUPLE_(T) is the type of an n-tuple.
698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_0_TUPLE_(T) tuple<>
699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void, void, void>
713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T##7, void, void>
715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T##7, T##8, void>
717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T##7, T##8, T##9>
719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_0_TYPENAMES_(T)
722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_1_TYPENAMES_(T) typename T##0
723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3
727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3, typename T##4
729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3, typename T##4, typename T##5
731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3, typename T##4, typename T##5, typename T##6
733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3, typename T##4, typename T##5, typename T##6, \
737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##7, typename T##8
738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##3, typename T##4, typename T##5, typename T##6, \
740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T##7, typename T##8, typename T##9
741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In theory, defining stuff in the ::std namespace is undefined
743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// behavior.  We can do this as we are playing the role of a standard
744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// library vendor.
745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace std {
746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace tr1 {
747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T0 = void, typename T1 = void, typename T2 = void,
749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T3 = void, typename T4 = void, typename T5 = void,
750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6 = void, typename T7 = void, typename T8 = void,
751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T9 = void>
752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass tuple;
753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Anything in namespace gtest_internal is Google Test's INTERNAL
755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace gtest_internal {
757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct ByRef { typedef const T& type; };  // NOLINT
761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct ByRef<T&> { typedef T& type; };  // NOLINT
763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A handy wrapper for ByRef.
765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is the same as tr1::add_reference<T>::type.
769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct AddRef { typedef T& type; };  // NOLINT
771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct AddRef<T&> { typedef T& type; };  // NOLINT
773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A handy wrapper for AddRef.
775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A helper for implementing get<k>().
778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <int k> class Get;
779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A helper for implementing tuple_element<k, T>.  kIndexValid is true
781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// iff k < the number of fields in tuple type T.
782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool kIndexValid, int kIndex, class Tuple>
783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement;
784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T0 type;
788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 type;
793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T2 type;
798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T3 type;
803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T4 type;
808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T5 type;
813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T6 type;
818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T7 type;
823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T8 type;
828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T9 type;
833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace gtest_internal
836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass tuple<> {
839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() {}
841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& /* t */)  {}
842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& /* t */) { return *this; }
843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_1_TYPENAMES_(T)>
846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_1_TUPLE_(T) {
847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_() {}
851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_) {}
855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_1_TYPENAMES_(U)>
857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_1_TYPENAMES_(U)>
862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_1_TYPENAMES_(U)>
869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_2_TYPENAMES_(T)>
878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_2_TUPLE_(T) {
879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_() {}
883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f1_(f1) {}
886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_2_TYPENAMES_(U)>
890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U0, typename U1>
892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_2_TYPENAMES_(U)>
897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U0, typename U1>
901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const ::std::pair<U0, U1>& p) {
902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = p.first;
903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = p.second;
904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_2_TYPENAMES_(U)>
910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_3_TYPENAMES_(T)>
921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_3_TUPLE_(T) {
922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_() {}
926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_3_TYPENAMES_(U)>
933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_3_TYPENAMES_(U)>
938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_3_TYPENAMES_(U)>
945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_4_TYPENAMES_(T)>
958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_4_TUPLE_(T) {
959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_() {}
963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(f3) {}
967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_4_TYPENAMES_(U)>
971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_) {}
973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_4_TYPENAMES_(U)>
977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_4_TYPENAMES_(U)>
984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_5_TYPENAMES_(T)>
999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_5_TUPLE_(T) {
1000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
1002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
1004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
1007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
1008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f4_(t.f4_) {}
1011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_5_TYPENAMES_(U)>
1013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_), f4_(t.f4_) {}
1015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_5_TYPENAMES_(U)>
1019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
1020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
1021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
1024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_5_TYPENAMES_(U)>
1026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
1027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
1028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
1029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
1030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
1031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f4_ = t.f4_;
1032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
1033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
1036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
1037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
1038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
1039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T4 f4_;
1040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_6_TYPENAMES_(T)>
1043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_6_TUPLE_(T) {
1044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
1046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
1048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
1052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f5_(f5) {}
1053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f4_(t.f4_), f5_(t.f5_) {}
1056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_6_TYPENAMES_(U)>
1058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
1060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_6_TYPENAMES_(U)>
1064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
1065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
1066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
1069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_6_TYPENAMES_(U)>
1071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
1072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
1073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
1074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
1075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
1076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f4_ = t.f4_;
1077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f5_ = t.f5_;
1078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
1079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
1082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
1083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
1084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
1085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T4 f4_;
1086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T5 f5_;
1087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_7_TYPENAMES_(T)>
1090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_7_TUPLE_(T) {
1091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
1093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
1095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
1099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
1100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
1103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_7_TYPENAMES_(U)>
1105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
1107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_7_TYPENAMES_(U)>
1111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
1112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
1113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
1116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_7_TYPENAMES_(U)>
1118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
1119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
1120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
1121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
1122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
1123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f4_ = t.f4_;
1124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f5_ = t.f5_;
1125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f6_ = t.f6_;
1126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
1127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
1130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
1131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
1132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
1133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T4 f4_;
1134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T5 f5_;
1135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T6 f6_;
1136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_8_TYPENAMES_(T)>
1139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_8_TUPLE_(T) {
1140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
1142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
1144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
1148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
1149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f5_(f5), f6_(f6), f7_(f7) {}
1150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
1153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_8_TYPENAMES_(U)>
1155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
1157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_8_TYPENAMES_(U)>
1161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
1162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
1163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
1166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_8_TYPENAMES_(U)>
1168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
1169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
1170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
1171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
1172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
1173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f4_ = t.f4_;
1174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f5_ = t.f5_;
1175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f6_ = t.f6_;
1176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f7_ = t.f7_;
1177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
1178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
1181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
1182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
1183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
1184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T4 f4_;
1185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T5 f5_;
1186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T6 f6_;
1187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T7 f7_;
1188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_9_TYPENAMES_(T)>
1191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_9_TUPLE_(T) {
1192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
1194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
1196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
1200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
1201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
1202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
1205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_9_TYPENAMES_(U)>
1207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
1209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_9_TYPENAMES_(U)>
1213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
1214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
1215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
1218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_9_TYPENAMES_(U)>
1220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
1221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
1222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
1223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
1224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
1225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f4_ = t.f4_;
1226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f5_ = t.f5_;
1227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f6_ = t.f6_;
1228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f7_ = t.f7_;
1229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f8_ = t.f8_;
1230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
1231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
1234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
1235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
1236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
1237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T4 f4_;
1238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T5 f5_;
1239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T6 f6_;
1240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T7 f7_;
1241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T8 f8_;
1242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
1245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass tuple {
1246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <int k> friend class gtest_internal::Get;
1248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
1250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f9_() {}
1251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
1255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
1256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
1257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
1260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_10_TYPENAMES_(U)>
1262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
1264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      f9_(t.f9_) {}
1265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_10_TYPENAMES_(U)>
1269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
1270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CopyFrom(t);
1271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DECLARE_TUPLE_AS_FRIEND_
1274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <GTEST_10_TYPENAMES_(U)>
1276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
1277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f0_ = t.f0_;
1278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f1_ = t.f1_;
1279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f2_ = t.f2_;
1280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f3_ = t.f3_;
1281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f4_ = t.f4_;
1282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f5_ = t.f5_;
1283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f6_ = t.f6_;
1284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f7_ = t.f7_;
1285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f8_ = t.f8_;
1286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    f9_ = t.f9_;
1287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
1288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T0 f0_;
1291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T1 f1_;
1292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T2 f2_;
1293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T3 f3_;
1294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T4 f4_;
1295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T5 f5_;
1296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T6 f6_;
1297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T7 f7_;
1298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T8 f8_;
1299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T9 f9_;
1300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 6.1.3.2 Tuple creation functions.
1303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Known limitations: we don't support passing an
1305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
1306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implement tie().
1307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline tuple<> make_tuple() { return tuple<>(); }
1309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_1_TYPENAMES_(T)>
1311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
1312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_1_TUPLE_(T)(f0);
1313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_2_TYPENAMES_(T)>
1316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
1317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_2_TUPLE_(T)(f0, f1);
1318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_3_TYPENAMES_(T)>
1321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
1322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_3_TUPLE_(T)(f0, f1, f2);
1323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_4_TYPENAMES_(T)>
1326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3) {
1328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
1329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_5_TYPENAMES_(T)>
1332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3, const T4& f4) {
1334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
1335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_6_TYPENAMES_(T)>
1338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3, const T4& f4, const T5& f5) {
1340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
1341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_7_TYPENAMES_(T)>
1344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
1346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
1347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_8_TYPENAMES_(T)>
1350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
1352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
1353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_9_TYPENAMES_(T)>
1356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
1358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T8& f8) {
1359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
1360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
1363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
1365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T8& f8, const T9& f9) {
1366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
1367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 6.1.3.3 Tuple helper classes.
1370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Tuple> struct tuple_size;
1372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_0_TYPENAMES_(T)>
1374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_0_TUPLE_(T) > {
1375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 0;
1376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_1_TYPENAMES_(T)>
1379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_1_TUPLE_(T) > {
1380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 1;
1381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_2_TYPENAMES_(T)>
1384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_2_TUPLE_(T) > {
1385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 2;
1386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_3_TYPENAMES_(T)>
1389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_3_TUPLE_(T) > {
1390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 3;
1391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_4_TYPENAMES_(T)>
1394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_4_TUPLE_(T) > {
1395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 4;
1396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_5_TYPENAMES_(T)>
1399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_5_TUPLE_(T) > {
1400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 5;
1401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_6_TYPENAMES_(T)>
1404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_6_TUPLE_(T) > {
1405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 6;
1406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_7_TYPENAMES_(T)>
1409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_7_TUPLE_(T) > {
1410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 7;
1411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_8_TYPENAMES_(T)>
1414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_8_TUPLE_(T) > {
1415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 8;
1416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_9_TYPENAMES_(T)>
1419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_9_TUPLE_(T) > {
1420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 9;
1421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T)>
1424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_size<GTEST_10_TUPLE_(T) > {
1425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const int value = 10;
1426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <int k, class Tuple>
1429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct tuple_element {
1430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename gtest_internal::TupleElement<
1431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
1432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
1435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 6.1.3.4 Element access.
1437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace gtest_internal {
1439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<0> {
1442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
1445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f0_; }  // NOLINT
1446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
1449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f0_; }
1450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<1> {
1454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
1457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f1_; }  // NOLINT
1458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
1461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f1_; }
1462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<2> {
1466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
1469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f2_; }  // NOLINT
1470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
1473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f2_; }
1474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<3> {
1478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
1481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f3_; }  // NOLINT
1482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
1485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f3_; }
1486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<4> {
1490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
1493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f4_; }  // NOLINT
1494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
1497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f4_; }
1498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<5> {
1502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
1505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f5_; }  // NOLINT
1506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
1509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f5_; }
1510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<6> {
1514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
1517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f6_; }  // NOLINT
1518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
1521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f6_; }
1522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<7> {
1526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
1529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f7_; }  // NOLINT
1530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
1533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f7_; }
1534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<8> {
1538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
1541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f8_; }  // NOLINT
1542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
1545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f8_; }
1546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Get<9> {
1550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
1553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Field(Tuple& t) { return t.f9_; }  // NOLINT
1554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple>
1556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
1557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstField(const Tuple& t) { return t.f9_; }
1558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace gtest_internal
1561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <int k, GTEST_10_TYPENAMES_(T)>
1563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
1564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterget(GTEST_10_TUPLE_(T)& t) {
1565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return gtest_internal::Get<k>::Field(t);
1566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <int k, GTEST_10_TYPENAMES_(T)>
1569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
1570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterget(const GTEST_10_TUPLE_(T)& t) {
1571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return gtest_internal::Get<k>::ConstField(t);
1572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 6.1.3.5 Relational operators
1575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We only implement == and !=, as we don't have a need for the rest yet.
1577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace gtest_internal {
1579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
1581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// first k fields of t1 equals the first k fields of t2.
1582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
1583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// k1 != k2.
1584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <int kSize1, int kSize2>
1585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct SameSizeTuplePrefixComparator;
1586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
1588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct SameSizeTuplePrefixComparator<0, 0> {
1589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple1, class Tuple2>
1590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
1591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return true;
1592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <int k>
1596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct SameSizeTuplePrefixComparator<k, k> {
1597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class Tuple1, class Tuple2>
1598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
1599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
1600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
1601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
1602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace gtest_internal
1605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
1607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool operator==(const GTEST_10_TUPLE_(T)& t,
1608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       const GTEST_10_TUPLE_(U)& u) {
1609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return gtest_internal::SameSizeTuplePrefixComparator<
1610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      tuple_size<GTEST_10_TUPLE_(T) >::value,
1611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
1612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
1615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool operator!=(const GTEST_10_TUPLE_(T)& t,
1616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
1617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 6.1.4 Pairs.
1619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Unimplemented.
1620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace tr1
1622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace std
1623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_0_TUPLE_
1625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_1_TUPLE_
1626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_2_TUPLE_
1627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_3_TUPLE_
1628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_4_TUPLE_
1629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_5_TUPLE_
1630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_6_TUPLE_
1631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_7_TUPLE_
1632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_8_TUPLE_
1633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_9_TUPLE_
1634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_10_TUPLE_
1635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_0_TYPENAMES_
1637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_1_TYPENAMES_
1638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_2_TYPENAMES_
1639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_3_TYPENAMES_
1640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_4_TYPENAMES_
1641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_5_TYPENAMES_
1642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_6_TYPENAMES_
1643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_7_TYPENAMES_
1644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_8_TYPENAMES_
1645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_9_TYPENAMES_
1646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_10_TYPENAMES_
1647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
1649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_BY_REF_
1650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_ADD_REF_
1651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_TUPLE_ELEMENT_
1652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
1654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif GTEST_ENV_HAS_STD_TUPLE_
1655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  include <tuple>
1656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C++11 puts its tuple into the ::std namespace rather than
1657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
1658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This causes undefined behavior, but supported compilers react in
1659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the way we intend.
1660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace std {
1661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace tr1 {
1662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::get;
1663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::make_tuple;
1664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::tuple;
1665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::tuple_element;
1666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterusing ::std::tuple_size;
1667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
1669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif GTEST_OS_SYMBIAN
1671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
1673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use STLport's tuple implementation, which unfortunately doesn't
1674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// work as the copy of STLport distributed with Symbian is incomplete.
1675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
1676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use its own tuple implementation.
1677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  ifdef BOOST_HAS_TR1_TUPLE
1678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   undef BOOST_HAS_TR1_TUPLE
1679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif  // BOOST_HAS_TR1_TUPLE
1680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This prevents <boost/tr1/detail/config.hpp>, which defines
1682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
1683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
1684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  include <tuple>
1685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
1687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
1688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// not conform to the TR1 spec, which requires the header to be <tuple>.
1689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
1691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
1692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// which is #included by <tr1/tuple>, to not compile when RTTI is
1693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// disabled.  _TR1_FUNCTIONAL is the header guard for
1694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <tr1/functional>.  Hence the following #define is a hack to prevent
1695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// <tr1/functional> from being included.
1696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define _TR1_FUNCTIONAL 1
1697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   include <tr1/tuple>
1698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   undef _TR1_FUNCTIONAL  // Allows the user to #include
1699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                        // <tr1/functional> if he chooses to.
1700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
1701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   include <tr1/tuple>  // NOLINT
1702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
1703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
1705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the compiler is not GCC 4.0+, we assume the user is using a
1706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// spec-conforming TR1 implementation.
1707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  include <tuple>  // NOLINT
1708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_USE_OWN_TR1_TUPLE
1709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TR1_TUPLE
1711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether clone(2) is supported.
1713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Usually it will only be available on Linux, excluding
1714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Linux on the Itanium architecture.
1715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Also see http://linux.die.net/man/2/clone.
1716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_CLONE
1717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us, so we need to figure it out.
1718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_LINUX && !defined(__ia64__)
1720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  if GTEST_OS_LINUX_ANDROID
1721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Android, clone() is only available on ARM starting with Gingerbread.
1722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#    if defined(__arm__) && __ANDROID_API__ >= 9
1723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#     define GTEST_HAS_CLONE 1
1724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#    else
1725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#     define GTEST_HAS_CLONE 0
1726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#    endif
1727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
1728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   define GTEST_HAS_CLONE 1
1729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif
1730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
1731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_CLONE 0
1732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_OS_LINUX && !defined(__ia64__)
1733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_CLONE
1735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support stream redirection. This is used to test
1737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// output correctness and to implement death tests.
1738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_STREAM_REDIRECTION
1739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// By default, we assume that stream redirection is supported on all
1740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms except known mobile ones.
1741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
1742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_STREAM_REDIRECTION 0
1743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
1744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_STREAM_REDIRECTION 1
1745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
1746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_STREAM_REDIRECTION
1747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support death tests.
1749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test does not support death tests for VC 7.1 and earlier as
1750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// abort() in a VC 7.1 application compiled as GUI in debug config
1751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pops up a dialog window that cannot be suppressed programmatically.
1752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
1753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
1754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
1755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
1756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter     GTEST_OS_OPENBSD || GTEST_OS_QNX)
1757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_DEATH_TEST 1
1758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <vector>  // NOLINT
1759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
1762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// all the compilers we care about are adequate for supporting
1763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value-parameterized tests.
1764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_HAS_PARAM_TEST 1
1765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support type-driven tests.
1767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
1769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sun Pro CC, IBM Visual Age, and HP aCC support.
1770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
1771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    defined(__IBMCPP__) || defined(__HP_aCC)
1772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_TYPED_TEST 1
1773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_TYPED_TEST_P 1
1774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether to support Combine(). This only makes sense when
1777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value-parameterized tests are enabled.  The implementation doesn't
1778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// work on Sun Studio since it doesn't understand templated conversion
1779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operators.
1780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
1781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_COMBINE 1
1782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether the system compiler uses UTF-16 for encoding wide strings.
1785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_WIDE_STRING_USES_UTF16_ \
1786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
1787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determines whether test results can be streamed to a socket.
1789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_LINUX
1790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_CAN_STREAM_RESULTS_ 1
1791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines some utility macros.
1794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The GNU compiler emits a warning if nested "if" statements are followed by
1796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// an "else" statement and braces are not used to explicitly disambiguate the
1797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "else" binding.  This leads to problems with code like:
1798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   if (gate)
1800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     ASSERT_*(condition) << "Some message";
1801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The "switch (0) case 0:" idiom is used to suppress this.
1803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __INTEL_COMPILER
1804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
1805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
1806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
1807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Use this annotation at the end of a struct/class definition to
1810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// prevent the compiler from optimizing away instances that are never
1811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// used.  This is useful when all interesting logic happens inside the
1812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// c'tor and / or d'tor.  Example:
1813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   struct Foo {
1815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Foo() { ... }
1816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   } GTEST_ATTRIBUTE_UNUSED_;
1817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Also use it after a variable or parameter declaration to tell the
1819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler the variable/parameter does not have to be used.
1820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GNUC__) && !defined(COMPILER_ICC)
1821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
1822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
1823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ATTRIBUTE_UNUSED_
1824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A macro to disallow operator=
1827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This should be used in the private: declarations for a class.
1828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DISALLOW_ASSIGN_(type)\
1829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(type const &)
1830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A macro to disallow copy constructor and operator=
1832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This should be used in the private: declarations for a class.
1833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
1834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  type(type const &);\
1835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_ASSIGN_(type)
1836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tell the compiler to warn about unused return values for functions declared
1838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with this macro.  The macro should be used on function declarations
1839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// following the argument list:
1840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
1842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
1843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
1844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
1845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_MUST_USE_RESULT_
1846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
1847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Determine whether the compiler supports Microsoft's Structured Exception
1849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Handling.  This is supported by several Windows compilers but generally
1850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// does not exist on any other system.
1851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_HAS_SEH
1852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user didn't tell us, so we need to figure it out.
1853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if defined(_MSC_VER) || defined(__BORLANDC__)
1855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// These two compilers are known to support SEH.
1856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_SEH 1
1857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
1858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Assume no SEH.
1859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_HAS_SEH 0
1860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
1861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_SEH
1863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
1865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_LINKED_AS_SHARED_LIBRARY
1867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_API_ __declspec(dllimport)
1868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif GTEST_CREATE_SHARED_LIBRARY
1869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_API_ __declspec(dllexport)
1870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
1871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // _MSC_VER
1873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_API_
1875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_API_
1876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __GNUC__
1879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Ask the compiler to never inline a given function.
1880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_NO_INLINE_ __attribute__((noinline))
1881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
1882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_NO_INLINE_
1883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
1886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
1887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CXXABI_H_ 1
1888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
1889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_CXXABI_H_ 0
1890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
1891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
1893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Message;
1895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
1897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A secret type that Google Test users don't know about.  It has no
1899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// definition on purpose.  Therefore it's impossible to create a
1900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Secret object, which is what we want.
1901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Secret;
1902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
1904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expression is true. For example, you could use it to verify the
1905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// size of a static array:
1906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
1908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         content_type_names_incorrect_size);
1909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or to make sure a struct is smaller than a certain size:
1911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
1913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The second argument to the macro is the name of the variable. If
1915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the expression is false, most compilers will issue a warning/error
1916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// containing the name of the variable.
1917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool>
1919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct CompileAssert {
1920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
1921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_COMPILE_ASSERT_(expr, msg) \
1923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
1924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
1925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implementation details of GTEST_COMPILE_ASSERT_:
1927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
1929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   elements (and thus is invalid) when the expression is false.
1930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - The simpler definition
1932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
1934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   does not work, as gcc supports variable-length arrays whose sizes
1936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   are determined at run-time (this is gcc's extension and not part
1937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   of the C++ standard).  As a result, gcc fails to reject the
1938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   following code with the simple definition:
1939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     int foo;
1941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
1942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                                      // not a compile-time constant.
1943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - By using the type CompileAssert<(bool(expr))>, we ensures that
1945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   expr is a compile-time constant.  (Template arguments must be
1946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   determined at compile-time.)
1947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
1949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
1950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     CompileAssert<bool(expr)>
1952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   instead, these compilers will refuse to compile
1954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
1956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   (They seem to think the ">" in "5 > 0" marks the end of the
1958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   template argument list.)
1959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - The array size is (bool(expr) ? 1 : -1), instead of simply
1961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     ((expr) ? 1 : -1).
1963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   This is to avoid running into a bug in MS VC 7.1, which
1965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
1966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
1968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
1969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This template is declared, but intentionally undefined.
1970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
1971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct StaticAssertTypeEqHelper;
1972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
1974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct StaticAssertTypeEqHelper<T, T> {};
1975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING
1977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::string string;
1978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
1979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::std::string string;
1980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_STRING
1981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_WSTRING
1983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::wstring wstring;
1984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif GTEST_HAS_STD_WSTRING
1985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::std::wstring wstring;
1986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_WSTRING
1987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A helper for suppressing warnings on constant condition.  It just
1989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns 'condition'.
1990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsTrue(bool condition);
1991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines scoped_ptr.
1993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
1994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This implementation of scoped_ptr is PARTIAL - it only contains
1995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// enough stuff to satisfy Google Test's need.
1996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
1997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass scoped_ptr {
1998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
1999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T element_type;
2000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
2002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~scoped_ptr() { reset(); }
2003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T& operator*() const { return *ptr_; }
2005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* operator->() const { return ptr_; }
2006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* get() const { return ptr_; }
2007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* release() {
2009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T* const ptr = ptr_;
2010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ptr_ = NULL;
2011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ptr;
2012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void reset(T* p = NULL) {
2015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (p != ptr_) {
2016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
2017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        delete ptr_;
2018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
2019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ptr_ = p;
2020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
2021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* ptr_;
2025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
2027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines RE.
2030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
2032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Regular Expression syntax.
2033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ RE {
2034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A copy constructor is required by the Standard to initialize object
2036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // references from r-values.
2037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  RE(const RE& other) { Init(other.pattern()); }
2038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructs an RE from a string.
2040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
2041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING
2043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
2045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_STRING
2047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  RE(const char* regex) { Init(regex); }  // NOLINT
2049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~RE();
2050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the string representation of the regex.
2052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* pattern() const { return pattern_; }
2053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // FullMatch(str, re) returns true iff regular expression re matches
2055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the entire str.
2056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // PartialMatch(str, re) returns true iff regular expression re
2057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // matches a substring of str (including str itself).
2058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
2059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TODO(wan@google.com): make FullMatch() and PartialMatch() work
2060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // when str contains NUL characters.
2061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool FullMatch(const ::std::string& str, const RE& re) {
2062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return FullMatch(str.c_str(), re);
2063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool PartialMatch(const ::std::string& str, const RE& re) {
2065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return PartialMatch(str.c_str(), re);
2066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING
2069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool FullMatch(const ::string& str, const RE& re) {
2071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return FullMatch(str.c_str(), re);
2072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool PartialMatch(const ::string& str, const RE& re) {
2074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return PartialMatch(str.c_str(), re);
2075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_STRING
2078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool FullMatch(const char* str, const RE& re);
2080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool PartialMatch(const char* str, const RE& re);
2081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Init(const char* regex);
2084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We use a const char* instead of an std::string, as Google Test used to be
2086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // used where std::string is not available.  TODO(wan@google.com): change to
2087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // std::string.
2088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* pattern_;
2089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool is_valid_;
2090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_USES_POSIX_RE
2092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  regex_t full_regex_;     // For FullMatch().
2094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  regex_t partial_regex_;  // For PartialMatch().
2095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else  // GTEST_USES_SIMPLE_RE
2097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* full_pattern_;  // For FullMatch();
2099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_ASSIGN_(RE);
2103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats a source file path and a line number as they would appear
2106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in an error message from the compiler used to compile this code.
2107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
2108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats a file location for compiler-independent XML output.
2110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Although this function is not platform dependent, we put it next to
2111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FormatFileLocation in order to contrast the two functions.
2112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
2113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                               int line);
2114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines logging utilities:
2116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
2117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                          message itself is streamed into the macro.
2118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   LogToStderr()  - directs all log messages to stderr.
2119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   FlushInfoLog() - flushes informational log messages.
2120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterenum GTestLogSeverity {
2122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_INFO,
2123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_WARNING,
2124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ERROR,
2125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_FATAL
2126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats log entry severity, provides a stream object for streaming the
2129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// log message, and terminates the message with a newline when going out of
2130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// scope.
2131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ GTestLog {
2132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTestLog(GTestLogSeverity severity, const char* file, int line);
2134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
2136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~GTestLog();
2137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::std::ostream& GetStream() { return ::std::cerr; }
2139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const GTestLogSeverity severity_;
2142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
2144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_LOG_(severity) \
2147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
2148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  __FILE__, __LINE__).GetStream()
2149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void LogToStderr() {}
2151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void FlushInfoLog() { fflush(NULL); }
2152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE.
2154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
2156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is not satisfied.
2157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  Synopsys:
2158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    GTEST_CHECK_(boolean_condition);
2159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     or
2160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    GTEST_CHECK_(boolean_condition) << "Additional message";
2161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    This checks the condition and if the condition is not satisfied
2163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    it prints message about the condition violation, including the
2164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    condition itself, plus additional message streamed into it, if any,
2165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    and then it aborts the program. It aborts the program irrespective of
2166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    whether it is built in the debug mode or not.
2167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CHECK_(condition) \
2168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
2169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (::testing::internal::IsTrue(condition)) \
2170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ; \
2171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    else \
2172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
2173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// An all-mode assert to verify that the given POSIX-style function
2175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// call returns 0 (indicating success).  Known limitation: this
2176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// doesn't expand to a balanced 'if' statement, so enclose the macro
2177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in {} if you need to use it as the only statement in an 'if'
2178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// branch.
2179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
2180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (const int gtest_error = (posix_call)) \
2181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
2182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      << gtest_error
2183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Use ImplicitCast_ as a safe version of static_cast for upcasting in
2187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
2188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const Foo*).  When you use ImplicitCast_, the compiler checks that
2189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the cast is safe.  Such explicit ImplicitCast_s are necessary in
2190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// surprisingly many situations where C++ demands an exact type match
2191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead of an argument type convertable to a target type.
2192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The syntax for using ImplicitCast_ is the same as for static_cast:
2194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ImplicitCast_<ToType>(expr)
2196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ImplicitCast_ would have been part of the C++ standard library,
2198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// but the proposal was submitted too late.  It will probably make
2199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// its way into the language in the future.
2200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This relatively ugly name is intentional. It prevents clashes with
2202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// similar functions users may have (e.g., implicit_cast). The internal
2203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace alone is not enough because the function can be found by ADL.
2204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename To>
2205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline To ImplicitCast_(To x) { return x; }
2206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When you upcast (that is, cast a pointer from type Foo to type
2208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
2209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// always succeed.  When you downcast (that is, cast a pointer from
2210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
2211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// how do you know the pointer is really of type SubclassOfFoo?  It
2212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
2213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// when you downcast, you should use this macro.  In debug mode, we
2214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use dynamic_cast<> to double-check the downcast is legal (we die
2215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if it's not).  In normal mode, we do the efficient static_cast<>
2216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead.  Thus, it's important to test in debug mode to make sure
2217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the cast is legal!
2218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    This is the only place in the code we should use dynamic_cast<>.
2219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In particular, you SHOULDN'T be using dynamic_cast<> in order to
2220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// do RTTI (eg code like this:
2221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
2222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
2223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You should design the code some other way not to need this.
2224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This relatively ugly name is intentional. It prevents clashes with
2226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// similar functions users may have (e.g., down_cast). The internal
2227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace alone is not enough because the function can be found by ADL.
2228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename To, typename From>  // use like this: DownCast_<T*>(foo);
2229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline To DownCast_(From* f) {  // so we only accept pointers
2230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Ensures that To is a sub-type of From *.  This test is here only
2231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // for compile-time type checking, and has no overhead in an
2232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // optimized build at run-time, as it will be optimized away
2233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // completely.
2234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (false) {
2235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const To to = NULL;
2236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::internal::ImplicitCast_<From*>(to);
2237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_RTTI
2240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // RTTI: debug mode only!
2241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
2242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return static_cast<To>(f);
2244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Downcasts the pointer of type Base to Derived.
2247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Derived must be a subclass of Base. The parameter MUST
2248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// point to a class of type Derived, not any subclass of it.
2249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When RTTI is available, the function performs a runtime
2250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// check to enforce this.
2251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Derived, class Base>
2252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterDerived* CheckedDowncastToActualType(Base* base) {
2253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_RTTI
2254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_CHECK_(typeid(*base) == typeid(Derived));
2255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return dynamic_cast<Derived*>(base);  // NOLINT
2256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return static_cast<Derived*>(base);  // Poor man's downcast.
2258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STREAM_REDIRECTION
2262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines the stderr capturer:
2264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   CaptureStdout     - starts capturing stdout.
2265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GetCapturedStdout - stops capturing stdout and returns the captured string.
2266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   CaptureStderr     - starts capturing stderr.
2267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GetCapturedStderr - stops capturing stderr and returns the captured string.
2268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void CaptureStdout();
2270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetCapturedStdout();
2271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void CaptureStderr();
2272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetCapturedStderr();
2273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_STREAM_REDIRECTION
2275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST
2278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst ::std::vector<testing::internal::string>& GetInjectableArgvs();
2280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid SetInjectableArgvs(const ::std::vector<testing::internal::string>*
2281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                             new_argvs);
2282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A copy of all command line arguments.  Set by InitGoogleTest().
2284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterextern ::std::vector<testing::internal::string> g_argvs;
2285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_DEATH_TEST
2287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines synchronization primitives.
2289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PTHREAD
2291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Sleeps for (roughly) n milli-seconds.  This function is only for
2293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// testing Google Test's own constructs.  Don't use it in user tests,
2294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// either directly or indirectly.
2295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void SleepMilliseconds(int n) {
2296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const timespec time = {
2297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    0,                  // 0 seconds.
2298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    n * 1000L * 1000L,  // And n ms.
2299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
2300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  nanosleep(&time, NULL);
2301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Allows a controller thread to pause execution of newly created
2304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// threads until notified.  Instances of this class must be created
2305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and destroyed in the controller thread.
2306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class is only for testing Google Test's own constructs. Do not
2308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use it in user tests, either directly or indirectly.
2309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Notification {
2310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Notification() : notified_(false) {
2312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
2313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~Notification() {
2315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    pthread_mutex_destroy(&mutex_);
2316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Notifies all threads created with this notification to start. Must
2319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // be called from the controller thread.
2320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Notify() {
2321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    pthread_mutex_lock(&mutex_);
2322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    notified_ = true;
2323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    pthread_mutex_unlock(&mutex_);
2324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Blocks until the controller thread notifies. Must be called from a test
2327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // thread.
2328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void WaitForNotification() {
2329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    for (;;) {
2330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      pthread_mutex_lock(&mutex_);
2331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const bool notified = notified_;
2332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      pthread_mutex_unlock(&mutex_);
2333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (notified)
2334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        break;
2335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      SleepMilliseconds(10);
2336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
2337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  pthread_mutex_t mutex_;
2341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool notified_;
2342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
2344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
2347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Consequently, it cannot select a correct instantiation of ThreadWithParam
2348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in order to call its Run(). Introducing ThreadWithParamBase as a
2349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// non-templated base class for ThreadWithParam allows us to bypass this
2350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// problem.
2351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadWithParamBase {
2352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~ThreadWithParamBase() {}
2354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void Run() = 0;
2355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pthread_create() accepts a pointer to a function type with the C linkage.
2358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// According to the Standard (7.5/1), function types with different linkages
2359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are different even if they are otherwise identical.  Some compilers (for
2360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// example, SunStudio) treat them as different types.  Since class methods
2361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// cannot be defined with C-linkage we need to define a free C-function to
2362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pass into pthread_create().
2363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterextern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
2364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static_cast<ThreadWithParamBase*>(thread)->Run();
2365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return NULL;
2366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper class for testing Google Test's multi-threading constructs.
2369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To use it, write:
2370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void ThreadFunc(int param) { /* Do things with param */ }
2372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Notification thread_can_start;
2373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ...
2374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // The thread_can_start parameter is optional; you can supply NULL.
2375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
2376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   thread_can_start.Notify();
2377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// These classes are only for testing Google Test's own constructs. Do
2379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// not use them in user tests, either directly or indirectly.
2380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadWithParam : public ThreadWithParamBase {
2382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef void (*UserThreadFunc)(T);
2384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ThreadWithParam(
2386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      UserThreadFunc func, T param, Notification* thread_can_start)
2387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : func_(func),
2388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        param_(param),
2389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        thread_can_start_(thread_can_start),
2390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        finished_(false) {
2391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ThreadWithParamBase* const base = this;
2392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // The thread can be created only after all fields except thread_
2393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // have been initialized.
2394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(
2395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
2396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~ThreadWithParam() { Join(); }
2398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Join() {
2400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (!finished_) {
2401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
2402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      finished_ = true;
2403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
2404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void Run() {
2407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (thread_can_start_ != NULL)
2408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      thread_can_start_->WaitForNotification();
2409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    func_(param_);
2410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const UserThreadFunc func_;  // User-supplied thread function.
2414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T param_;  // User-supplied parameter to the thread function.
2415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // When non-NULL, used to block execution until the controller thread
2416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // notifies.
2417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Notification* const thread_can_start_;
2418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool finished_;  // true iff we know that the thread function has finished.
2419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  pthread_t thread_;  // The native thread object.
2420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
2422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MutexBase and Mutex implement mutex on pthreads-based platforms. They
2425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are used in conjunction with class MutexLock:
2426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Mutex mutex;
2428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ...
2429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
2430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                            // of the current scope.
2431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MutexBase implements behavior for both statically and dynamically
2433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// allocated mutexes.  Do not use MutexBase directly.  Instead, write
2434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the following to define a static mutex:
2435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
2437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You can forward declare a static mutex like this:
2439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
2441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To create a dynamic mutex, just define an object of type Mutex.
2443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass MutexBase {
2444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Acquires this mutex.
2446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Lock() {
2447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
2448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    owner_ = pthread_self();
2449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    has_owner_ = true;
2450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Releases this mutex.
2453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Unlock() {
2454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Since the lock is being released the owner_ field should no longer be
2455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // considered valid. We don't protect writing to has_owner_ here, as it's
2456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // the caller's responsibility to ensure that the current thread holds the
2457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // mutex when this is called.
2458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    has_owner_ = false;
2459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
2460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Does nothing if the current thread holds the mutex. Otherwise, crashes
2463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // with high probability.
2464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AssertHeld() const {
2465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
2466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        << "The current thread is not holding the mutex @" << this;
2467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A static mutex may be used before main() is entered.  It may even
2470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // be used before the dynamic initialization stage.  Therefore we
2471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // must be able to initialize a static mutex object at link time.
2472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This means MutexBase has to be a POD and its member variables
2473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // have to be public.
2474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  pthread_mutex_t mutex_;  // The underlying pthread mutex.
2476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // has_owner_ indicates whether the owner_ field below contains a valid thread
2477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
2478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // accesses to the owner_ field should be protected by a check of this field.
2479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // An alternative might be to memset() owner_ to all zeros, but there's no
2480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // guarantee that a zero'd pthread_t is necessarily invalid or even different
2481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // from pthread_self().
2482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool has_owner_;
2483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  pthread_t owner_;  // The thread holding the mutex.
2484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Forward-declares a static mutex.
2487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
2488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    extern ::testing::internal::MutexBase mutex
2489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines and statically (i.e. at link time) initializes a static mutex.
2491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The initialization list here does not explicitly initialize each field,
2492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead relying on default initialization for the unspecified fields. In
2493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// particular, the owner_ field (a pthread_t) is not explicitly initialized.
2494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This allows initialization to work whether pthread_t is a scalar or struct.
2495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The flag -Wmissing-field-initializers must not be specified for this to work.
2496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
2497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
2498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Mutex class can only be used for mutexes created at runtime. It
2500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// shares its API with MutexBase otherwise.
2501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Mutex : public MutexBase {
2502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Mutex() {
2504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
2505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    has_owner_ = false;
2506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~Mutex() {
2508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
2509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
2513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We cannot name this class MutexLock as the ctor declaration would
2516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// conflict with a macro named MutexLock, which is defined on some
2517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms.  Hence the typedef trick below.
2518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTestMutexLock {
2519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit GTestMutexLock(MutexBase* mutex)
2521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : mutex_(mutex) { mutex_->Lock(); }
2522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~GTestMutexLock() { mutex_->Unlock(); }
2524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  MutexBase* const mutex_;
2527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
2529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef GTestMutexLock MutexLock;
2532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helpers for ThreadLocal.
2534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pthread_key_create() requires DeleteThreadLocalValue() to have
2536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C-linkage.  Therefore it cannot be templatized to access
2537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ThreadLocal<T>.  Hence the need for class
2538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ThreadLocalValueHolderBase.
2539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadLocalValueHolderBase {
2540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~ThreadLocalValueHolderBase() {}
2542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Called by pthread to delete thread-local data stored by
2545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pthread_setspecific().
2546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterextern "C" inline void DeleteThreadLocalValue(void* value_holder) {
2547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
2548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements thread-local storage on pthreads-based systems.
2551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Thread 1
2553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
2554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Thread 2
2556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   tl.set(150);  // Changes the value for thread 2 only.
2557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(150, tl.get());
2558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Thread 1
2560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
2561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   tl.set(200);
2562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(200, tl.get());
2563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The template type argument T must have a public copy constructor.
2565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In addition, the default ThreadLocal constructor requires T to have
2566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a public default constructor.
2567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// An object managed for a thread by a ThreadLocal instance is deleted
2569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// when the thread exits.  Or, if the ThreadLocal instance dies in
2570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that thread, when the ThreadLocal dies.  It's the user's
2571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// responsibility to ensure that all other threads using a ThreadLocal
2572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// have exited when it dies, or the per-thread objects for those
2573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// threads will not be deleted.
2574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test only uses global ThreadLocal objects.  That means they
2576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will die after main() has returned.  Therefore, no per-thread
2577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// object managed by Google Test will be leaked as long as all threads
2578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// using Google Test have exited when main() returns.
2579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadLocal {
2581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ThreadLocal() : key_(CreateKey()),
2583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  default_() {}
2584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ThreadLocal(const T& value) : key_(CreateKey()),
2585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                         default_(value) {}
2586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~ThreadLocal() {
2588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Destroys the managed object for the current thread, if any.
2589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    DeleteThreadLocalValue(pthread_getspecific(key_));
2590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Releases resources associated with the key.  This will *not*
2592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // delete managed objects for other threads.
2593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
2594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* pointer() { return GetOrCreateValue(); }
2597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T* pointer() const { return GetOrCreateValue(); }
2598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T& get() const { return *pointer(); }
2599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void set(const T& value) { *pointer() = value; }
2600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Holds a value of type T.
2603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class ValueHolder : public ThreadLocalValueHolderBase {
2604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
2605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    explicit ValueHolder(const T& value) : value_(value) {}
2606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T* pointer() { return &value_; }
2608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
2610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T value_;
2611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
2612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
2613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static pthread_key_t CreateKey() {
2615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    pthread_key_t key;
2616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // When a thread exits, DeleteThreadLocalValue() will be called on
2617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // the object managed for that thread.
2618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(
2619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        pthread_key_create(&key, &DeleteThreadLocalValue));
2620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return key;
2621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* GetOrCreateValue() const {
2624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ThreadLocalValueHolderBase* const holder =
2625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
2626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (holder != NULL) {
2627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
2628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
2629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ValueHolder* const new_holder = new ValueHolder(default_);
2631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ThreadLocalValueHolderBase* const holder_base = new_holder;
2632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
2633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new_holder->pointer();
2634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
2635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A key pthreads uses for looking up per-thread values.
2637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const pthread_key_t key_;
2638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T default_;  // The default value for each thread.
2639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
2641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_IS_THREADSAFE 1
2644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else  // GTEST_HAS_PTHREAD
2646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A dummy implementation of synchronization primitives (mutex, lock,
2648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and thread-local variable).  Necessary for compiling Google Test where
2649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// mutex is not supported - using Google Test in multiple threads is not
2650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// supported on such platforms.
2651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Mutex {
2653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Mutex() {}
2655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Lock() {}
2656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Unlock() {}
2657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AssertHeld() const {}
2658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
2661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  extern ::testing::internal::Mutex mutex
2662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
2664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTestMutexLock {
2666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit GTestMutexLock(Mutex*) {}  // NOLINT
2668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef GTestMutexLock MutexLock;
2671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ThreadLocal {
2674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ThreadLocal() : value_() {}
2676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ThreadLocal(const T& value) : value_(value) {}
2677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* pointer() { return &value_; }
2678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T* pointer() const { return &value_; }
2679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T& get() const { return value_; }
2680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void set(const T& value) { value_ = value; }
2681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
2682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T value_;
2683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The above synchronization primitives have dummy implementations.
2686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Therefore Google Test is not thread-safe.
2687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_IS_THREADSAFE 0
2688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PTHREAD
2690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the number of threads running in the process, or 0 to indicate that
2692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// we cannot detect it.
2693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ size_t GetThreadCount();
2694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Passing non-POD classes through ellipsis (...) crashes the ARM
2696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler and generates a warning in Sun Studio.  The Nokia Symbian
2697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and the IBM XL C/C++ compiler try to instantiate a copy constructor
2698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for objects passed through ellipsis (...), failing for uncopyable
2699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// objects.  We define this to ensure that only POD is passed through
2700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ellipsis on these systems.
2701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
2702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We lose support for NULL detection where the compiler doesn't like
2703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// passing non-POD classes through ellipsis (...).
2704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_ELLIPSIS_NEEDS_POD_ 1
2705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_CAN_COMPARE_NULL 1
2707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
2710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const T& and const T* in a function template.  These compilers
2711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// _can_ decide between class template specializations for T and T*,
2712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// so a tr1::type_traits-like is_pointer works.
2713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
2714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_NEEDS_IS_POINTER_ 1
2715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool bool_value>
2718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct bool_constant {
2719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef bool_constant<bool_value> type;
2720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const bool value = bool_value;
2721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool bool_value> const bool bool_constant<bool_value>::value;
2723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef bool_constant<false> false_type;
2725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef bool_constant<true> true_type;
2726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct is_pointer : public false_type {};
2729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct is_pointer<T*> : public true_type {};
2732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Iterator>
2734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IteratorTraits {
2735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename Iterator::value_type value_type;
2736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IteratorTraits<T*> {
2740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T value_type;
2741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
2744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IteratorTraits<const T*> {
2745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T value_type;
2746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS
2749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_PATH_SEP_ "\\"
2750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_ALT_PATH_SEP_ 1
2751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The biggest signed integer type the compiler supports.
2752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef __int64 BiggestInt;
2753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_PATH_SEP_ "/"
2755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_HAS_ALT_PATH_SEP_ 0
2756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef long long BiggestInt;  // NOLINT
2757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_WINDOWS
2758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Utilities for char.
2760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// isspace(int ch) and friends accept an unsigned char or EOF.  char
2762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// may be signed, depending on the compiler (or compiler flags).
2763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Therefore we need to cast a char to unsigned char before calling
2764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// isspace(), etc.
2765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsAlpha(char ch) {
2767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return isalpha(static_cast<unsigned char>(ch)) != 0;
2768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsAlNum(char ch) {
2770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return isalnum(static_cast<unsigned char>(ch)) != 0;
2771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsDigit(char ch) {
2773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return isdigit(static_cast<unsigned char>(ch)) != 0;
2774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsLower(char ch) {
2776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return islower(static_cast<unsigned char>(ch)) != 0;
2777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsSpace(char ch) {
2779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return isspace(static_cast<unsigned char>(ch)) != 0;
2780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsUpper(char ch) {
2782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return isupper(static_cast<unsigned char>(ch)) != 0;
2783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsXDigit(char ch) {
2785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return isxdigit(static_cast<unsigned char>(ch)) != 0;
2786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsXDigit(wchar_t ch) {
2788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const unsigned char low_byte = static_cast<unsigned char>(ch);
2789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ch == low_byte && isxdigit(low_byte) != 0;
2790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char ToLower(char ch) {
2793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
2794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char ToUpper(char ch) {
2796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
2797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The testing::internal::posix namespace holds wrappers for common
2800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// POSIX functions.  These wrappers hide the differences between
2801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Windows/MSVC and POSIX systems.  Since some compilers define these
2802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// standard functions as macros, the wrapper cannot have the same name
2803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as the wrapped function.
2804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace posix {
2806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Functions with a different name on Windows.
2808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS
2810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef struct _stat StatStruct;
2812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef __BORLANDC__
2814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int fd) { return isatty(fd); }
2815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int StrCaseCmp(const char* s1, const char* s2) {
2816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return stricmp(s1, s2);
2817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char* StrDup(const char* src) { return strdup(src); }
2819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else  // !__BORLANDC__
2820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  if GTEST_OS_WINDOWS_MOBILE
2821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int /* fd */) { return 0; }
2822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
2823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int fd) { return _isatty(fd); }
2824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif  // GTEST_OS_WINDOWS_MOBILE
2825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int StrCaseCmp(const char* s1, const char* s2) {
2826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return _stricmp(s1, s2);
2827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char* StrDup(const char* src) { return _strdup(src); }
2829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // __BORLANDC__
2830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_WINDOWS_MOBILE
2832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
2833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
2834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// time and thus not defined there.
2835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
2836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FileNo(FILE* file) { return _fileno(file); }
2837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
2838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int RmDir(const char* dir) { return _rmdir(dir); }
2839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsDir(const StatStruct& st) {
2840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return (_S_IFDIR & st.st_mode) != 0;
2841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_OS_WINDOWS_MOBILE
2843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef struct stat StatStruct;
2847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FileNo(FILE* file) { return fileno(file); }
2849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int IsATTY(int fd) { return isatty(fd); }
2850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
2851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int StrCaseCmp(const char* s1, const char* s2) {
2852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return strcasecmp(s1, s2);
2853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline char* StrDup(const char* src) { return strdup(src); }
2855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int RmDir(const char* dir) { return rmdir(dir); }
2856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
2857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_WINDOWS
2859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Functions deprecated by MSVC 8.0.
2861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
2863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Temporarily disable warning 4996 (deprecated function).
2864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(push)
2865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(disable:4996)
2866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* StrNCpy(char* dest, const char* src, size_t n) {
2869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return strncpy(dest, src, n);
2870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
2873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StrError() aren't needed on Windows CE at this time and thus not
2874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defined there.
2875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS_MOBILE
2877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int ChDir(const char* dir) { return chdir(dir); }
2878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline FILE* FOpen(const char* path, const char* mode) {
2880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return fopen(path, mode);
2881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS_MOBILE
2883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
2884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return freopen(path, mode, stream);
2885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
2887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int FClose(FILE* fp) { return fclose(fp); }
2889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_WINDOWS_MOBILE
2890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Read(int fd, void* buf, unsigned int count) {
2891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return static_cast<int>(read(fd, buf, count));
2892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Write(int fd, const void* buf, unsigned int count) {
2894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return static_cast<int>(write(fd, buf, count));
2895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int Close(int fd) { return close(fd); }
2897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* StrError(int errnum) { return strerror(errnum); }
2898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* GetEnv(const char* name) {
2900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS_MOBILE
2901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We are on Windows CE, which has no environment variables.
2902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return NULL;
2903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
2904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Environment variables which we programmatically clear will be set to the
2905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // empty string rather than unset (NULL).  Handle that case.
2906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* const env = getenv(name);
2907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return (env != NULL && env[0] != '\0') ? env : NULL;
2908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return getenv(name);
2910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
2912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
2914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(pop)  // Restores the warning state.
2915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS_MOBILE
2918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Windows CE has no C library. The abort() function is used in
2919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// several places in Google Test. This implementation provides a reasonable
2920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// imitation of standard behaviour.
2921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid Abort();
2922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void Abort() { abort(); }
2924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_WINDOWS_MOBILE
2925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace posix
2927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
2929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
2930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
2931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function in order to achieve that.  We use macro definition here because
2932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// snprintf is a variadic function.
2933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
2934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC 2005 and above support variadic macros.
2935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_SNPRINTF_(buffer, size, format, ...) \
2936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
2937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(_MSC_VER)
2938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
2939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// complain about _snprintf.
2940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_SNPRINTF_ _snprintf
2941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
2942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_SNPRINTF_ snprintf
2943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
2944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The maximum number a BiggestInt can represent.  This definition
2946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// works no matter BiggestInt is represented in one's complement or
2947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// two's complement.
2948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We cannot rely on numeric_limits in STL, as __int64 and long long
2950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are not part of standard C++ and numeric_limits doesn't need to be
2951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defined for them.
2952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst BiggestInt kMaxBiggestInt =
2953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
2954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This template class serves as a compile-time function from size to
2956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type.  It maps a size in bytes to a primitive type with that
2957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// size. e.g.
2958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TypeWithSize<4>::UInt
2960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is typedef-ed to be unsigned int (unsigned integer made up of 4
2962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// bytes).
2963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Such functionality should belong to STL, but I cannot find it
2965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// there.
2966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test uses this class in the implementation of floating-point
2968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// comparison.
2969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
2970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For now it only handles UInt (unsigned int) as that's all Google Test
2971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// needs.  Other types can be easily added in the future if need
2972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// arises.
2973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <size_t size>
2974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithSize {
2975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This prevents the user from using TypeWithSize<N> with incorrect
2977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // values of N.
2978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef void UInt;
2979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The specialization for size 4.
2982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
2983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithSize<4> {
2984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // unsigned int has size 4 in both gcc and MSVC.
2986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
2987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // As base/basictypes.h doesn't compile on Windows, we cannot use
2988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // uint32, uint64, and etc here.
2989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef int Int;
2990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef unsigned int UInt;
2991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
2992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
2993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The specialization for size 8.
2994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
2995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithSize<8> {
2996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
2997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS
2998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef __int64 Int;
2999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef unsigned __int64 UInt;
3000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
3001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef long long Int;  // NOLINT
3002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef unsigned long long UInt;  // NOLINT
3003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_WINDOWS
3004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Integer types of known sizes.
3007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<4>::Int Int32;
3008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<4>::UInt UInt32;
3009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<8>::Int Int64;
3010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<8>::UInt UInt64;
3011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
3012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Utilities for command line flags and environment variables.
3014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macro for referencing flags.
3016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FLAG(name) FLAGS_gtest_##name
3017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for declaring flags.
3019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
3020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DECLARE_int32_(name) \
3021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
3022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DECLARE_string_(name) \
3023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_API_ extern ::std::string GTEST_FLAG(name)
3024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for defining flags.
3026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEFINE_bool_(name, default_val, doc) \
3027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
3028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEFINE_int32_(name, default_val, doc) \
3029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
3030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_DEFINE_string_(name, default_val, doc) \
3031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
3032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Thread annotations
3034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
3035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_LOCK_EXCLUDED_(locks)
3036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
3038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to *value and returns true; otherwise leaves *value unchanged and returns
3039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// false.
3040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TODO(chandlerc): Find a better way to refactor flag and environment parsing
3041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
3042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function.
3043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool ParseInt32(const Message& src_text, const char* str, Int32* value);
3044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses a bool/Int32/string from the environment variable
3046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// corresponding to the given Google Test flag.
3047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool BoolFromGTestEnv(const char* flag, bool default_val);
3048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
3049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char* StringFromGTestEnv(const char* flag, const char* default_val);
3050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
3052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
3053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
3055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_LINUX
3057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <stdlib.h>
3058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <sys/types.h>
3059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <sys/wait.h>
3060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <unistd.h>
3061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_LINUX
3062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_EXCEPTIONS
3064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <stdexcept>
3065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
3066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <ctype.h>
3068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <float.h>
3069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string.h>
3070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <iomanip>
3071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <limits>
3072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <set>
3073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
3075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
3076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
3078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
3079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
3080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
3082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
3083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
3084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
3085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
3086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
3087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
3088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
3089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
3090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
3104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test)
3106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file defines the Message class.
3108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
3110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// leave some internal implementation details in this header file.
3111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// They are clearly marked by comments like this:
3112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
3114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Such code is NOT meant to be used by a user directly, and is subject
3116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
3117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// program!
3118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
3120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
3121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <limits>
3123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Ensures that there is at least one operator<< in the global namespace.
3126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// See Message& operator<<(...) below for why.
3127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid operator<<(const testing::internal::Secret&, int);
3128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
3130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Message class works like an ostream repeater.
3132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Typical usage:
3134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   1. You stream a bunch of values to a Message object.
3136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      It will remember the text in a stringstream.
3137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   2. Then you stream the Message object to an ostream.
3138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      This causes the text in the Message to be streamed
3139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      to the ostream.
3140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For example;
3142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   testing::Message foo;
3144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   foo << 1 << " != " << 2;
3145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   std::cout << foo;
3146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will print "1 != 2".
3148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Message is not intended to be inherited from.  In particular, its
3150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// destructor is not virtual.
3151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note that stringstream behaves differently in gcc and in MSVC.  You
3153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can stream a NULL char pointer to it in the former, but not in the
3154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// latter (it causes an access violation if you do).  The Message
3155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class hides this difference by treating a NULL char pointer as
3156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "(null)".
3157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ Message {
3158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
3159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The type of basic IO manipulators (endl, ends, and flush) for
3160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // narrow streams.
3161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
3162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
3164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructs an empty Message.
3165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message();
3166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Copy constructor.
3168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
3169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *ss_ << msg.GetString();
3170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructs a Message from a C-string.
3173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit Message(const char* str) : ss_(new ::std::stringstream) {
3174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *ss_ << str;
3175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_SYMBIAN
3178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Streams a value (either a pointer or not) to this object.
3179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
3180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  inline Message& operator <<(const T& value) {
3181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    StreamHelper(typename internal::is_pointer<T>::type(), value);
3182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
3183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
3185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Streams a non-pointer value to this object.
3186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
3187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  inline Message& operator <<(const T& val) {
3188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Some libraries overload << for STL containers.  These
3189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // overloads are defined in the global namespace instead of ::std.
3190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    //
3191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
3192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // overloads are visible in either the std namespace or the global
3193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // namespace, but not other namespaces, including the testing
3194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // namespace which Google Test's Message class is in.
3195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    //
3196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // To allow STL containers (and other types that has a << operator
3197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // defined in the global namespace) to be used in Google Test
3198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // assertions, testing::Message must access the custom << operator
3199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // from the global namespace.  With this using declaration,
3200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // overloads of << defined in the global namespace and those
3201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // visible via Koenig lookup are both exposed in this function.
3202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    using ::operator <<;
3203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *ss_ << val;
3204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
3205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Streams a pointer value to this object.
3208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This function is an overload of the previous one.  When you
3210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // stream a pointer to a Message, this definition will be used as it
3211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // is more specialized.  (The C++ Standard, section
3212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // [temp.func.order].)  If you stream a non-pointer, then the
3213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // previous definition will be used.
3214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The reason for this overload is that streaming a NULL pointer to
3216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ostream is undefined behavior.  Depending on the compiler, you
3217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // may get "0", "(nil)", "(null)", or an access violation.  To
3218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ensure consistent result across compilers, we always treat NULL
3219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // as "(null)".
3220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
3221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  inline Message& operator <<(T* const& pointer) {  // NOLINT
3222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (pointer == NULL) {
3223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *ss_ << "(null)";
3224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
3225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *ss_ << pointer;
3226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
3227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
3228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_SYMBIAN
3230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Since the basic IO manipulators are overloaded for both narrow
3232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // and wide streams, we have to provide this specialized definition
3233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // of operator <<, even though its body is the same as the
3234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // templatized version above.  Without this definition, streaming
3235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // endl or other basic IO manipulators to Message will confuse the
3236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // compiler.
3237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message& operator <<(BasicNarrowIoManip val) {
3238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *ss_ << val;
3239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
3240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Instead of 1/0, we want to see true/false for bool values.
3243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message& operator <<(bool b) {
3244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this << (b ? "true" : "false");
3245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // These two overloads allow streaming a wide C string to a Message
3248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // using the UTF-8 encoding.
3249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message& operator <<(const wchar_t* wide_c_str);
3250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message& operator <<(wchar_t* wide_c_str);
3251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STD_WSTRING
3253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Converts the given wide string to a narrow string using the UTF-8
3254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // encoding, and streams the result to this Message object.
3255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message& operator <<(const ::std::wstring& wstr);
3256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_STD_WSTRING
3257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_WSTRING
3259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Converts the given wide string to a narrow string using the UTF-8
3260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // encoding, and streams the result to this Message object.
3261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Message& operator <<(const ::wstring& wstr);
3262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_WSTRING
3263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the text streamed to this object so far as an std::string.
3265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Each '\0' character in the buffer is replaced with "\\0".
3266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
3268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string GetString() const;
3269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
3271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_SYMBIAN
3273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // These are needed as the Nokia Symbian Compiler cannot decide between
3274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // const T& and const T* in a function template. The Nokia compiler _can_
3275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // decide between class template specializations for T and T*, so a
3276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // tr1::type_traits-like is_pointer works, and we can overload on that.
3277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
3278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
3279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (pointer == NULL) {
3280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *ss_ << "(null)";
3281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
3282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *ss_ << pointer;
3283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
3284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
3286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  inline void StreamHelper(internal::false_type /*is_pointer*/,
3287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           const T& value) {
3288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // See the comments in Message& operator <<(const T&) above for why
3289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // we need this using statement.
3290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    using ::operator <<;
3291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *ss_ << value;
3292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_SYMBIAN
3294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We'll hold the text streamed to this object here.
3296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::scoped_ptr< ::std::stringstream> ss_;
3297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We declare (but don't implement) this to prevent the compiler
3299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // from implementing the assignment operator.
3300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const Message&);
3301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Streams a Message to an ostream.
3304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline std::ostream& operator <<(std::ostream& os, const Message& sb) {
3305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return os << sb.GetString();
3306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
3307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
3309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Converts a streamable value to an std::string.  A NULL pointer is
3311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// converted to "(null)".  When the input value is a ::string,
3312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::std::string, ::wstring, or ::std::wstring object, each NUL
3313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// character in it is replaced with "\\0".
3314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
3315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstd::string StreamableToString(const T& streamable) {
3316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return (Message() << streamable).GetString();
3317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
3318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
3320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
3321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
3323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
3324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
3325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
3327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
3328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
3329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
3331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
3332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
3333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
3334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
3335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
3336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
3337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
3338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
3339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
3353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test)
3355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file declares the String class and functions used internally by
3357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test.  They are subject to change without notice. They should not used
3358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by code external to Google Test.
3359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file is #included by <gtest/internal/gtest-internal.h>.
3361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// It should not be #included by other files.
3362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
3364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
3365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef __BORLANDC__
3367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// string.h is not guaranteed to provide strcpy on C++ Builder.
3368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <mem.h>
3369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
3370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string.h>
3372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string>
3373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
3376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
3377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// String - an abstract class holding static string utilities.
3379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ String {
3380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
3381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static utility methods
3382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Clones a 0-terminated C string, allocating memory using new.  The
3384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // caller is responsible for deleting the return value using
3385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // delete[].  Returns the cloned string, or NULL if the input is
3386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NULL.
3387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This is different from strdup() in string.h, which allocates
3389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // memory using malloc().
3390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const char* CloneCString(const char* c_str);
3391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS_MOBILE
3393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
3394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // able to pass strings to Win32 APIs on CE we need to convert them
3395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // to 'Unicode', UTF-16.
3396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates a UTF-16 wide string from the given ANSI string, allocating
3398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // memory using new. The caller is responsible for deleting the return
3399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // value using delete[]. Returns the wide string, or NULL if the
3400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // input is NULL.
3401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The wide string is created using the ANSI codepage (CP_ACP) to
3403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // match the behaviour of the ANSI versions of Win32 calls and the
3404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // C runtime.
3405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static LPCWSTR AnsiToUtf16(const char* c_str);
3406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates an ANSI string from the given wide string, allocating
3408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // memory using new. The caller is responsible for deleting the return
3409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // value using delete[]. Returns the ANSI string, or NULL if the
3410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // input is NULL.
3411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The returned string is created using the ANSI codepage (CP_ACP) to
3413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // match the behaviour of the ANSI versions of Win32 calls and the
3414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // C runtime.
3415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
3416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
3417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Compares two C strings.  Returns true iff they have the same content.
3419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Unlike strcmp(), this function can handle NULL argument(s).  A
3421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NULL C string is considered different to any non-NULL C string,
3422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // including the empty string.
3423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool CStringEquals(const char* lhs, const char* rhs);
3424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Converts a wide C string to a String using the UTF-8 encoding.
3426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NULL will be converted to "(null)".  If an error occurred during
3427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the conversion, "(failed to convert from wide string)" is
3428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // returned.
3429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static std::string ShowWideCString(const wchar_t* wide_c_str);
3430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Compares two wide C strings.  Returns true iff they have the same
3432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // content.
3433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Unlike wcscmp(), this function can handle NULL argument(s).  A
3435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NULL C string is considered different to any non-NULL C string,
3436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // including the empty string.
3437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
3438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Compares two C strings, ignoring case.  Returns true iff they
3440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // have the same content.
3441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Unlike strcasecmp(), this function can handle NULL argument(s).
3443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A NULL C string is considered different to any non-NULL C string,
3444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // including the empty string.
3445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool CaseInsensitiveCStringEquals(const char* lhs,
3446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                           const char* rhs);
3447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Compares two wide C strings, ignoring case.  Returns true iff they
3449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // have the same content.
3450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Unlike wcscasecmp(), this function can handle NULL argument(s).
3452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A NULL C string is considered different to any non-NULL wide C string,
3453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // including the empty string.
3454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NB: The implementations on different platforms slightly differ.
3455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
3456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // environment variable. On GNU platform this method uses wcscasecmp
3457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // which compares according to LC_CTYPE category of the current locale.
3458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
3459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // current locale.
3460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
3461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                               const wchar_t* rhs);
3462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the given string ends with the given suffix, ignoring
3464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // case. Any string is considered to end with an empty suffix.
3465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool EndsWithCaseInsensitive(
3466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const std::string& str, const std::string& suffix);
3467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Formats an int value as "%02d".
3469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
3470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Formats an int value as "%X".
3472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static std::string FormatHexInt(int value);
3473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Formats a byte as "%02X".
3475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static std::string FormatByte(unsigned char value);
3476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
3478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  String();  // Not meant to be instantiated.
3479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class String
3480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
3482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// character in the buffer is replaced with "\\0".
3483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
3484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
3486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
3487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
3489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008, Google Inc.
3490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
3491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
3493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
3494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
3495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
3497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
3498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
3499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
3500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
3501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
3502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
3503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
3504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
3505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: keith.ray@gmail.com (Keith Ray)
3519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test filepath utilities
3521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file declares classes and functions used internally by
3523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test.  They are subject to change without notice.
3524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file is #included in <gtest/internal/gtest-internal.h>.
3526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Do not include this header file separately!
3527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
3529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
3530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
3533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
3534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FilePath - a class for file and directory pathname manipulation which
3536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// handles platform-specific conventions (like the pathname separator).
3537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used for helper functions for naming files in a directory for xml output.
3538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Except for Set methods, all methods are const or static, which provides an
3539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "immutable value object" -- useful for peace of mind.
3540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A FilePath with a value ending in a path separator ("like/this/") represents
3541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a directory, otherwise it is assumed to represent a file. In either case,
3542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it may or may not represent an actual file or directory in the file system.
3543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Names are NOT checked for syntax correctness -- no checking for illegal
3544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// characters, malformed paths, etc.
3545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ FilePath {
3547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
3548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath() : pathname_("") { }
3549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
3550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
3552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Normalize();
3553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath& operator=(const FilePath& rhs) {
3556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Set(rhs);
3557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
3558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Set(const FilePath& rhs) {
3561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    pathname_ = rhs.pathname_;
3562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
3563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::string& string() const { return pathname_; }
3565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* c_str() const { return pathname_.c_str(); }
3566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the current working directory, or "" if unsuccessful.
3568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static FilePath GetCurrentDir();
3569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Given directory = "dir", base_name = "test", number = 0,
3571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // extension = "xml", returns "dir/test.xml". If number is greater
3572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // than zero (e.g., 12), returns "dir/test_12.xml".
3573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On Windows platform, uses \ as the separator rather than /.
3574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static FilePath MakeFileName(const FilePath& directory,
3575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               const FilePath& base_name,
3576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               int number,
3577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               const char* extension);
3578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Given directory = "dir", relative_path = "test.xml",
3580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // returns "dir/test.xml".
3581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On Windows, uses \ as the separator rather than /.
3582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static FilePath ConcatPaths(const FilePath& directory,
3583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                              const FilePath& relative_path);
3584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns a pathname for a file that does not currently exist. The pathname
3586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // will be directory/base_name.extension or
3587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // directory/base_name_<number>.extension if directory/base_name.extension
3588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // already exists. The number will be incremented until a pathname is found
3589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // that does not already exist.
3590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
3591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // There could be a race condition if two or more processes are calling this
3592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // function at the same time -- they could both pick the same filename.
3593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static FilePath GenerateUniqueFileName(const FilePath& directory,
3594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                         const FilePath& base_name,
3595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                         const char* extension);
3596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the path is "".
3598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool IsEmpty() const { return pathname_.empty(); }
3599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // If input name has a trailing separator character, removes it and returns
3601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the name, otherwise return the name string unmodified.
3602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On Windows platform, uses \ as the separator, other platforms use /.
3603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath RemoveTrailingPathSeparator() const;
3604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns a copy of the FilePath with the directory part removed.
3606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
3607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
3608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
3609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // returns an empty FilePath ("").
3610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On Windows platform, '\' is the path separator, otherwise it is '/'.
3611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath RemoveDirectoryName() const;
3612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // RemoveFileName returns the directory path with the filename removed.
3614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
3615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
3616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
3617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
3618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On Windows platform, '\' is the path separator, otherwise it is '/'.
3619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath RemoveFileName() const;
3620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns a copy of the FilePath with the case-insensitive extension removed.
3622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
3623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // FilePath("dir/file"). If a case-insensitive extension is not
3624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // found, returns a copy of the original FilePath.
3625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FilePath RemoveExtension(const char* extension) const;
3626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates directories so that path exists. Returns true if successful or if
3628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the directories already exist; returns false if unable to create
3629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // directories for any reason. Will also return false if the FilePath does
3630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // not represent a directory (that is, it doesn't end with a path separator).
3631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool CreateDirectoriesRecursively() const;
3632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Create the directory so that path exists. Returns true if successful or
3634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // if the directory already exists; returns false if unable to create the
3635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // directory for any reason, including if the parent directory does not
3636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // exist. Not named "CreateDirectory" because that's a macro on Windows.
3637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool CreateFolder() const;
3638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if FilePath describes something in the file-system,
3640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // either a file, directory, or whatever, and that something exists.
3641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool FileOrDirectoryExists() const;
3642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if pathname describes a directory in the file-system
3644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // that exists.
3645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool DirectoryExists() const;
3646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if FilePath ends with a path separator, which indicates that
3648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // it is intended to represent a directory. Returns false otherwise.
3649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This does NOT check that a directory (or file) actually exists.
3650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool IsDirectory() const;
3651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if pathname describes a root directory. (Windows has one
3653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // root directory per disk drive.)
3654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool IsRootDirectory() const;
3655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if pathname describes an absolute path.
3657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool IsAbsolutePath() const;
3658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
3660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Replaces multiple consecutive separators with a single separator.
3661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
3662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // redundancies that might be in a pathname involving "." or "..".
3663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A pathname with multiple consecutive separators may occur either through
3665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // user error or as a result of some scripts or APIs that generate a pathname
3666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // with a trailing separator. On other platforms the same API or script
3667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // may NOT generate a pathname with a trailing "/". Then elsewhere that
3668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // pathname may have another "/" and pathname components added to it,
3669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // without checking for the separator already being there.
3670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The script language and operating system may allow paths like "foo//bar"
3671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // but some of the functions in FilePath will not handle that correctly. In
3672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // particular, RemoveTrailingPathSeparator() only removes one separator, and
3673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // it is called in CreateDirectoriesRecursively() assuming that it will change
3674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // a pathname from directory syntax (trailing separator) to filename syntax.
3675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
3676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On Windows this method also replaces the alternate path separator '/' with
3677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
3678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // "bar\\foo".
3679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Normalize();
3681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns a pointer to the last occurence of a valid path separator in
3683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the FilePath. On Windows, for example, both '/' and '\' are valid path
3684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // separators. Returns NULL if no path separator was found.
3685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* FindLastPathSeparator() const;
3686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string pathname_;
3688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class FilePath
3689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
3691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
3692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
3694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file was GENERATED by command:
3695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     pump.py gtest-type-util.h.pump
3696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DO NOT EDIT BY HAND!!!
3697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008 Google Inc.
3699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All Rights Reserved.
3700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
3702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
3703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
3704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
3706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
3707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
3708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
3709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
3710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
3711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
3712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
3713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
3714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
3728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Type utilities needed for implementing typed and type-parameterized
3730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
3731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
3732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Currently we support at most 50 types in a list, and at most 50
3733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type-parameterized tests in one type-parameterized test case.
3734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Please contact googletestframework@googlegroups.com if you need
3735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// more.
3736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
3738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
3739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
3742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// libstdc++ (which is where cxxabi.h comes from).
3743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_HAS_CXXABI_H_
3744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  include <cxxabi.h>
3745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# elif defined(__HP_aCC)
3746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  include <acxx_demangle.h>
3747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_HASH_CXXABI_H_
3748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
3750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
3751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetTypeName<T>() returns a human-readable name of type T.
3753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// NB: This function is also used in Google Mock, so don't move it inside of
3754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the typed-test-only section below.
3755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
3756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstd::string GetTypeName() {
3757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_HAS_RTTI
3758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* const name = typeid(T).name();
3760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
3761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int status = 0;
3762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // gcc's implementation of typeid(T).name() mangles the type name,
3763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // so we have to demangle it.
3764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   if GTEST_HAS_CXXABI_H_
3765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  using abi::__cxa_demangle;
3766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#   endif  // GTEST_HAS_CXXABI_H_
3767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
3768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::string name_str(status == 0 ? readable_name : name);
3769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  free(readable_name);
3770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return name_str;
3771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  else
3772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return name;
3773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
3774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
3776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return "<type>";
3778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_HAS_RTTI
3780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
3781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
3783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
3785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type.  This can be used as a compile-time assertion to ensure that
3786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// two types are equal.
3787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
3789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct AssertTypeEq;
3790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
3792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct AssertTypeEq<T, T> {
3793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef bool type;
3794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A unique type used as the default value for the arguments of class
3797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// template Types.  This allows us to simulate variadic templates
3798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
3799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// support directly.
38001a7cfd6e9668ac3716369f25830a01358e0f0ef2FslNopper#undef None
3801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct None {};
3802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The following family of struct and struct templates are used to
3804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
3805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// represents a type list with N types (T1, T2, ..., and TN) in it.
3806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Except for Types0, every struct in the family has two member types:
3807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Head for the first type in the list, and Tail for the rest of the
3808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// list.
3809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The empty type list.
3811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types0 {};
3812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Type lists of length 1, 2, 3, and so on.
3814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1>
3816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types1 {
3817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types0 Tail;
3819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
3821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types2 {
3822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types1<T2> Tail;
3824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3>
3827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types3 {
3828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types2<T2, T3> Tail;
3830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4>
3833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types4 {
3834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types3<T2, T3, T4> Tail;
3836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types5 {
3840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types4<T2, T3, T4, T5> Tail;
3842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6>
3846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types6 {
3847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types5<T2, T3, T4, T5, T6> Tail;
3849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7>
3853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types7 {
3854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
3856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8>
3860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types8 {
3861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
3863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9>
3867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types9 {
3868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
3870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10>
3874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types10 {
3875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
3877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11>
3882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types11 {
3883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
3885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12>
3890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types12 {
3891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
3893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13>
3898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types13 {
3899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
3901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14>
3906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types14 {
3907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
3909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15>
3914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types15 {
3915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15> Tail;
3918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16>
3924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types16 {
3925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16> Tail;
3928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17>
3934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types17 {
3935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17> Tail;
3938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18>
3944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types18 {
3945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18> Tail;
3948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19>
3954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types19 {
3955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19> Tail;
3958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20>
3964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types20 {
3965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20> Tail;
3968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
3974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21>
3975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types21 {
3976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21> Tail;
3979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
3985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22>
3986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types22 {
3987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22> Tail;
3990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
3991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
3992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
3994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
3995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
3996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23>
3997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types23 {
3998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
3999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
4001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24>
4008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types24 {
4009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
4012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25>
4019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types25 {
4020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
4023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26>
4031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types26 {
4032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
4035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27>
4043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types27 {
4044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
4047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28>
4055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types28 {
4056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
4059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29>
4067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types29 {
4068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
4071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29> Tail;
4072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30>
4080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types30 {
4081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30> Tail;
4085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31>
4094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types31 {
4095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31> Tail;
4099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32>
4108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types32 {
4109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32> Tail;
4113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33>
4122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types33 {
4123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33> Tail;
4127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34>
4136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types34 {
4137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34> Tail;
4141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35>
4150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types35 {
4151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35> Tail;
4155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36>
4165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types36 {
4166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36> Tail;
4170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37>
4180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types37 {
4181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
4185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38>
4195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types38 {
4196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
4200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39>
4210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types39 {
4211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
4215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40>
4225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types40 {
4226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
4230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41>
4241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types41 {
4242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
4246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42>
4257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types42 {
4258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
4262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43>
4273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types43 {
4274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
4278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43> Tail;
4279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44>
4290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types44 {
4291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44> Tail;
4296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45>
4307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types45 {
4308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44, T45> Tail;
4313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
4324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46>
4325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types46 {
4326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44, T45, T46> Tail;
4331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
4342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47>
4343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types47 {
4344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44, T45, T46, T47> Tail;
4349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
4360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48>
4361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types48 {
4362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44, T45, T46, T47, T48> Tail;
4367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
4378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49>
4379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types49 {
4380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44, T45, T46, T47, T48, T49> Tail;
4385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
4394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
4395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
4396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49, typename T50>
4397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types50 {
4398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T1 Head;
4399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T44, T45, T46, T47, T48, T49, T50> Tail;
4403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
4407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We don't want to require the users to write TypesN<...> directly,
4409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as that would require them to count the length.  Types<...> is much
4410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// easier to write, but generates horrible messages when there is a
4411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler error, as gcc insists on printing out each template
4412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// argument, even if it has the default value (this means Types<int>
4413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will appear as Types<int, None, None, ..., None> in the compiler
4414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// errors).
4415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
4416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Our solution is to combine the best part of the two approaches: a
4417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// user would write Types<T1, ..., TN>, and Google Test will translate
4418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that to TypesN<T1, ..., TN> internally to make error messages
4419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// readable.  The translation is done by the 'type' member of the
4420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Types template.
4421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1 = internal::None, typename T2 = internal::None,
4422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T3 = internal::None, typename T4 = internal::None,
4423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T5 = internal::None, typename T6 = internal::None,
4424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T7 = internal::None, typename T8 = internal::None,
4425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T9 = internal::None, typename T10 = internal::None,
4426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11 = internal::None, typename T12 = internal::None,
4427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T13 = internal::None, typename T14 = internal::None,
4428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T15 = internal::None, typename T16 = internal::None,
4429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T17 = internal::None, typename T18 = internal::None,
4430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T19 = internal::None, typename T20 = internal::None,
4431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21 = internal::None, typename T22 = internal::None,
4432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T23 = internal::None, typename T24 = internal::None,
4433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T25 = internal::None, typename T26 = internal::None,
4434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T27 = internal::None, typename T28 = internal::None,
4435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T29 = internal::None, typename T30 = internal::None,
4436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31 = internal::None, typename T32 = internal::None,
4437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T33 = internal::None, typename T34 = internal::None,
4438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T35 = internal::None, typename T36 = internal::None,
4439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T37 = internal::None, typename T38 = internal::None,
4440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T39 = internal::None, typename T40 = internal::None,
4441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41 = internal::None, typename T42 = internal::None,
4442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T43 = internal::None, typename T44 = internal::None,
4443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T45 = internal::None, typename T46 = internal::None,
4444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T47 = internal::None, typename T48 = internal::None,
4445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T49 = internal::None, typename T50 = internal::None>
4446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types {
4447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
4450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
4451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
4453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
4454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<internal::None, internal::None, internal::None, internal::None,
4455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types0 type;
4468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1>
4470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, internal::None, internal::None, internal::None,
4471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types1<T1> type;
4484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
4486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, internal::None, internal::None, internal::None,
4487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types2<T1, T2> type;
4500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3>
4502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, internal::None, internal::None, internal::None,
4503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types3<T1, T2, T3> type;
4515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4>
4517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
4518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types4<T1, T2, T3, T4> type;
4530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
4532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
4533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types5<T1, T2, T3, T4, T5> type;
4545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6>
4548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
4549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
4561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7>
4564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
4565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
4577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8>
4580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
4581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
4592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9>
4595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
4596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
4607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10>
4610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
4611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
4622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11>
4626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
4627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
4638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12>
4642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
4643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12> type;
4655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13>
4659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13> type;
4672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14>
4676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
4677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14> type;
4688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15>
4692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15> type;
4704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16>
4709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, internal::None, internal::None, internal::None, internal::None,
4711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16> type;
4721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17>
4726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, internal::None, internal::None, internal::None, internal::None,
4728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17> type;
4738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18>
4743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, internal::None, internal::None, internal::None,
4745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18> type;
4755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19>
4760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, internal::None, internal::None, internal::None,
4762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19> type;
4771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20>
4776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
4778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20> type;
4787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21>
4793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
4795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
4804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22>
4810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
4812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
4821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23>
4827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
4829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
4838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24>
4844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
4846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
4855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25>
4861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
4863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
4871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26>
4878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
4880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
4888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26> type;
4889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27>
4896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
4898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27> type;
4907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28>
4914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
4916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28> type;
4925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29>
4932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
4940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29> type;
4943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30>
4950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
4952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
4957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30> type;
4960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31>
4968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
4970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, internal::None, internal::None, internal::None, internal::None,
4971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
4975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31> type;
4978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
4982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
4983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
4984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
4985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32>
4986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
4988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, internal::None, internal::None, internal::None, internal::None,
4989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
4992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
4993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32> type;
4996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
4997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
4999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33>
5004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, internal::None, internal::None, internal::None,
5007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
5011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33> type;
5014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34>
5022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, internal::None, internal::None, internal::None,
5025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
5029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34> type;
5032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35>
5040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
5043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
5046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
5049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36>
5058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
5061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
5064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
5067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37>
5076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
5079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
5082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
5085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38>
5094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
5097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
5100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
5103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39>
5112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
5115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
5118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
5121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40>
5130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
5133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
5136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
5139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40> type;
5140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41>
5150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
5153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None> {
5155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41> type;
5159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42>
5169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
5172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
5174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42> type;
5178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43>
5188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
5191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None> {
5193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43> type;
5197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44>
5207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
5210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None> {
5212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44> type;
5216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45>
5226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None, internal::None, internal::None, internal::None,
5230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::None> {
5231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45> type;
5235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
5245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46>
5246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T46, internal::None, internal::None, internal::None, internal::None> {
5250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45, T46> type;
5254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
5264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47>
5265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T46, T47, internal::None, internal::None, internal::None> {
5269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45, T46, T47> type;
5273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
5283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48>
5284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T46, T47, T48, internal::None, internal::None> {
5288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45, T46, T47, T48> type;
5292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
5295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
5296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
5297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
5298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
5299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
5300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
5301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
5302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49>
5303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T46, T47, T48, T49, internal::None> {
5307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
5311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
5314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_TEMPLATE_ template <typename T> class
5316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The template "selector" struct TemplateSel<Tmpl> is used to
5318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// represent Tmpl, which must be a class template with one type
5319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
5320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as the type Tmpl<T>.  This allows us to actually instantiate the
5321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// template "selected" by TemplateSel<Tmpl>.
5322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
5323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This trick is necessary for simulating typedef for class templates,
5324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// which C++ doesn't support directly.
5325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ Tmpl>
5326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TemplateSel {
5327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
5328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  struct Bind {
5329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef Tmpl<T> type;
5330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
5331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_BIND_(TmplSel, T) \
5334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TmplSel::template Bind<T>::type
5335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A unique struct template used as the default value for the
5337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// arguments of class template Templates.  This allows us to simulate
5338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// variadic templates (e.g. Templates<int>, Templates<int, double>,
5339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and etc), which C++ doesn't support directly.
5340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
5341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct NoneT {};
5342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The following family of struct and struct templates are used to
5344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// represent template lists.  In particular, TemplatesN<T1, T2, ...,
5345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
5346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for Templates0, every struct in the family has two member types:
5347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Head for the selector of the first template in the list, and Tail
5348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for the rest of the list.
5349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The empty template list.
5351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates0 {};
5352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Template lists of length 1, 2, 3, and so on.
5354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1>
5356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates1 {
5357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates0 Tail;
5359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
5361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates2 {
5362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates1<T2> Tail;
5364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
5367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates3 {
5368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates2<T2, T3> Tail;
5370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4>
5374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates4 {
5375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates3<T2, T3, T4> Tail;
5377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
5381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates5 {
5382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates4<T2, T3, T4, T5> Tail;
5384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
5388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates6 {
5389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates5<T2, T3, T4, T5, T6> Tail;
5391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7>
5396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates7 {
5397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
5399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
5404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates8 {
5405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
5407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
5412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates9 {
5413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
5415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10>
5421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates10 {
5422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
5424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
5430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates11 {
5431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
5433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
5439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates12 {
5440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
5442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13>
5449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates13 {
5450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
5452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
5459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates14 {
5460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14> Tail;
5463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
5470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates15 {
5471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15> Tail;
5474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16>
5482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates16 {
5483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16> Tail;
5486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
5494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates17 {
5495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17> Tail;
5498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
5506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates18 {
5507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18> Tail;
5510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19>
5519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates19 {
5520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19> Tail;
5523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
5532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates20 {
5533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20> Tail;
5536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
5545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates21 {
5546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21> Tail;
5549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22>
5559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates22 {
5560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
5563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
5573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates23 {
5574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
5577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
5587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates24 {
5588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
5591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25>
5602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates25 {
5603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
5606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
5617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates26 {
5618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
5621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
5632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates27 {
5633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
5636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28>
5648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates28 {
5649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
5652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28> Tail;
5653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
5665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates29 {
5666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29> Tail;
5670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
5682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates30 {
5683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30> Tail;
5687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31>
5700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates31 {
5701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31> Tail;
5705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
5718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates32 {
5719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32> Tail;
5723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
5736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates33 {
5737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33> Tail;
5741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34>
5755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates34 {
5756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34> Tail;
5760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
5774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates35 {
5775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35> Tail;
5779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
5793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates36 {
5794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
5798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37>
5813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates37 {
5814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
5818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
5833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates38 {
5834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
5838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
5853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates39 {
5854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
5858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40>
5874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates40 {
5875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
5879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
5895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates41 {
5896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
5900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
5916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates42 {
5917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
5921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42> Tail;
5922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
5938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43>
5939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates43 {
5940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
5944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43> Tail;
5945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
5961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
5962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates44 {
5963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
5967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44> Tail;
5968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
5984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
5985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates45 {
5986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
5987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
5990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44, T45> Tail;
5991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
5992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
5993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46>
6009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates46 {
6010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
6011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44, T45, T46> Tail;
6015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
6033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates47 {
6034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
6035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44, T45, T46, T47> Tail;
6039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
6057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates48 {
6058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
6059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44, T45, T46, T47, T48> Tail;
6063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
6081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T49>
6082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates49 {
6083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
6084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44, T45, T46, T47, T48, T49> Tail;
6088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
6106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
6107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates50 {
6108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef TemplateSel<T1> Head;
6109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
6113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We don't want to require the users to write TemplatesN<...> directly,
6117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as that would require them to count the length.  Templates<...> is much
6118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// easier to write, but generates horrible messages when there is a
6119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler error, as gcc insists on printing out each template
6120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// argument, even if it has the default value (this means Templates<list>
6121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
6122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// errors).
6123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
6124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Our solution is to combine the best part of the two approaches: a
6125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// user would write Templates<T1, ..., TN>, and Google Test will translate
6126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that to TemplatesN<T1, ..., TN> internally to make error messages
6127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// readable.  The translation is done by the 'type' member of the
6128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Templates template.
6129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
6130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
6131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
6132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
6133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
6134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
6135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
6136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
6137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
6138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
6139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
6140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
6141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
6142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
6143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
6144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
6145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
6146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
6147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
6148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
6149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
6150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
6151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
6152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
6153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
6154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates {
6155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
6159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
6162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT> {
6168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates0 type;
6169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1>
6171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT> {
6177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates1<T1> type;
6178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
6180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT> {
6186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates2<T1, T2> type;
6187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
6189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates3<T1, T2, T3> type;
6195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4>
6198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates4<T1, T2, T3, T4> type;
6204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
6207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates5<T1, T2, T3, T4, T5> type;
6213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
6216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
6217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
6222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7>
6226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
6227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
6232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
6236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
6237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
6242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
6246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
6247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
6252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10>
6257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
6258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
6263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
6268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
6269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
6274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
6279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
6280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
6285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13>
6291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
6292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
6297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13> type;
6298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
6304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14> type;
6311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
6317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT> {
6322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15> type;
6324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16>
6331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT> {
6336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16> type;
6338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
6345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT> {
6350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17> type;
6352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
6359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT> {
6364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18> type;
6366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19>
6374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT> {
6379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19> type;
6381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
6389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT> {
6394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20> type;
6396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
6404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
6406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT> {
6409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21> type;
6411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22>
6420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
6422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT> {
6425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
6427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
6436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
6438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT> {
6441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
6443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
6452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
6454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT> {
6457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
6459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25>
6469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
6471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT> {
6474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
6476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
6486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
6488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT> {
6491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
6493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
6503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
6505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT> {
6508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27> type;
6511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28>
6522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT> {
6527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28> type;
6530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
6541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT> {
6546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29> type;
6549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
6560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30> type;
6567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31>
6579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31> type;
6586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
6598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32> type;
6605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
6617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33> type;
6624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34>
6637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34> type;
6644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
6657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35> type;
6664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
6677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
6680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
6684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37>
6698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
6701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
6705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
6719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
6722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
6726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
6740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
6743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
6747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40>
6762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
6765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
6769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
6784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
6787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
6791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41> type;
6792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
6807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
6810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42> type;
6815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43>
6831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
6834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43> type;
6839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
6855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44> type;
6863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
6879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
6883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44, T45> type;
6887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46>
6904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T45, T46, NoneT, NoneT, NoneT, NoneT> {
6908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44, T45, T46> type;
6912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
6929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T45, T46, T47, NoneT, NoneT, NoneT> {
6933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44, T45, T46, T47> type;
6937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
6954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T45, T46, T47, T48, NoneT, NoneT> {
6958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44, T45, T46, T47, T48> type;
6962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
6979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEMPLATE_ T49>
6980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T45, T46, T47, T48, T49, NoneT> {
6984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42, T43, T44, T45, T46, T47, T48, T49> type;
6988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The TypeList template makes it possible to use either a single type
6991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or a Types<...> list in TYPED_TEST_CASE() and
6992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TYPED_TEST_CASE_P().
6993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
6995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TypeList {
6996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Types1<T> type;
6997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
6998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
6999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
7000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
7001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
7002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
7003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
7004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
7005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
7006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
7007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
7008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49, typename T50>
7009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
7012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45, T46, T47, T48, T49, T50> > {
7013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
7014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
7015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
7016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
7017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
7022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
7023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
7025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Due to C++ preprocessor weirdness, we need double indirection to
7027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// concatenate two tokens when one of them is __LINE__.  Writing
7028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   foo ## __LINE__
7030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will result in the token foo__LINE__, instead of foo followed by
7032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the current line number.  For more details, see
7033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
7034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
7035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
7036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ProtocolMessage;
7038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace proto2 { class Message; }
7039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
7041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Forward declarations.
7043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass AssertionResult;                 // Result of an assertion.
7045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Message;                         // Represents a failure message.
7046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Test;                            // Represents a test.
7047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestInfo;                        // Information about a test.
7048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestPartResult;                  // Result of a test part.
7049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UnitTest;                        // A collection of test cases.
7050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter::std::string PrintToString(const T& value);
7053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
7055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TraceInfo;                      // Information about a trace point.
7057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ScopedTrace;                     // Implements scoped trace.
7058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestInfoImpl;                    // Opaque implementation of TestInfo
7059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UnitTestImpl;                    // Opaque implementation of UnitTest
7060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// How many times InitGoogleTest() has been called.
7062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ extern int g_init_gtest_count;
7063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The text used in failure messages to indicate the start of the
7065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// stack trace.
7066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ extern const char kStackTraceMarker[];
7067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Two overloaded helpers for checking at compile time whether an
7069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expression is a null pointer literal (i.e. NULL or any 0-valued
7070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile-time integral constant).  Their return values have
7071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// different sizes, so we can use sizeof() to test which version is
7072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// picked by the compiler.  These helpers have no implementations, as
7073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// we only need their signatures.
7074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Given IsNullLiteralHelper(x), the compiler will pick the first
7076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// version if x can be implicitly converted to Secret*, and pick the
7077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// second version otherwise.  Since Secret is a secret and incomplete
7078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type, the only expression a user can write that has type Secret* is
7079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a null pointer literal.  Therefore, we know that x is a null
7080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pointer literal if and only if the first version is picked by the
7081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler.
7082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterchar IsNullLiteralHelper(Secret* p);
7083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterchar (&IsNullLiteralHelper(...))[2];  // NOLINT
7084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A compile-time bool constant that is true if and only if x is a
7086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// null pointer literal (i.e. NULL or any 0-valued compile-time
7087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// integral constant).
7088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef GTEST_ELLIPSIS_NEEDS_POD_
7089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We lose support for NULL detection where the compiler doesn't like
7090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// passing non-POD classes through ellipsis (...).
7091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_IS_NULL_LITERAL_(x) false
7092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
7093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_IS_NULL_LITERAL_(x) \
7094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
7095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_ELLIPSIS_NEEDS_POD_
7096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Appends the user-supplied message to the Google-Test-generated message.
7098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string AppendUserMessage(
7099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const std::string& gtest_msg, const Message& user_msg);
7100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_EXCEPTIONS
7102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This exception is thrown by (and only by) a failed Google Test
7104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
7105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are enabled).  We derive it from std::runtime_error, which is for
7106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// errors presumably detectable only at run time.  Since
7107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// std::runtime_error inherits from std::exception, many testing
7108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// frameworks know how to extract and print the message inside it.
7109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
7110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit GoogleTestFailureException(const TestPartResult& failure);
7112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_EXCEPTIONS
7115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A helper class for creating scoped traces in user programs.
7117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ ScopedTrace {
7118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The c'tor pushes the given source file location and message onto
7120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // a trace stack maintained by Google Test.
7121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ScopedTrace(const char* file, int line, const Message& message);
7122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The d'tor pops the info pushed by the c'tor.
7124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Note that the d'tor is not virtual in order to be efficient.
7126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Don't inherit from ScopedTrace!
7127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~ScopedTrace();
7128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
7131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
7132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            // c'tor and d'tor.  Therefore it doesn't
7133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            // need to be used otherwise.
7134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Constructs and returns the message for an equality assertion
7136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
7137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The first four parameters are the expressions used in the assertion
7139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
7140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// where foo is 5 and bar is 6, we have:
7141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   expected_expression: "foo"
7143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   actual_expression:   "bar"
7144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   expected_value:      "5"
7145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   actual_value:        "6"
7146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The ignoring_case parameter is true iff the assertion is a
7148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
7149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// be inserted into the message.
7150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult EqFailure(const char* expected_expression,
7151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                     const char* actual_expression,
7152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                     const std::string& expected_value,
7153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                     const std::string& actual_value,
7154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                     bool ignoring_case);
7155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
7157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetBoolAssertionFailureMessage(
7158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const AssertionResult& assertion_result,
7159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* expression_text,
7160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* actual_predicate_value,
7161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* expected_predicate_value);
7162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This template class represents an IEEE floating-point number
7164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (either single-precision or double-precision, depending on the
7165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// template parameters).
7166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The purpose of this class is to do more sophisticated number
7168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// comparison.  (Due to round-off error, etc, it's very unlikely that
7169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// two floating-points will be equal exactly.  Hence a naive
7170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// comparison by the == operation often doesn't work.)
7171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Format of IEEE floating-point:
7173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   The most-significant bit being the leftmost, an IEEE
7175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   floating-point looks like
7176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     sign_bit exponent_bits fraction_bits
7178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Here, sign_bit is a single bit that designates the sign of the
7180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   number.
7181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   For float, there are 8 exponent bits and 23 fraction bits.
7183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   For double, there are 11 exponent bits and 52 fraction bits.
7185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   More details can be found at
7187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
7188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Template parameter:
7190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   RawType: the raw floating-point type (either float or double)
7192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename RawType>
7193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FloatingPoint {
7194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Defines the unsigned integer type that has the same size as the
7196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // floating point number.
7197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
7198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constants.
7200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // # of bits in a number.
7202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const size_t kBitCount = 8*sizeof(RawType);
7203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // # of fraction bits in a number.
7205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const size_t kFractionBitCount =
7206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    std::numeric_limits<RawType>::digits - 1;
7207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // # of exponent bits in a number.
7209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
7210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The mask for the sign bit.
7212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
7213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The mask for the fraction bits.
7215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const Bits kFractionBitMask =
7216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
7217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The mask for the exponent bits.
7219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
7220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // How many ULP's (Units in the Last Place) we want to tolerate when
7222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // comparing two numbers.  The larger the value, the more error we
7223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // allow.  A 0 value means that two numbers must be exactly the same
7224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // to be considered equal.
7225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The maximum error of a single floating-point operation is 0.5
7227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // units in the last place.  On Intel CPU's, all floating-point
7228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // calculations are done with 80-bit precision, while double has 64
7229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // bits.  Therefore, 4 should be enough for ordinary use.
7230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // See the following article for more details on ULP:
7232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
7233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const size_t kMaxUlps = 4;
7234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructs a FloatingPoint from a raw floating-point number.
7236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
7238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // around may change its bits, although the new value is guaranteed
7239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // to be also a NAN.  Therefore, don't expect this constructor to
7240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // preserve the bits in x when x is a NAN.
7241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
7242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static methods
7244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Reinterprets a bit pattern as a floating-point number.
7246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This function is needed to test the AlmostEquals() method.
7248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static RawType ReinterpretBits(const Bits bits) {
7249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    FloatingPoint fp(0);
7250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    fp.u_.bits_ = bits;
7251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return fp.u_.value_;
7252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the floating-point number that represent positive infinity.
7255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static RawType Infinity() {
7256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ReinterpretBits(kExponentBitMask);
7257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the maximum representable finite floating-point number.
7260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static RawType Max();
7261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Non-static methods
7263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the bits that represents this number.
7265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Bits &bits() const { return u_.bits_; }
7266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the exponent bits of this number.
7268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
7269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the fraction bits of this number.
7271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
7272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the sign bit of this number.
7274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
7275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff this is NAN (not a number).
7277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool is_nan() const {
7278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // It's a NAN if the exponent bits are all ones and the fraction
7279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // bits are not entirely zeros.
7280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
7281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff this number is at most kMaxUlps ULP's away from
7284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // rhs.  In particular, this function:
7285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   - returns false if either number is (or both are) NAN.
7287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   - treats really large numbers as almost equal to infinity.
7288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
7289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool AlmostEquals(const FloatingPoint& rhs) const {
7290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // The IEEE standard says that any comparison operation involving
7291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // a NAN must return false.
7292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (is_nan() || rhs.is_nan()) return false;
7293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
7295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        <= kMaxUlps;
7296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The data type used to store the actual floating-point number.
7300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  union FloatingPointUnion {
7301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    RawType value_;  // The raw floating-point number.
7302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Bits bits_;      // The bits that represent the number.
7303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
7304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Converts an integer from the sign-and-magnitude representation to
7306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the biased representation.  More precisely, let N be 2 to the
7307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // power of (kBitCount - 1), an integer x is represented by the
7308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // unsigned number x + N.
7309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // For instance,
7311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   -N + 1 (the most negative number representable using
7313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //          sign-and-magnitude) is represented by 1;
7314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   0      is represented by N; and
7315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   N - 1  (the biggest number representable using
7316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //          sign-and-magnitude) is represented by 2N - 1.
7317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Read http://en.wikipedia.org/wiki/Signed_number_representations
7319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // for more details on signed number representations.
7320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
7321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (kSignBitMask & sam) {
7322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // sam represents a negative number.
7323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return ~sam + 1;
7324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
7325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // sam represents a positive number.
7326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return kSignBitMask | sam;
7327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
7328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Given two numbers in the sign-and-magnitude representation,
7331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // returns the distance between them as an unsigned number.
7332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
7333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                     const Bits &sam2) {
7334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
7335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
7336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
7337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  FloatingPointUnion u_;
7340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
7343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macro defined by <windows.h>.
7344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
7345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline float FloatingPoint<float>::Max() { return FLT_MAX; }
7346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
7347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline double FloatingPoint<double>::Max() { return DBL_MAX; }
7348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Typedefs the instances of the FloatingPoint template class that we
7350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// care to use.
7351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef FloatingPoint<float> Float;
7352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef FloatingPoint<double> Double;
7353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In order to catch the mistake of putting tests that use different
7355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test fixture classes in the same test case, we need to assign
7356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// unique IDs to fixture classes and compare them.  The TypeId type is
7357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// used to hold such IDs.  The user should treat TypeId as an opaque
7358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type: the only operation allowed on TypeId values is to compare
7359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// them for equality using the == operator.
7360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef const void* TypeId;
7361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeIdHelper {
7364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // dummy_ must not have a const type.  Otherwise an overly eager
7366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
7367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
7368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool dummy_;
7369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool TypeIdHelper<T>::dummy_ = false;
7373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetTypeId<T>() returns the ID of type T.  Different values will be
7375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returned for different types.  Calling the function twice with the
7376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// same type argument is guaranteed to return the same ID.
7377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTypeId GetTypeId() {
7379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The compiler is required to allocate a different
7380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
7381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the template.  Therefore, the address of dummy_ is guaranteed to
7382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // be unique.
7383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return &(TypeIdHelper<T>::dummy_);
7384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the type ID of ::testing::Test.  Always call this instead
7387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of GetTypeId< ::testing::Test>() to get the type ID of
7388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::testing::Test, as the latter may give the wrong result due to a
7389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// suspected linker bug when compiling Google Test as a Mac OS X
7390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// framework.
7391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ TypeId GetTestTypeId();
7392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines the abstract factory interface that creates instances
7394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of a Test object.
7395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestFactoryBase {
7396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~TestFactoryBase() {}
7398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates a test instance to run. The instance is both created and destroyed
7400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // within TestInfoImpl::Run()
7401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual Test* CreateTest() = 0;
7402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter protected:
7404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestFactoryBase() {}
7405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
7408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class provides implementation of TeastFactoryBase interface.
7411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// It is used in TEST and TEST_F macros.
7412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class TestClass>
7413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestFactoryImpl : public TestFactoryBase {
7414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual Test* CreateTest() { return new TestClass; }
7416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS
7419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Predicate-formatters for implementing the HRESULT checking macros
7421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
7422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We pass a long instead of HRESULT to avoid causing an
7423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// include dependency for the HRESULT type.
7424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
7425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                            long hr);  // NOLINT
7426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
7427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                            long hr);  // NOLINT
7428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_WINDOWS
7430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Types of SetUpTestCase() and TearDownTestCase() functions.
7432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef void (*SetUpTestCaseFunc)();
7433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef void (*TearDownTestCaseFunc)();
7434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Creates a new TestInfo object and registers it with Google Test;
7436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns the created object.
7437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Arguments:
7439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   test_case_name:   name of the test case
7441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   name:             name of the test
7442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   type_param        the name of the test's type parameter, or NULL if
7443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                     this is not a typed or a type-parameterized test.
7444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   value_param       text representation of the test's value parameter,
7445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                     or NULL if this is not a type-parameterized test.
7446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   fixture_class_id: ID of the test fixture class
7447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   set_up_tc:        pointer to the function that sets up the test case
7448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   tear_down_tc:     pointer to the function that tears down the test case
7449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   factory:          pointer to the factory that creates a test object.
7450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                     The newly created TestInfo instance will assume
7451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                     ownership of the factory object.
7452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ TestInfo* MakeAndRegisterTestInfo(
7453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* test_case_name,
7454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* name,
7455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* type_param,
7456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* value_param,
7457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TypeId fixture_class_id,
7458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    SetUpTestCaseFunc set_up_tc,
7459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TearDownTestCaseFunc tear_down_tc,
7460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TestFactoryBase* factory);
7461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If *pstr starts with the given prefix, modifies *pstr to be right
7463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// past the prefix and returns true; otherwise leaves *pstr unchanged
7464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and returns false.  None of pstr, *pstr, and prefix can be NULL.
7465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
7466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// State of the definition of a type-parameterized test case.
7470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TypedTestCasePState {
7471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TypedTestCasePState() : registered_(false) {}
7473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds the given test name to defined_test_names_ and return true
7475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // if the test case hasn't been registered; otherwise aborts the
7476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // program.
7477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool AddTestName(const char* file, int line, const char* case_name,
7478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   const char* test_name) {
7479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (registered_) {
7480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fprintf(stderr, "%s Test %s must be defined before "
7481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
7482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              FormatFileLocation(file, line).c_str(), test_name, case_name);
7483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fflush(stderr);
7484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      posix::Abort();
7485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
7486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    defined_test_names_.insert(test_name);
7487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return true;
7488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Verifies that registered_tests match the test names in
7491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // defined_test_names_; returns registered_tests if successful, or
7492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // aborts the program otherwise.
7493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* VerifyRegisteredTestNames(
7494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* file, int line, const char* registered_tests);
7495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool registered_;
7498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::std::set<const char*> defined_test_names_;
7499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Skips to the first non-space char after the first comma in 'str';
7502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns NULL if no comma is found in 'str'.
7503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline const char* SkipComma(const char* str) {
7504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* comma = strchr(str, ',');
7505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (comma == NULL) {
7506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return NULL;
7507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  while (IsSpace(*(++comma))) {}
7509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return comma;
7510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the prefix of 'str' before the first comma in it; returns
7513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the entire string if it contains no comma.
7514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline std::string GetPrefixUntilComma(const char* str) {
7515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* comma = strchr(str, ',');
7516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return comma == NULL ? str : std::string(str, comma);
7517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
7520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// registers a list of type-parameterized tests with Google Test.  The
7521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// return value is insignificant - we just need to return something
7522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// such that we can call this function in a namespace scope.
7523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implementation note: The GTEST_TEMPLATE_ macro declares a template
7525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// template parameter.  It's defined in gtest-type-util.h.
7526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
7527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeParameterizedTest {
7528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // 'index' is the index of the test in the type list 'Types'
7530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
7531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Types).  Valid values for 'index' are [0, N - 1] where N is the
7532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // length of Types.
7533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Register(const char* prefix, const char* case_name,
7534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       const char* test_names, int index) {
7535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef typename Types::Head Type;
7536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef Fixture<Type> FixtureClass;
7537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
7538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // First, registers the first type-parameterized test in the type
7540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // list.
7541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    MakeAndRegisterTestInfo(
7542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
7543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         + StreamableToString(index)).c_str(),
7544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        GetPrefixUntilComma(test_names).c_str(),
7545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        GetTypeName<Type>().c_str(),
7546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        NULL,  // No value parameter.
7547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        GetTypeId<FixtureClass>(),
7548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        TestClass::SetUpTestCase,
7549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        TestClass::TearDownTestCase,
7550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new TestFactoryImpl<TestClass>);
7551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Next, recurses (at compile time) with the tail of the type list.
7553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
7554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ::Register(prefix, case_name, test_names, index + 1);
7555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The base case for the compile time recursion.
7559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ Fixture, class TestSel>
7560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeParameterizedTest<Fixture, TestSel, Types0> {
7561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
7563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       const char* /*test_names*/, int /*index*/) {
7564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return true;
7565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
7569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// registers *all combinations* of 'Tests' and 'Types' with Google
7570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Test.  The return value is insignificant - we just need to return
7571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// something such that we can call this function in a namespace scope.
7572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
7573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeParameterizedTestCase {
7574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Register(const char* prefix, const char* case_name,
7576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       const char* test_names) {
7577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef typename Tests::Head Head;
7578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // First, register the first test in 'Test' for each type in 'Types'.
7580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TypeParameterizedTest<Fixture, Head, Types>::Register(
7581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        prefix, case_name, test_names, 0);
7582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Next, recurses (at compile time) with the tail of the test list.
7584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
7585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ::Register(prefix, case_name, SkipComma(test_names));
7586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The base case for the compile time recursion.
7590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <GTEST_TEMPLATE_ Fixture, typename Types>
7591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeParameterizedTestCase<Fixture, Templates0, Types> {
7592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
7594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       const char* /*test_names*/) {
7595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return true;
7596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the current OS stack trace as an std::string.
7602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The maximum number of stack frames to be included is specified by
7604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the gtest_stack_trace_depth flag.  The skip_count parameter
7605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// specifies the number of top frames to be skipped, which doesn't
7606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// count against the number of frames to be included.
7607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For example, if Foo() calls Bar(), which in turn calls
7609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
7610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
7611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
7612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UnitTest* unit_test, int skip_count);
7613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helpers for suppressing warnings on unreachable code or constant
7615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// condition.
7616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Always returns true.
7618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool AlwaysTrue();
7619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Always returns false.
7621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool AlwaysFalse() { return !AlwaysTrue(); }
7622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper for suppressing false warning from Clang on a const char*
7624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// variable declared in a conditional expression always being NULL in
7625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the else branch.
7626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct GTEST_API_ ConstCharPtr {
7627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ConstCharPtr(const char* str) : value(str) {}
7628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator bool() const { return true; }
7629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* value;
7630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A simple Linear Congruential Generator for generating random
7633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// numbers with a uniform distribution.  Unlike rand() and srand(), it
7634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// doesn't use global state (and therefore can't interfere with user
7635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
7636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// but it's good enough for our purposes.
7637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ Random {
7638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const UInt32 kMaxRange = 1u << 31;
7640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit Random(UInt32 seed) : state_(seed) {}
7642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Reseed(UInt32 seed) { state_ = seed; }
7644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Generates a random number from [0, range).  Crashes if 'range' is
7646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // 0 or greater than kMaxRange.
7647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UInt32 Generate(UInt32 range);
7648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UInt32 state_;
7651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
7652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
7655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compiler error iff T1 and T2 are different types.
7656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
7657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct CompileAssertTypesEqual;
7658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct CompileAssertTypesEqual<T, T> {
7661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Removes the reference from a type if it is a reference type,
7664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// otherwise leaves it unchanged.  This is the same as
7665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tr1::remove_reference, which is not widely available yet.
7666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct RemoveReference { typedef T type; };  // NOLINT
7668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct RemoveReference<T&> { typedef T type; };  // NOLINT
7670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A handy wrapper around RemoveReference that works when the argument
7672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// T depends on template parameters.
7673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_REMOVE_REFERENCE_(T) \
7674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ::testing::internal::RemoveReference<T>::type
7675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Removes const from a type if it is a const type, otherwise leaves
7677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it unchanged.  This is the same as tr1::remove_const, which is not
7678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// widely available yet.
7679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct RemoveConst { typedef T type; };  // NOLINT
7681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct RemoveConst<const T> { typedef T type; };  // NOLINT
7683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
7685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// definition to fail to remove the const in 'const int[3]' and 'const
7686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// char[3][4]'.  The following specialization works around the bug.
7687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, size_t N>
7688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct RemoveConst<const T[N]> {
7689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename RemoveConst<T>::type type[N];
7690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if defined(_MSC_VER) && _MSC_VER < 1400
7693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is the only specialization that allows VC++ 7.1 to remove const in
7694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
7695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and thus needs to be conditionally compiled.
7696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, size_t N>
7697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct RemoveConst<T[N]> {
7698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename RemoveConst<T>::type type[N];
7699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
7701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A handy wrapper around RemoveConst that works when the argument
7703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// T depends on template parameters.
7704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_REMOVE_CONST_(T) \
7705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ::testing::internal::RemoveConst<T>::type
7706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Turns const U&, U&, const U, and U all into U.
7708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
7709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
7710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Adds reference to a type if it is not a reference type,
7712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// otherwise leaves it unchanged.  This is the same as
7713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tr1::add_reference, which is not widely available yet.
7714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct AddReference { typedef T& type; };  // NOLINT
7716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct AddReference<T&> { typedef T& type; };  // NOLINT
7718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A handy wrapper around AddReference that works when the argument T
7720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// depends on template parameters.
7721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ADD_REFERENCE_(T) \
7722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ::testing::internal::AddReference<T>::type
7723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Adds a reference to const on top of T as necessary.  For example,
7725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it transforms
7726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   char         ==> const char&
7728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   const char   ==> const char&
7729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   char&        ==> const char&
7730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   const char&  ==> const char&
7731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The argument T must depend on some template parameters.
7733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_REFERENCE_TO_CONST_(T) \
7734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
7735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ImplicitlyConvertible<From, To>::value is a compile-time bool
7737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// constant that's true iff type From can be implicitly converted to
7738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type To.
7739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename From, typename To>
7740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ImplicitlyConvertible {
7741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We need the following helper functions only for their types.
7743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // They have no implementations.
7744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // MakeFrom() is an expression whose type is From.  We cannot simply
7746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // use From(), as the type From may not have a public default
7747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // constructor.
7748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static From MakeFrom();
7749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // These two functions are overloaded.  Given an expression
7751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Helper(x), the compiler will pick the first version if x can be
7752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // implicitly converted to type To; otherwise it will pick the
7753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // second version.
7754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
7755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The first version returns a value of size 1, and the second
7756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // version returns a value of size 2.  Therefore, by checking the
7757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // size of Helper(x), which can be done at compile time, we can tell
7758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // which version of Helper() is used, and hence whether x can be
7759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // implicitly converted to type To.
7760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static char Helper(To);
7761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static char (&Helper(...))[2];  // NOLINT
7762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We have to put the 'public' section after the 'private' section,
7764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // or MSVC refuses to compile the code.
7765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // MSVC warns about implicitly converting from double to int for
7767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // possible loss of data, so we need to temporarily disable the
7768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // warning.
7769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
7770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(push)          // Saves the current warning state.
7771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(disable:4244)  // Temporarily disables warning 4244.
7772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const bool value =
7774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
7775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(pop)           // Restores the warning state.
7776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#elif defined(__BORLANDC__)
7777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // C++Builder cannot use member overload resolution during template
7778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // instantiation.  The simplest workaround is to use its C++0x type traits
7779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // functions (C++Builder 2009 and above only).
7780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const bool value = __is_convertible(From, To);
7781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
7782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const bool value =
7783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
7784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // _MSV_VER
7785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename From, typename To>
7787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst bool ImplicitlyConvertible<From, To>::value;
7788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IsAProtocolMessage<T>::value is a compile-time bool constant that's
7790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// true iff T is type ProtocolMessage, proto2::Message, or a subclass
7791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of those.
7792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
7793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct IsAProtocolMessage
7794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public bool_constant<
7795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
7796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
7797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When the compiler sees expression IsContainerTest<C>(0), if C is an
7800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// STL-style container class, the first overload of IsContainerTest
7801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will be viable (since both C::iterator* and C::const_iterator* are
7802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// valid types and NULL can be implicitly converted to them).  It will
7803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// be picked over the second overload as 'int' is a perfect match for
7804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the type of argument 0.  If C::iterator or C::const_iterator is not
7805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a valid type, the first overload is not viable, and the second
7806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// overload will be picked.  Therefore, we can determine whether C is
7807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a container class by checking the type of IsContainerTest<C>(0).
7808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The value of the expression is insignificant.
7809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note that we look for both C::iterator and C::const_iterator.  The
7811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// reason is that C++ injects the name of a class as a member of the
7812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class itself (e.g. you can refer to class iterator as either
7813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 'iterator' or 'iterator::iterator').  If we look for C::iterator
7814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// only, for example, we would mistakenly think that a class named
7815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// iterator is an STL container.
7816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
7817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Also note that the simpler approach of overloading
7818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IsContainerTest(typename C::const_iterator*) and
7819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
7820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef int IsContainer;
7821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class C>
7822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterIsContainer IsContainerTest(int /* dummy */,
7823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            typename C::iterator* /* it */ = NULL,
7824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            typename C::const_iterator* /* const_it */ = NULL) {
7825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return 0;
7826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef char IsNotContainer;
7829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class C>
7830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterIsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
7831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EnableIf<condition>::type is void when 'Cond' is true, and
7833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// undefined when 'Cond' is false.  To use SFINAE to make a function
7834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// overload only apply when a particular expression is true, add
7835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "typename EnableIf<expression>::type* = 0" as the last parameter.
7836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<bool> struct EnableIf;
7837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<> struct EnableIf<true> { typedef void type; };  // NOLINT
7838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Utilities for native arrays.
7840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ArrayEq() compares two k-dimensional native arrays using the
7842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// elements' operator==, where k can be any integer >= 0.  When k is
7843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 0, ArrayEq() degenerates into comparing a single pair of values.
7844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U>
7846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool ArrayEq(const T* lhs, size_t size, const U* rhs);
7847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This generic version is used when k is 0.
7849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U>
7850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
7851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This overload is used when k >= 1.
7853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U, size_t N>
7854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
7855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ArrayEq(lhs, N, rhs);
7856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This helper reduces code bloat.  If we instead put its logic inside
7859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the previous ArrayEq() function, arrays with different sizes would
7860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// lead to different copies of the template code.
7861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U>
7862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool ArrayEq(const T* lhs, size_t size, const U* rhs) {
7863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  for (size_t i = 0; i != size; i++) {
7864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (!internal::ArrayEq(lhs[i], rhs[i]))
7865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return false;
7866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return true;
7868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Finds the first element in the iterator range [begin, end) that
7871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// equals elem.  Element may be a native array type itself.
7872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Iter, typename Element>
7873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
7874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  for (Iter it = begin; it != end; ++it) {
7875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (internal::ArrayEq(*it, elem))
7876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return it;
7877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return end;
7879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CopyArray() copies a k-dimensional native array using the elements'
7882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operator=, where k can be any integer >= 0.  When k is 0,
7883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CopyArray() degenerates into copying a single value.
7884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U>
7886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid CopyArray(const T* from, size_t size, U* to);
7887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This generic version is used when k is 0.
7889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U>
7890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void CopyArray(const T& from, U* to) { *to = from; }
7891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This overload is used when k >= 1.
7893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U, size_t N>
7894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void CopyArray(const T(&from)[N], U(*to)[N]) {
7895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::CopyArray(from, N, *to);
7896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This helper reduces code bloat.  If we instead put its logic inside
7899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the previous CopyArray() function, arrays with different sizes
7900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// would lead to different copies of the template code.
7901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename U>
7902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid CopyArray(const T* from, size_t size, U* to) {
7903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  for (size_t i = 0; i != size; i++) {
7904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::CopyArray(from[i], to + i);
7905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
7907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The relation between an NativeArray object (see below) and the
7909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// native array it represents.
7910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterenum RelationToSource {
7911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  kReference,  // The NativeArray references the native array.
7912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  kCopy        // The NativeArray makes a copy of the native array and
7913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter               // owns the copy.
7914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Adapts a native array to a read-only STL-style container.  Instead
7917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of the complete STL container concept, this adaptor only implements
7918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// members useful for Google Mock's container matchers.  New members
7919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// should be added as needed.  To simplify the implementation, we only
7920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// support Element being a raw type (i.e. having no top-level const or
7921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// reference modifier).  It's the client's responsibility to satisfy
7922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this requirement.  Element can be an array type itself (hence
7923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// multi-dimensional arrays are supported).
7924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Element>
7925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass NativeArray {
7926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
7927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // STL-style container typedefs.
7928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Element value_type;
7929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef Element* iterator;
7930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef const Element* const_iterator;
7931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructs from a native array.
7933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  NativeArray(const Element* array, size_t count, RelationToSource relation) {
7934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Init(array, count, relation);
7935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Copy constructor.
7938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  NativeArray(const NativeArray& rhs) {
7939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
7940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~NativeArray() {
7943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Ensures that the user doesn't instantiate NativeArray with a
7944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // const or reference type.
7945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    static_cast<void>(StaticAssertTypeEqHelper<Element,
7946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
7947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (relation_to_source_ == kCopy)
7948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      delete[] array_;
7949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // STL-style container methods.
7952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  size_t size() const { return size_; }
7953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const_iterator begin() const { return array_; }
7954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const_iterator end() const { return array_ + size_; }
7955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator==(const NativeArray& rhs) const {
7956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return size() == rhs.size() &&
7957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ArrayEq(begin(), size(), rhs.begin());
7958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
7961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Initializes this object; makes a copy of the input array if
7962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // 'relation' is kCopy.
7963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Init(const Element* array, size_t a_size, RelationToSource relation) {
7964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (relation == kReference) {
7965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      array_ = array;
7966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
7967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Element* const copy = new Element[a_size];
7968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      CopyArray(array, a_size, copy);
7969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      array_ = copy;
7970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
7971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    size_ = a_size;
7972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    relation_to_source_ = relation;
7973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
7974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Element* array_;
7976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  size_t size_;
7977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  RelationToSource relation_to_source_;
7978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_ASSIGN_(NativeArray);
7980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
7981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
7983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
7984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
7986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::testing::internal::AssertHelper(result_type, file, line, message) \
7987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    = ::testing::Message()
7988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_MESSAGE_(message, result_type) \
7990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
7991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FATAL_FAILURE_(message) \
7993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
7994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_NONFATAL_FAILURE_(message) \
7996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
7997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
7998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_SUCCESS_(message) \
7999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
8000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Suppresses MSVC warnings 4072 (unreachable code) for the code following
8002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement if it returns or throws (or doesn't return or throw in some
8003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// situations).
8004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
8005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::AlwaysTrue()) { statement; }
8006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
8008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
8010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool gtest_caught_expected = false; \
8011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    try { \
8012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    catch (expected_exception const&) { \
8015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      gtest_caught_expected = true; \
8016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    catch (...) { \
8018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      gtest_msg.value = \
8019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          "Expected: " #statement " throws an exception of type " \
8020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          #expected_exception ".\n  Actual: it throws a different type."; \
8021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
8022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (!gtest_caught_expected) { \
8024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      gtest_msg.value = \
8025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          "Expected: " #statement " throws an exception of type " \
8026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          #expected_exception ".\n  Actual: it throws nothing."; \
8027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
8028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else \
8030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
8031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fail(gtest_msg.value)
8032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_NO_THROW_(statement, fail) \
8034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::AlwaysTrue()) { \
8036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    try { \
8037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    catch (...) { \
8040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
8041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else \
8043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
8044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fail("Expected: " #statement " doesn't throw an exception.\n" \
8045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           "  Actual: it throws.")
8046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_ANY_THROW_(statement, fail) \
8048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::AlwaysTrue()) { \
8050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool gtest_caught_any = false; \
8051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    try { \
8052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    catch (...) { \
8055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      gtest_caught_any = true; \
8056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (!gtest_caught_any) { \
8058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
8059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else \
8061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
8062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fail("Expected: " #statement " throws an exception.\n" \
8063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           "  Actual: it doesn't.")
8064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
8067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// either a boolean expression or an AssertionResult. text is a textual
8068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// represenation of expression as it was passed into the EXPECT_TRUE.
8069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
8070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (const ::testing::AssertionResult gtest_ar_ = \
8072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::AssertionResult(expression)) \
8073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ; \
8074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  else \
8075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    fail(::testing::internal::GetBoolAssertionFailureMessage(\
8076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        gtest_ar_, text, #actual, #expected).c_str())
8077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
8079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::AlwaysTrue()) { \
8081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
8082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
8084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
8085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else \
8087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
8088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fail("Expected: " #statement " doesn't generate new fatal " \
8089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           "failures in the current thread.\n" \
8090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           "  Actual: it does.")
8091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Expands to the name of the class that implements the given test.
8093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
8094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  test_case_name##_##test_name##_Test
8095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper macro for defining tests.
8097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
8098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
8099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:\
8100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
8101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:\
8102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void TestBody();\
8103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
8104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
8105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
8106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};\
8107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter\
8108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
8109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::test_info_ =\
8110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::internal::MakeAndRegisterTestInfo(\
8111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        #test_case_name, #test_name, NULL, NULL, \
8112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        (parent_id), \
8113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        parent_class::SetUpTestCase, \
8114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        parent_class::TearDownTestCase, \
8115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new ::testing::internal::TestFactoryImpl<\
8116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
8117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
8118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
8120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
8121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
8122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
8124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
8125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
8126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
8128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
8129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
8130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
8131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
8132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
8133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
8134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
8135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
8136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
8150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test)
8152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file defines the public API for death tests.  It is
8154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #included by gtest.h so a user doesn't need to include this
8155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// directly.
8156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
8158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
8159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc.
8161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
8162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
8164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
8165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
8166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
8168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
8169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
8170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
8171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
8172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
8173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
8174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
8175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
8176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
8190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The Google C++ Testing Framework (Google Test)
8192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header file defines internal utilities needed for implementing
8194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// death tests.  They are subject to change without notice.
8195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
8197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
8198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdio.h>
8201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
8203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
8204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(internal_run_death_test);
8206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Names of the flags (needed for parsing Google Test flags).
8208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kDeathTestStyleFlag[] = "death_test_style";
8209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kDeathTestUseFork[] = "death_test_use_fork";
8210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kInternalRunDeathTestFlag[] = "internal_run_death_test";
8211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST
8213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DeathTest is a class that hides much of the complexity of the
8215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
8216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns a concrete class that depends on the prevailing death test
8217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// style, as defined by the --gtest_death_test_style and/or
8218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// --gtest_internal_run_death_test flags.
8219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In describing the results of death tests, these terms are used with
8221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the corresponding definitions:
8222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// exit status:  The integer exit information in the format specified
8224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//               by wait(2)
8225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// exit code:    The integer code passed to exit(3), _exit(2), or
8226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//               returned from main()
8227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ DeathTest {
8228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
8229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Create returns false if there was an error determining the
8230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // appropriate action to take for the current death test; for example,
8231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // if the gtest_death_test_style flag is set to an invalid value.
8232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The LastMessage method will return a more detailed message in that
8233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
8234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // argument is set.  If the death test should be skipped, the pointer
8235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // is set to NULL; otherwise, it is set to the address of a new concrete
8236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // DeathTest object that controls the execution of the current test.
8237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool Create(const char* statement, const RE* regex,
8238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                     const char* file, int line, DeathTest** test);
8239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  DeathTest();
8240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~DeathTest() { }
8241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A helper class that aborts a death test when it's deleted.
8243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class ReturnSentinel {
8244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
8245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
8246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
8247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
8248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    DeathTest* const test_;
8249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
8250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } GTEST_ATTRIBUTE_UNUSED_;
8251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // An enumeration of possible roles that may be taken when a death
8253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test is encountered.  EXECUTE means that the death test logic should
8254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // be executed immediately.  OVERSEE means that the program should prepare
8255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the appropriate environment for a child process to execute the death
8256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test, then wait for it to complete.
8257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
8258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // An enumeration of the three reasons that a test might be aborted.
8260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  enum AbortReason {
8261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TEST_ENCOUNTERED_RETURN_STATEMENT,
8262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TEST_THREW_EXCEPTION,
8263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TEST_DID_NOT_DIE
8264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
8265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Assumes one of the above roles.
8267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual TestRole AssumeRole() = 0;
8268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Waits for the death test to finish and returns its status.
8270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual int Wait() = 0;
8271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if the death test passed; that is, the test process
8273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // exited during the test, its exit status matches a user-supplied
8274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // predicate, and its stderr output matches a user-supplied regular
8275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // expression.
8276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The user-supplied predicate may be a macro expression rather
8277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // than a function pointer or functor, or else Wait and Passed could
8278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // be combined.
8279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual bool Passed(bool exit_status_ok) = 0;
8280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Signals that the death test did not die as expected.
8282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void Abort(AbortReason reason) = 0;
8283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns a human-readable outcome message regarding the outcome of
8285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the last death test.
8286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const char* LastMessage();
8287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void set_last_death_test_message(const std::string& message);
8289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
8291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A string containing a description of the outcome of the last death test.
8292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static std::string last_death_test_message_;
8293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
8295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Factory interface for death tests.  May be mocked out for testing.
8298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DeathTestFactory {
8299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
8300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~DeathTestFactory() { }
8301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual bool Create(const char* statement, const RE* regex,
8302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      const char* file, int line, DeathTest** test) = 0;
8303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A concrete DeathTestFactory implementation for normal use.
8306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DefaultDeathTestFactory : public DeathTestFactory {
8307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
8308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual bool Create(const char* statement, const RE* regex,
8309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      const char* file, int line, DeathTest** test);
8310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns true if exit_status describes a process that was terminated
8313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by a signal, or exited normally with a nonzero exit code.
8314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ExitedUnsuccessfully(int exit_status);
8315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Traps C++ exceptions escaping statement and reports them as test
8317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// failures. Note that trapping SEH exceptions is not implemented here.
8318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_HAS_EXCEPTIONS
8319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
8320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  try { \
8321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } catch (const ::std::exception& gtest_exception) { \
8323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    fprintf(\
8324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        stderr, \
8325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        "\n%s: Caught std::exception-derived exception escaping the " \
8326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        "death test statement. Exception message: %s\n", \
8327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
8328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        gtest_exception.what()); \
8329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    fflush(stderr); \
8330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
8331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } catch (...) { \
8332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
8333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
8334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
8336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
8337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
8338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif
8340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
8342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ASSERT_EXIT*, and EXPECT_EXIT*.
8343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
8344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::AlwaysTrue()) { \
8346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::testing::internal::RE& gtest_regex = (regex); \
8347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::internal::DeathTest* gtest_dt; \
8348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
8349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        __FILE__, __LINE__, &gtest_dt)) { \
8350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
8351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (gtest_dt != NULL) { \
8353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
8354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          gtest_dt_ptr(gtest_dt); \
8355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      switch (gtest_dt->AssumeRole()) { \
8356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        case ::testing::internal::DeathTest::OVERSEE_TEST: \
8357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
8358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
8359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          } \
8360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          break; \
8361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
8362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          ::testing::internal::DeathTest::ReturnSentinel \
8363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              gtest_sentinel(gtest_dt); \
8364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
8365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
8366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          break; \
8367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        } \
8368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        default: \
8369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          break; \
8370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      } \
8371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
8372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else \
8373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
8374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      fail(::testing::internal::DeathTest::LastMessage())
8375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The symbol "fail" here expands to something into which a message
8376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can be streamed.
8377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
8379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// NDEBUG mode. In this case we need the statements to be executed, the regex is
8380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ignored, and the macro must accept a streamed message even though the message
8381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is never printed.
8382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
8383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (::testing::internal::AlwaysTrue()) { \
8385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else \
8387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::testing::Message()
8388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A class representing the parsed contents of the
8390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// --gtest_internal_run_death_test flag, as it existed when
8391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// RUN_ALL_TESTS was called.
8392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass InternalRunDeathTestFlag {
8393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
8394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  InternalRunDeathTestFlag(const std::string& a_file,
8395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           int a_line,
8396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           int an_index,
8397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           int a_write_fd)
8398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : file_(a_file), line_(a_line), index_(an_index),
8399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        write_fd_(a_write_fd) {}
8400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~InternalRunDeathTestFlag() {
8402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (write_fd_ >= 0)
8403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      posix::Close(write_fd_);
8404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
8405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::string& file() const { return file_; }
8407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int line() const { return line_; }
8408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int index() const { return index_; }
8409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int write_fd() const { return write_fd_; }
8410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
8412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string file_;
8413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int line_;
8414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int index_;
8415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int write_fd_;
8416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
8418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns a newly created InternalRunDeathTestFlag object with fields
8421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// initialized from the GTEST_FLAG(internal_run_death_test) flag if
8422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the flag is specified; otherwise returns NULL.
8423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
8424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else  // GTEST_HAS_DEATH_TEST
8426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This macro is used for implementing macros such as
8428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
8429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// death tests are not supported. Those macros must compile on such systems
8430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
8431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// systems that support death tests. This allows one to write such a macro
8432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// on a system that does not support death tests and be sure that it will
8433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compile on a death-test supporting system.
8434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parameters:
8436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   statement -  A statement that a macro such as EXPECT_DEATH would test
8437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                for program termination. This macro has to make sure this
8438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                statement is compiled but not executed, to ensure that
8439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
8440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                parameter iff EXPECT_DEATH compiles with it.
8441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
8442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                the output of statement.  This parameter has to be
8443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                compiled but not evaluated by this macro, to ensure that
8444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                this macro only accepts expressions that a macro such as
8445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                EXPECT_DEATH would accept.
8446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
8447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
8448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
8449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                compile inside functions where ASSERT_DEATH doesn't
8450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                compile.
8451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  The branch that has an always false condition is used to ensure that
8453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  statement and regex are compiled (and thus syntactically correct) but
8454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  never executed. The unreachable code macro protects the terminator
8455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  statement from generating an 'unreachable code' warning in case
8456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  statement unconditionally returns or throws. The Message constructor at
8457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  the end allows the syntax of streaming additional messages into the
8458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
8459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
8460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (::testing::internal::AlwaysTrue()) { \
8462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOG_(WARNING) \
8463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "Death tests are not supported on this platform.\n" \
8464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "Statement '" #statement "' cannot be verified."; \
8465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else if (::testing::internal::AlwaysFalse()) { \
8466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::internal::RE::PartialMatch(".*", (regex)); \
8467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      terminator; \
8469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else \
8470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::Message()
8471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_DEATH_TEST
8473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
8475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
8476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
8478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
8480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag controls the style of death tests.  Valid values are "threadsafe",
8482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// meaning that the death test child process will re-execute the test binary
8483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// from the start, running only a single death test, or "fast",
8484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// meaning that the child process will execute the test logic immediately
8485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// after forking.
8486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(death_test_style);
8487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST
8489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
8491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns a Boolean value indicating whether the caller is currently
8493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// executing in the context of the death test child process.  Tools such as
8494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Valgrind heap checkers may need this to modify their behavior in death
8495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tests.  IMPORTANT: This is an internal utility.  Using it may break the
8496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation of death tests.  User code MUST NOT use it.
8497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool InDeathTestChild();
8498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
8500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The following macros are useful for writing death tests.
8502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
8504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// executed:
8505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   1. It generates a warning if there is more than one active
8507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   thread.  This is because it's safe to fork() or clone() only
8508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   when there is a single thread.
8509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   2. The parent process clone()s a sub-process and runs the death
8511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   test in it; the sub-process exits with code 0 at the end of the
8512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   death test, if it hasn't exited already.
8513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   3. The parent process waits for the sub-process to terminate.
8515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   4. The parent process checks the exit code and error message of
8517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   the sub-process.
8518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Examples:
8520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
8522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   for (int i = 0; i < 5; i++) {
8523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     EXPECT_DEATH(server.ProcessRequest(i),
8524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                  "Invalid request .* in ProcessRequest()")
8525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                  << "Failed to die on request " << i;
8526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
8527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
8529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   bool KilledBySIGHUP(int exit_code) {
8531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
8532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
8533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
8535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On the regular expressions used in death tests:
8537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
8539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   which uses the POSIX extended regex syntax.
8540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   On other platforms (e.g. Windows), we only support a simple regex
8542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   syntax implemented as part of Google Test.  This limited
8543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   implementation should be enough most of the time when writing
8544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   death tests; though it lacks many features you can find in PCRE
8545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   or POSIX extended regex syntax.  For example, we don't support
8546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
8547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   repetition count ("x{5,7}"), among others.
8548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Below is the syntax that we do support.  We chose it to be a
8550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   subset of both PCRE and POSIX extended regex, so it's easy to
8551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   learn wherever you come from.  In the following: 'A' denotes a
8552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   literal character, period (.), or a single \\ escape sequence;
8553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
8554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   natural numbers.
8555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     c     matches any literal character c
8557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\d   matches any decimal digit
8558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\D   matches any character that's not a decimal digit
8559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\f   matches \f
8560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\n   matches \n
8561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\r   matches \r
8562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\s   matches any ASCII whitespace, including \n
8563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\S   matches any character that's not a whitespace
8564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\t   matches \t
8565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\v   matches \v
8566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\w   matches any letter, _, or decimal digit
8567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\W   matches any character that \\w doesn't match
8568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     \\c   matches any literal character c, which must be a punctuation
8569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     .     matches any single character except \n
8570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     A?    matches 0 or 1 occurrences of A
8571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     A*    matches 0 or many occurrences of A
8572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     A+    matches 1 or many occurrences of A
8573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     ^     matches the beginning of a string (not that of each line)
8574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     $     matches the end of a string (not that of each line)
8575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     xy    matches x followed by y
8576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   If you accidentally use PCRE or POSIX extended regex features
8578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   not implemented by us, you will get a run-time failure.  In that
8579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   case, please try to rewrite your regular expression within the
8580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   above syntax.
8581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   This implementation is *not* meant to be as highly tuned or robust
8583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   as a compiled regex library, but should perform well enough for a
8584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   death test, which already incurs significant overhead by launching
8585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   a child process.
8586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Known caveats:
8588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   A "threadsafe" style death test obtains the path to the test
8590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   program from argv[0] and re-executes it in the sub-process.  For
8591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   simplicity, the current implementation doesn't search the PATH
8592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   when launching the sub-process.  This means that the user must
8593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   invoke the test program via a path that contains at least one
8594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   path separator (e.g. path/to/foo_test and
8595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
8596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   is rarely a problem as people usually don't put the test binary
8597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   directory in PATH.
8598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TODO(wan@google.com): make thread-safe death tests search the PATH.
8600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Asserts that a given statement causes the program to exit, with an
8602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// integer exit status that satisfies predicate, and emitting error output
8603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that matches regex.
8604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_EXIT(statement, predicate, regex) \
8605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
8606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Like ASSERT_EXIT, but continues on to successive tests in the
8608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test case, if any:
8609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define EXPECT_EXIT(statement, predicate, regex) \
8610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
8611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Asserts that a given statement causes the program to exit, either by
8613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// explicitly exiting with a nonzero exit code or being killed by a
8614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// signal, and emitting error output that matches regex.
8615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_DEATH(statement, regex) \
8616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
8617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Like ASSERT_DEATH, but continues on to successive tests in the
8619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test case, if any:
8620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define EXPECT_DEATH(statement, regex) \
8621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
8622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
8624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that an exit code describes a normal exit with a given exit code.
8626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ ExitedWithCode {
8627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
8628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ExitedWithCode(int exit_code);
8629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator()(int exit_status) const;
8630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
8631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
8632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ExitedWithCode& other);
8633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const int exit_code_;
8635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if !GTEST_OS_WINDOWS
8638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Tests that an exit code describes an exit due to termination by a
8639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// given signal.
8640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ KilledBySignal {
8641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
8642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit KilledBySignal(int signum);
8643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator()(int exit_status) const;
8644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
8645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const int signum_;
8646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // !GTEST_OS_WINDOWS
8648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
8650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The death testing framework causes this to have interesting semantics,
8651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// since the sideeffects of the call are only visible in opt mode, and not
8652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in debug mode.
8653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In practice, this can be used to test functions that utilize the
8655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LOG(DFATAL) macro using the following style:
8656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// int DieInDebugOr12(int* sideeffect) {
8658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   if (sideeffect) {
8659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     *sideeffect = 12;
8660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
8661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   LOG(DFATAL) << "death";
8662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   return 12;
8663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
8664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
8666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   int sideeffect = 0;
8667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Only asserts in dbg.
8668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
8669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #ifdef NDEBUG
8671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // opt-mode has sideeffect visible.
8672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(12, sideeffect);
8673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #else
8674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // dbg-mode no visible sideeffect.
8675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(0, sideeffect);
8676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #endif
8677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
8678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This will assert that DieInDebugReturn12InOpt() crashes in debug
8680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
8681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// appropriate fallback value (12 in this case) in opt mode. If you
8682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// need to test that a function has appropriate side-effects in opt
8683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// mode, include assertions against the side-effects.  A general
8684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pattern for this is:
8685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEBUG_DEATH({
8687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Side-effects here will have an effect after this statement in
8688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // opt mode, but none in debug mode.
8689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
8690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }, "death");
8691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# ifdef NDEBUG
8693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define EXPECT_DEBUG_DEATH(statement, regex) \
8695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_EXECUTE_STATEMENT_(statement, regex)
8696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define ASSERT_DEBUG_DEATH(statement, regex) \
8698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_EXECUTE_STATEMENT_(statement, regex)
8699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else
8701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define EXPECT_DEBUG_DEATH(statement, regex) \
8703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_DEATH(statement, regex)
8704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#  define ASSERT_DEBUG_DEATH(statement, regex) \
8706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_DEATH(statement, regex)
8707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // NDEBUG for EXPECT_DEBUG_DEATH
8709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_DEATH_TEST
8710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
8712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
8713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// death tests are supported; otherwise they just issue a warning.  This is
8714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// useful when you are combining death test assertions with normal test
8715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// assertions in one test.
8716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST
8717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
8718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    EXPECT_DEATH(statement, regex)
8719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
8720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ASSERT_DEATH(statement, regex)
8721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#else
8722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
8723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
8724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
8725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
8726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
8727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
8729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
8731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file was GENERATED by command:
8732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     pump.py gtest-param-test.h.pump
8733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DO NOT EDIT BY HAND!!!
8734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008, Google Inc.
8736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
8737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
8739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
8740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
8741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
8743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
8744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
8745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
8746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
8747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
8748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
8749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
8750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
8751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: vladl@google.com (Vlad Losev)
8765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros and functions for implementing parameterized tests
8767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in Google C++ Testing Framework (Google Test)
8768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
8770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
8772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
8773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Value-parameterized tests allow you to test your code with different
8776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameters without writing multiple copies of the same test.
8777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Here is how you use value-parameterized tests:
8779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if 0
8781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To write value-parameterized tests, first you should define a fixture
8783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class. It is usually derived from testing::TestWithParam<T> (see below for
8784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// another inheritance scheme that's sometimes useful in more complicated
8785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class hierarchies), where the type of your parameter values.
8786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestWithParam<T> is itself derived from testing::Test. T can be any
8787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyable type. If it's a raw pointer, you are responsible for managing the
8788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// lifespan of the pointed values.
8789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FooTest : public ::testing::TestWithParam<const char*> {
8791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // You can implement all the usual class fixture members here.
8792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Then, use the TEST_P macro to define as many parameterized tests
8795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for this fixture as you want. The _P suffix is for "parameterized"
8796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or "pattern", whichever you prefer to think.
8797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_P(FooTest, DoesBlah) {
8799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Inside a test, access the test parameter with the GetParam() method
8800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // of the TestWithParam<T> class:
8801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_TRUE(foo.Blah(GetParam()));
8802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ...
8803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
8804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_P(FooTest, HasBlahBlah) {
8806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ...
8807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
8808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
8810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// case with any set of parameters you want. Google Test defines a number
8811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of functions for generating test parameters. They return what we call
8812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (surprise!) parameter generators. Here is a  summary of them, which
8813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are all in the testing namespace:
8814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  Range(begin, end [, step]) - Yields values {begin, begin+step,
8817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                               begin+step+step, ...}. The values do not
8818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                               include end. step defaults to 1.
8819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
8820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  ValuesIn(container)        - Yields values from a C-style array, an STL
8821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
8822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  Bool()                     - Yields sequence {false, true}.
8823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
8824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                               for the math savvy) of the values generated
8825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                               by the N generators.
8826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For more details, see comments at the definitions of these functions below
8828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in this file.
8829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The following statement will instantiate tests from the FooTest test case
8831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each with parameter values "meeny", "miny", and "moe".
8832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TEST_CASE_P(InstantiationName,
8834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                        FooTest,
8835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                        Values("meeny", "miny", "moe"));
8836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To distinguish different instances of the pattern, (yes, you
8838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can instantiate it more then once) the first argument to the
8839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
8840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// actual test case name. Remember to pick unique prefixes for different
8841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instantiations. The tests from the instantiation above will have
8842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// these names:
8843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
8845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
8846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
8847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
8848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
8849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
8850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You can use these names in --gtest_filter.
8852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This statement will instantiate all tests from FooTest again, each
8854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with parameter values "cat" and "dog":
8855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char* pets[] = {"cat", "dog"};
8857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
8858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The tests from the instantiation above will have these names:
8860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
8862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
8863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
8864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
8865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
8867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the given test case, whether their definitions come before or
8868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// AFTER the INSTANTIATE_TEST_CASE_P statement.
8869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Please also note that generator expressions (including parameters to the
8871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// generators) are evaluated in InitGoogleTest(), after main() has started.
8872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This allows the user on one hand, to adjust generator parameters in order
8873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to dynamically determine a set of tests to run and on the other hand,
8874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// give the user a chance to inspect the generated tests with Google Test
8875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// reflection API before RUN_ALL_TESTS() is executed.
8876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
8878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for more examples.
8879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In the future, we plan to publish the API for defining new parameter
8881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// generators. But for now this interface remains part of the internal
8882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation and is subject to change.
8883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A parameterized test fixture must be derived from testing::Test and from
8886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// testing::WithParamInterface<T>, where T is the type of the parameter
8887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// values. Inheriting from TestWithParam<T> satisfies that requirement because
8888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestWithParam<T> inherits from both Test and WithParamInterface. In more
8889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// complicated hierarchies, however, it is occasionally useful to inherit
8890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// separately from Test and WithParamInterface. For example:
8891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass BaseTest : public ::testing::Test {
8893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // You can inherit all the usual members for a non-parameterized test
8894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // fixture here.
8895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
8898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The usual test fixture members go here too.
8899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
8900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_F(BaseTest, HasFoo) {
8902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This is an ordinary non-parameterized test.
8903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
8904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTEST_P(DerivedTest, DoesBlah) {
8906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // GetParam works just the same here as if you inherit from TestWithParam.
8907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_TRUE(foo.Blah(GetParam()));
8908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
8909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // 0
8911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_OS_SYMBIAN
8914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <utility>
8915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
8916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// scripts/fuse_gtest.py depends on gtest's own header being #included
8918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// *unconditionally*.  Therefore these #includes cannot be moved
8919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// inside #if GTEST_HAS_PARAM_TEST.
8920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008 Google Inc.
8921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All Rights Reserved.
8922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
8924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
8925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
8926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
8928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
8929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
8930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
8931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
8932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
8933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
8934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
8935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
8936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: vladl@google.com (Vlad Losev)
8950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Type and function utilities for implementing parameterized tests.
8952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
8954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
8955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <iterator>
8957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <utility>
8958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <vector>
8959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
8960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// scripts/fuse_gtest.py depends on gtest's own header being #included
8961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// *unconditionally*.  Therefore these #includes cannot be moved
8962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// inside #if GTEST_HAS_PARAM_TEST.
8963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2003 Google Inc.
8964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
8965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
8967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
8968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
8969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
8971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
8972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
8973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
8974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
8975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
8976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
8977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
8978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
8979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Authors: Dan Egnor (egnor@google.com)
8993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A "smart" pointer type with reference tracking.  Every pointer to a
8995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// particular object is kept on a circular linked list.  When the last pointer
8996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to an object is destroyed or reassigned, the object is deleted.
8997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
8998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used properly, this deletes the object when the last reference goes away.
8999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// There are several caveats:
9000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - Like all reference counting schemes, cycles lead to leaks.
9001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - Each smart pointer is actually two pointers (8 bytes instead of 4).
9002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - Every time a pointer is assigned, the entire list of pointers to that
9003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   object is traversed.  This class is therefore NOT SUITABLE when there
9004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   will often be more than two or three pointers to a particular object.
9005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// - References are only tracked as long as linked_ptr<> objects are copied.
9006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
9007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   will happen (double deletion).
9008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A good use of this class is storing object references in STL containers.
9010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You can safely put linked_ptr<> in a vector<>.
9011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Other uses may not be as good.
9012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note: If you use an incomplete type with linked_ptr<>, the class
9014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// *containing* linked_ptr<> must have a constructor and destructor (even
9015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if they do nothing!).
9016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Bill Gibbons suggested we use something like this.
9018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Thread Safety:
9020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Unlike other linked_ptr implementations, in this implementation
9021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   a linked_ptr object is thread-safe in the sense that:
9022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     - it's safe to copy linked_ptr objects concurrently,
9023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     - it's safe to copy *from* a linked_ptr and read its underlying
9024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       raw pointer (e.g. via get()) concurrently, and
9025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     - it's safe to write to two linked_ptrs that point to the same
9026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       shared object concurrently.
9027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
9028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// confusion with normal linked_ptr.
9029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
9031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
9032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdlib.h>
9034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <assert.h>
9035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
9038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
9039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Protects copying of all linked_ptr objects.
9041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
9042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is used internally by all instances of linked_ptr<>.  It needs to be
9044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a non-template class because different types of linked_ptr<> can refer to
9045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
9046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// So, it needs to be possible for different types of linked_ptr to participate
9047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the same circular linked list, so we need a single class type here.
9048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
9050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass linked_ptr_internal {
9051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Create a new circle that includes only this instance.
9053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void join_new() {
9054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    next_ = this;
9055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Many linked_ptr operations may change p.link_ for some linked_ptr
9058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // variable p in the same circle as this object.  Therefore we need
9059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // to prevent two such operations from occurring concurrently.
9060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Note that different types of linked_ptr objects can coexist in a
9062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
9063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
9064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // protect all linked_ptr objects.  This can create serious
9065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // contention in production code, but is acceptable in a testing
9066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // framework.
9067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Join an existing circle.
9069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void join(linked_ptr_internal const* ptr)
9070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
9071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    MutexLock lock(&g_linked_ptr_mutex);
9072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    linked_ptr_internal const* p = ptr;
9074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    while (p->next_ != ptr) p = p->next_;
9075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    p->next_ = this;
9076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    next_ = ptr;
9077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Leave whatever circle we're part of.  Returns true if we were the
9080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // last member of the circle.  Once this is done, you can join() another.
9081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool depart()
9082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
9083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    MutexLock lock(&g_linked_ptr_mutex);
9084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (next_ == this) return true;
9086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    linked_ptr_internal const* p = next_;
9087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    while (p->next_ != this) p = p->next_;
9088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    p->next_ = next_;
9089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return false;
9090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
9093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  mutable linked_ptr_internal const* next_;
9094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass linked_ptr {
9098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T element_type;
9100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Take over ownership of a raw pointer.  This should happen as soon as
9102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // possible after the object is created.
9103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
9104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~linked_ptr() { depart(); }
9105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
9107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
9108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  linked_ptr(linked_ptr const& ptr) {  // NOLINT
9109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    assert(&ptr != this);
9110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    copy(&ptr);
9111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Assignment releases the old value and acquires the new.
9114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
9115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    depart();
9116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    copy(&ptr);
9117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
9118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  linked_ptr& operator=(linked_ptr const& ptr) {
9121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (&ptr != this) {
9122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      depart();
9123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      copy(&ptr);
9124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
9125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
9126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Smart pointer members.
9129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void reset(T* ptr = NULL) {
9130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    depart();
9131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    capture(ptr);
9132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* get() const { return value_; }
9134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* operator->() const { return value_; }
9135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T& operator*() const { return *value_; }
9136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator==(T* p) const { return value_ == p; }
9138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator!=(T* p) const { return value_ != p; }
9139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U>
9140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator==(linked_ptr<U> const& ptr) const {
9141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return value_ == ptr.get();
9142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U>
9144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator!=(linked_ptr<U> const& ptr) const {
9145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return value_ != ptr.get();
9146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
9149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U>
9150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class linked_ptr;
9151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T* value_;
9153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  linked_ptr_internal link_;
9154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void depart() {
9156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (link_.depart()) delete value_;
9157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void capture(T* ptr) {
9160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    value_ = ptr;
9161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    link_.join_new();
9162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename U> void copy(linked_ptr<U> const* ptr) {
9165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    value_ = ptr->get();
9166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (value_)
9167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      link_.join(&ptr->link_);
9168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    else
9169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      link_.join_new();
9170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename T> inline
9174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool operator==(T* ptr, const linked_ptr<T>& x) {
9175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ptr == x.get();
9176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename T> inline
9179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool operator!=(T* ptr, const linked_ptr<T>& x) {
9180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ptr != x.get();
9181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A function to convert T* into linked_ptr<T>
9184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
9185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
9186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterlinked_ptr<T> make_linked_ptr(T* ptr) {
9188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return linked_ptr<T>(ptr);
9189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
9192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
9193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
9195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2007, Google Inc.
9196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
9197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
9199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
9200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
9201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
9203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
9204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
9205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
9206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
9207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
9208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
9209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
9210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
9211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
9215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
9219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
9220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
9221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
9222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
9225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test - The Google C++ Testing Framework
9227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file implements a universal value printer that can print a
9229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value of any type T:
9230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
9232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A user can teach this function how to print a class type T by
9234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defining either operator<<() or PrintTo() in the namespace that
9235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defines T.  More specifically, the FIRST defined function in the
9236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// following list will be used (assuming T is defined in namespace
9237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// foo):
9238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   1. foo::PrintTo(const T&, ostream*)
9240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   2. operator<<(ostream&, const T&) defined in either foo or the
9241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      global namespace.
9242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If none of the above is defined, it will print the debug string of
9244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the value if it is a protocol buffer, or print the raw bytes in the
9245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value otherwise.
9246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To aid debugging: when T is a reference type, the address of the
9248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value is also printed; when T is a (const) char pointer, both the
9249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pointer value and the NUL-terminated string it points to are
9250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// printed.
9251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We also provide some convenient wrappers:
9253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Prints a value to a string.  For a (const or not) char
9255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // pointer, the NUL-terminated string (but not the pointer) is
9256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // printed.
9257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   std::string ::testing::PrintToString(const T& value);
9258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Prints a value tersely: for a reference type, the referenced
9260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // value (but not the address) is printed; for a (const or not) char
9261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // pointer, the NUL-terminated string (but not the pointer) is
9262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // printed.
9263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
9264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Prints value using the type inferred by the compiler.  The difference
9266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // from UniversalTersePrint() is that this function prints both the
9267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // pointer and the NUL-terminated string for a (const or not) char pointer.
9268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
9269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Prints the fields of a tuple tersely to a string vector, one
9271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // element for each field. Tuple support must be enabled in
9272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // gtest-port.h.
9273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
9274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       const Tuple& value);
9275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Known limitation:
9277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The print primitives print the elements of an STL-style container
9279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// using the compiler-inferred type of *iter where iter is a
9280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const_iterator of the container.  When const_iterator is an input
9281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// iterator but not a forward iterator, this inferred type may not
9282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// match value_type, and the print output may be incorrect.  In
9283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// practice, this is rarely a problem as for most containers
9284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const_iterator is a forward iterator.  We'll fix this if there's an
9285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// actual need for it.  Note that this fix cannot rely on value_type
9286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// being defined as many user-defined container types don't have
9287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value_type.
9288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
9290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
9291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <ostream>  // NOLINT
9293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <sstream>
9294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string>
9295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <utility>
9296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <vector>
9297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
9299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Definitions in the 'internal' and 'internal2' name spaces are
9301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// subject to change without notice.  DO NOT USE THEM IN USER CODE!
9302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal2 {
9303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints the given number of bytes in the given object to the given
9305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ostream.
9306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
9307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                     size_t count,
9308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                     ::std::ostream* os);
9309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For selecting which printer to use when a given type has neither <<
9311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// nor PrintTo().
9312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterenum TypeKind {
9313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  kProtobuf,              // a protobuf type
9314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
9315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                          // (e.g. a named or unnamed enum type)
9316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  kOtherType              // anything else
9317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
9320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by the universal printer to print a value of type T when neither
9321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operator<< nor PrintTo() is defined for T, where kTypeKind is the
9322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "kind" of T as defined by enum TypeKind.
9323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, TypeKind kTypeKind>
9324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithoutFormatter {
9325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This default version is called when kTypeKind is kOtherType.
9327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void PrintValue(const T& value, ::std::ostream* os) {
9328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
9329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                         sizeof(value), os);
9330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We print a protobuf using its ShortDebugString() when the string
9334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// doesn't exceed this many characters; otherwise we print it using
9335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DebugString() for better readability.
9336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst size_t kProtobufOneLinerMaxLength = 50;
9337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithoutFormatter<T, kProtobuf> {
9340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void PrintValue(const T& value, ::std::ostream* os) {
9342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::testing::internal::string short_str = value.ShortDebugString();
9343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::testing::internal::string pretty_str =
9344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        short_str.length() <= kProtobufOneLinerMaxLength ?
9345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        short_str : ("\n" + value.DebugString());
9346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << ("<" + pretty_str + ">");
9347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TypeWithoutFormatter<T, kConvertibleToInteger> {
9352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Since T has no << operator or PrintTo() but can be implicitly
9354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // converted to BiggestInt, we print it as a BiggestInt.
9355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Most likely T is an enum type (either named or unnamed), in which
9357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // case printing it as an integer is the desired behavior.  In case
9358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // T is not an enum, printing it as an integer is the best we can do
9359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // given that it has no user-defined printer.
9360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void PrintValue(const T& value, ::std::ostream* os) {
9361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const internal::BiggestInt kBigInt = value;
9362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << kBigInt;
9363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints the given value to the given ostream.  If the value is a
9367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// protocol message, its debug string is printed; if it's an enum or
9368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of a type implicitly convertible to BiggestInt, it's printed as an
9369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// integer; otherwise the bytes in the value are printed.  This is
9370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// what UniversalPrinter<T>::Print() does when it knows nothing about
9371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type T and T has neither << operator nor PrintTo().
9372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A user can override this behavior for a class type Foo by defining
9374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a << operator in the namespace where Foo is defined.
9375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We put this operator in namespace 'internal2' instead of 'internal'
9377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to simplify the implementation, as much code in 'internal' needs to
9378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use << in STL, which would conflict with our own << were it defined
9379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in 'internal'.
9380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note that this operator<< takes a generic std::basic_ostream<Char,
9382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CharTraits> type instead of the more restricted std::ostream.  If
9383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// we define it to take an std::ostream instead, we'll get an
9384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "ambiguous overloads" compiler error when trying to print a type
9385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Foo that supports streaming to std::basic_ostream<Char,
9386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CharTraits>, as the compiler cannot tell whether
9387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operator<<(std::ostream&, const T&) or
9388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
9389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// specific.
9390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Char, typename CharTraits, typename T>
9391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter::std::basic_ostream<Char, CharTraits>& operator<<(
9392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
9393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TypeWithoutFormatter<T,
9394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
9395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
9396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
9397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return os;
9398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal2
9401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
9402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
9404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// magic needed for implementing UniversalPrinter won't work.
9405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing_internal {
9406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used to print a value that is not an STL-style container when the
9408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// user doesn't define PrintTo() for it.
9409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
9411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // With the following statement, during unqualified name lookup,
9412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // testing::internal2::operator<< appears as if it was declared in
9413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the nearest enclosing namespace that contains both
9414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ::testing_internal and ::testing::internal2, i.e. the global
9415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // namespace.  For more details, refer to the C++ Standard section
9416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
9417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // testing::internal2::operator<< in case T doesn't come with a <<
9418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // operator.
9419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We cannot write 'using ::testing::internal2::operator<<;', which
9421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // gcc 3.3 fails to compile due to a compiler bug.
9422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  using namespace ::testing::internal2;  // NOLINT
9423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Assuming T is defined in namespace foo, in the next statement,
9425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the compiler will consider all of:
9426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   1. foo::operator<< (thanks to Koenig look-up),
9428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   2. ::operator<< (as the current namespace is enclosed in ::),
9429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   3. testing::internal2::operator<< (thanks to the using statement above).
9430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The operator<< whose type matches T best will be picked.
9432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We deliberately allow #2 to be a candidate, as sometimes it's
9434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // impossible to define #1 (e.g. when foo is ::std, defining
9435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // anything in it is undefined behavior unless you are a compiler
9436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // vendor.).
9437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << value;
9438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing_internal
9441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
9443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
9444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
9446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value to the given ostream.  The caller must ensure that
9447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 'ostream_ptr' is not NULL, or the behavior is undefined.
9448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We define UniversalPrinter as a class template (as opposed to a
9450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function template), as we need to partially specialize it for
9451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// reference types, which cannot be done with function templates.
9452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalPrinter;
9454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid UniversalPrint(const T& value, ::std::ostream* os);
9457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used to print an STL-style container when the user doesn't define
9459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a PrintTo() for it.
9460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename C>
9461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid DefaultPrintTo(IsContainer /* dummy */,
9462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    false_type /* is not a pointer */,
9463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    const C& container, ::std::ostream* os) {
9464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const size_t kMaxCount = 32;  // The maximum number of elements to print.
9465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << '{';
9466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  size_t count = 0;
9467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  for (typename C::const_iterator it = container.begin();
9468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter       it != container.end(); ++it, ++count) {
9469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (count > 0) {
9470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *os << ',';
9471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (count == kMaxCount) {  // Enough has been printed.
9472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        *os << " ...";
9473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        break;
9474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
9475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
9476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << ' ';
9477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
9478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // handle *it being a native array.
9479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    internal::UniversalPrint(*it, os);
9480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (count > 0) {
9483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << ' ';
9484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << '}';
9486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used to print a pointer that is neither a char pointer nor a member
9489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pointer, when the user doesn't define PrintTo() for it.  (A member
9490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// variable pointer or member function pointer doesn't really point to
9491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a location in the address space.  Their representation is
9492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation-defined.  Therefore they will be printed as raw
9493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// bytes.)
9494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid DefaultPrintTo(IsNotContainer /* dummy */,
9496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    true_type /* is a pointer */,
9497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    T* p, ::std::ostream* os) {
9498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (p == NULL) {
9499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << "NULL";
9500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else {
9501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // C++ doesn't allow casting from a function pointer to any object
9502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // pointer.
9503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    //
9504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // IsTrue() silences warnings: "Condition is always true",
9505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // "unreachable code".
9506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
9507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // T is not a function type.  We just call << to print p,
9508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // relying on ADL to pick up user-defined << for their pointer
9509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // types, if any.
9510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *os << p;
9511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
9512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // T is a function type, so '*os << p' doesn't do what we want
9513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // (it just prints p as bool).  We want to print p as a const
9514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // void*.  However, we cannot cast it to const void* directly,
9515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // even using reinterpret_cast, as earlier versions of gcc
9516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // (e.g. 3.4.5) cannot compile the cast when p is a function
9517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // pointer.  Casting to UInt64 first solves the problem.
9518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *os << reinterpret_cast<const void*>(
9519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          reinterpret_cast<internal::UInt64>(p));
9520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
9521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used to print a non-container, non-pointer value when the user
9525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// doesn't define PrintTo() for it.
9526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid DefaultPrintTo(IsNotContainer /* dummy */,
9528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    false_type /* is not a pointer */,
9529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    const T& value, ::std::ostream* os) {
9530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::testing_internal::DefaultPrintNonContainerTo(value, os);
9531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints the given value using the << operator if it has one;
9534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// otherwise prints the bytes in it.  This is what
9535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
9536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or overloaded for type T.
9537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
9538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A user can override this behavior for a class type Foo by defining
9539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// an overload of PrintTo() in the namespace where Foo is defined.  We
9540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// give the user this option as sometimes defining a << operator for
9541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Foo is not desirable (e.g. the coding style may prevent doing it,
9542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or there is already a << operator but it doesn't do what the user
9543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// wants).
9544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const T& value, ::std::ostream* os) {
9546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // DefaultPrintTo() is overloaded.  The type of its first two
9547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // arguments determine which version will be picked.  If T is an
9548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // STL-style container, the version for container will be called; if
9549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // T is a pointer, the pointer version will be called; otherwise the
9550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // generic version will be called.
9551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Note that we check for container types here, prior to we check
9553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // for protocol message types in our operator<<.  The rationale is:
9554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // For protocol messages, we want to give people a chance to
9556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // override Google Mock's format by defining a PrintTo() or
9557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // operator<<.  For STL containers, other formats can be
9558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // incompatible with Google Mock's format for the container
9559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // elements; therefore we check for container types here to ensure
9560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // that our format is used.
9561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The second argument of DefaultPrintTo() is needed to bypass a bug
9563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // in Symbian's C++ compiler that prevents it from picking the right
9564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // overload between:
9565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
9566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   PrintTo(const T& x, ...);
9567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   PrintTo(T* x, ...);
9568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
9569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The following list of PrintTo() overloads tells
9572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UniversalPrinter<T>::Print() how to print standard types (built-in
9573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// types, strings, plain arrays, and pointers).
9574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloads for various char types.
9576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
9577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
9578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(char c, ::std::ostream* os) {
9579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // When printing a plain char, we always treat it as unsigned.  This
9580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // way, the output won't be affected by whether the compiler thinks
9581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // char is signed or not.
9582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(static_cast<unsigned char>(c), os);
9583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloads for other simple built-in types.
9586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(bool x, ::std::ostream* os) {
9587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << (x ? "true" : "false");
9588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overload for wchar_t type.
9591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints a wchar_t as a symbol if it is printable or as its internal
9592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// code otherwise and also as its decimal code (except for L'\0').
9593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The L'\0' char is printed as "L'\\0'". The decimal code is printed
9594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as signed integer when wchar_t is implemented by the compiler
9595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as a signed type and is printed as an unsigned integer when wchar_t
9596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is implemented as an unsigned type.
9597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
9598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloads for C strings.
9600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
9601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(char* s, ::std::ostream* os) {
9602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(ImplicitCast_<const char*>(s), os);
9603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// signed/unsigned char is often used for representing binary data, so
9606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// we print pointers to it as void* to be safe.
9607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const signed char* s, ::std::ostream* os) {
9608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(ImplicitCast_<const void*>(s), os);
9609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(signed char* s, ::std::ostream* os) {
9611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(ImplicitCast_<const void*>(s), os);
9612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const unsigned char* s, ::std::ostream* os) {
9614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(ImplicitCast_<const void*>(s), os);
9615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(unsigned char* s, ::std::ostream* os) {
9617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(ImplicitCast_<const void*>(s), os);
9618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MSVC can be configured to define wchar_t as a typedef of unsigned
9621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
9622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// type.  When wchar_t is a typedef, defining an overload for const
9623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// wchar_t* would cause unsigned short* be printed as a wide string,
9624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// possibly causing invalid memory accesses.
9625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
9626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloads for wide C strings
9627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
9628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(wchar_t* s, ::std::ostream* os) {
9629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
9630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
9632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overload for C arrays.  Multi-dimensional arrays are printed
9634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// properly.
9635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints the given number of elements in an array, without printing
9637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the curly braces.
9638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
9640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UniversalPrint(a[0], os);
9641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  for (size_t i = 1; i != count; i++) {
9642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << ", ";
9643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrint(a[i], os);
9644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloads for ::string and ::std::string.
9648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING
9649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
9650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const ::string& s, ::std::ostream* os) {
9651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintStringTo(s, os);
9652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_STRING
9654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
9656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const ::std::string& s, ::std::ostream* os) {
9657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintStringTo(s, os);
9658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloads for ::wstring and ::std::wstring.
9661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_WSTRING
9662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
9663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const ::wstring& s, ::std::ostream* os) {
9664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintWideStringTo(s, os);
9665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_GLOBAL_WSTRING
9667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STD_WSTRING
9669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
9670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
9671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintWideStringTo(s, os);
9672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_STD_WSTRING
9674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TR1_TUPLE
9676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
9677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// which are packed as tuples.
9678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for printing a tuple.  T must be instantiated with
9680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a tuple type.
9681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTupleTo(const T& t, ::std::ostream* os);
9683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overloaded PrintTo() for tuples of various arities.  We support
9685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tuples of up-to 10 fields.  The following implementation works
9686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// regardless of whether tr1::tuple is implemented using the
9687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// non-standard variadic template feature or not.
9688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
9690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1>
9694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
9695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
9699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
9700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3>
9704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
9705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4>
9709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
9710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
9714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
9715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             ::std::ostream* os) {
9716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T6>
9721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
9722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             ::std::ostream* os) {
9723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T6, typename T7>
9728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
9729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             ::std::ostream* os) {
9730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T6, typename T7, typename T8>
9735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
9736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             ::std::ostream* os) {
9737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T6, typename T7, typename T8, typename T9>
9742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
9743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             ::std::ostream* os) {
9744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T6, typename T7, typename T8, typename T9, typename T10>
9749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(
9750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
9751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::std::ostream* os) {
9752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  PrintTupleTo(t, os);
9753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TR1_TUPLE
9755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Overload for std::pair.
9757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
9758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
9759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << '(';
9760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
9761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // a reference type.  The same for printing value.second.
9762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UniversalPrinter<T1>::Print(value.first, os);
9763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << ", ";
9764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UniversalPrinter<T2>::Print(value.second, os);
9765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << ')';
9766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements printing a non-reference type T by letting the compiler
9769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pick the right overload of PrintTo() for T.
9770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalPrinter {
9772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // MSVC warns about adding const to a function type, so we want to
9774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // disable the warning.
9775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
9776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(push)          // Saves the current warning state.
9777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(disable:4180)  // Temporarily disables warning 4180.
9778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // _MSC_VER
9779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Note: we deliberately don't call this PrintTo(), as that name
9781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // conflicts with ::testing::internal::PrintTo in the body of the
9782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // function.
9783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const T& value, ::std::ostream* os) {
9784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // By default, ::testing::internal::PrintTo() is used for printing
9785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // the value.
9786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    //
9787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Thanks to Koenig look-up, if T is a class and has its own
9788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // PrintTo() function defined in its namespace, that function will
9789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // be visible here.  Since it is more specific than the generic ones
9790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // in ::testing::internal, it will be picked by the compiler in the
9791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // following statement - exactly what we want.
9792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    PrintTo(value, os);
9793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
9796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(pop)           // Restores the warning state.
9797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // _MSC_VER
9798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UniversalPrintArray(begin, len, os) prints an array of 'len'
9801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// elements, starting at address 'begin'.
9802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
9804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (len == 0) {
9805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << "{}";
9806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else {
9807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << "{ ";
9808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const size_t kThreshold = 18;
9809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const size_t kChunkSize = 8;
9810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // If the array has more than kThreshold elements, we'll have to
9811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // omit some details by printing only the first and the last
9812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // kChunkSize elements.
9813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // TODO(wan@google.com): let the user control the threshold using a flag.
9814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (len <= kThreshold) {
9815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      PrintRawArrayTo(begin, len, os);
9816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
9817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      PrintRawArrayTo(begin, kChunkSize, os);
9818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *os << ", ..., ";
9819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
9820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
9821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << " }";
9822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This overload prints a (const) char array compactly.
9825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void UniversalPrintArray(
9826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* begin, size_t len, ::std::ostream* os);
9827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This overload prints a (const) wchar_t array compactly.
9829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void UniversalPrintArray(
9830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const wchar_t* begin, size_t len, ::std::ostream* os);
9831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements printing an array type T[N].
9833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, size_t N>
9834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalPrinter<T[N]> {
9835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Prints the given array, omitting some elements when there are too
9837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // many.
9838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const T (&a)[N], ::std::ostream* os) {
9839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrintArray(a, N, os);
9840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements printing a reference type T&.
9844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalPrinter<T&> {
9846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // MSVC warns about adding const to a function type, so we want to
9848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // disable the warning.
9849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
9850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(push)          // Saves the current warning state.
9851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(disable:4180)  // Temporarily disables warning 4180.
9852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // _MSC_VER
9853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const T& value, ::std::ostream* os) {
9855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Prints the address of the value.  We use reinterpret_cast here
9856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // as static_cast doesn't compile when T is a function type.
9857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
9858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Then prints the value itself.
9860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrint(value, os);
9861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
9864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(pop)           // Restores the warning state.
9865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // _MSC_VER
9866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints a value tersely: for a reference type, the referenced value
9869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (but not the address) is printed; for a (const) char pointer, the
9870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// NUL-terminated string (but not the pointer) is printed.
9871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter {
9874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const T& value, ::std::ostream* os) {
9876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrint(value, os);
9877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter<T&> {
9881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const T& value, ::std::ostream* os) {
9883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrint(value, os);
9884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, size_t N>
9887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter<T[N]> {
9888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const T (&value)[N], ::std::ostream* os) {
9890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrinter<T[N]>::Print(value, os);
9891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
9894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter<const char*> {
9895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const char* str, ::std::ostream* os) {
9897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (str == NULL) {
9898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *os << "NULL";
9899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
9900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      UniversalPrint(string(str), os);
9901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
9902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
9905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter<char*> {
9906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(char* str, ::std::ostream* os) {
9908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalTersePrinter<const char*>::Print(str, os);
9909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STD_WSTRING
9913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
9914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter<const wchar_t*> {
9915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(const wchar_t* str, ::std::ostream* os) {
9917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (str == NULL) {
9918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      *os << "NULL";
9919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } else {
9920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      UniversalPrint(::std::wstring(str), os);
9921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
9922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
9925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
9927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UniversalTersePrinter<wchar_t*> {
9928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
9929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void Print(wchar_t* str, ::std::ostream* os) {
9930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalTersePrinter<const wchar_t*>::Print(str, os);
9931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid UniversalTersePrint(const T& value, ::std::ostream* os) {
9936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UniversalTersePrinter<T>::Print(value, os);
9937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints a value using the type inferred by the compiler.  The
9940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// difference between this and UniversalTersePrint() is that for a
9941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (const) char pointer, this prints both the pointer and the
9942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// NUL-terminated string.
9943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
9944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid UniversalPrint(const T& value, ::std::ostream* os) {
9945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
9946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // UniversalPrinter with T directly.
9947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T T1;
9948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UniversalPrinter<T1>::Print(value, os);
9949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
9950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TR1_TUPLE
9952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef ::std::vector<string> Strings;
9953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This helper template allows PrintTo() for tuples and
9955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UniversalTersePrintTupleFieldsToStrings() to be defined by
9956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// induction on the number of tuple fields.  The idea is that
9957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
9958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// fields in tuple t, and can be defined in terms of
9959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TuplePrefixPrinter<N - 1>.
9960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The inductive case.
9962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <size_t N>
9963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TuplePrefixPrinter {
9964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Prints the first N fields of a tuple.
9965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename Tuple>
9966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
9967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
9968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    *os << ", ";
9969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
9970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ::Print(::std::tr1::get<N - 1>(t), os);
9971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Tersely prints the first N fields of a tuple to a string vector,
9974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // one element for each field.
9975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename Tuple>
9976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
9977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
9978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::std::stringstream ss;
9979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
9980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    strings->push_back(ss.str());
9981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
9982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Base cases.
9985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
9986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TuplePrefixPrinter<0> {
9987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename Tuple>
9988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
9989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
9990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename Tuple>
9991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
9992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
9993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We have to specialize the entire TuplePrefixPrinter<> class
9994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// template here, even though the definition of
9995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TersePrintPrefixToStrings() is the same as the generic version, as
9996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
9997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// support specializing a method template of a class template.
9998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
9999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TuplePrefixPrinter<1> {
10000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename Tuple>
10001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
10002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
10003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        Print(::std::tr1::get<0>(t), os);
10004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename Tuple>
10007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
10008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ::std::stringstream ss;
10009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
10010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    strings->push_back(ss.str());
10011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for printing a tuple.  T must be instantiated with
10015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a tuple type.
10016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
10017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid PrintTupleTo(const T& t, ::std::ostream* os) {
10018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << "(";
10019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
10020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      PrintPrefixTo(t, os);
10021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  *os << ")";
10022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
10023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints the fields of a tuple tersely to a string vector, one
10025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// element for each field.  See the comment before
10026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UniversalTersePrint() for how we define "tersely".
10027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Tuple>
10028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
10029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Strings result;
10030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
10031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      TersePrintPrefixToStrings(value, &result);
10032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return result;
10033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
10034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TR1_TUPLE
10035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
10037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
10039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter::std::string PrintToString(const T& value) {
10040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::std::stringstream ss;
10041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::UniversalTersePrinter<T>::Print(value, &ss);
10042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ss.str();
10043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
10044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
10046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
10048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
10050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
10052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
10053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Outputs a message explaining invalid registration of different
10057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// fixture class for the same test case. This may happen when
10058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_P macro is used to define two tests with the same name
10059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// but in different namespaces.
10060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
10061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* file, int line);
10062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename> class ParamGeneratorInterface;
10064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename> class ParamGenerator;
10065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Interface for iterating over elements provided by an implementation
10067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of ParamGeneratorInterface<T>.
10068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
10069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParamIteratorInterface {
10070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~ParamIteratorInterface() {}
10072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A pointer to the base generator instance.
10073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Used only for the purposes of iterator comparison
10074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // to make sure that two iterators belong to the same generator.
10075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
10076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Advances iterator to point to the next element
10077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // provided by the generator. The caller is responsible
10078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // for not calling Advance() on an iterator equal to
10079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // BaseGenerator()->End().
10080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void Advance() = 0;
10081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Clones the iterator object. Used for implementing copy semantics
10082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // of ParamIterator<T>.
10083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface* Clone() const = 0;
10084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Dereferences the current iterator and provides (read-only) access
10085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // to the pointed value. It is the caller's responsibility not to call
10086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Current() on an iterator equal to BaseGenerator()->End().
10087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Used for implementing ParamGenerator<T>::operator*().
10088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual const T* Current() const = 0;
10089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Determines whether the given iterator and other point to the same
10090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // element in the sequence generated by the generator.
10091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Used for implementing ParamGenerator<T>::operator==().
10092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
10093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Class iterating over elements provided by an implementation of
10096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
10097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and implements the const forward iterator concept.
10098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
10099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParamIterator {
10100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T value_type;
10102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef const T& reference;
10103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ptrdiff_t difference_type;
10104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ParamIterator assumes ownership of the impl_ pointer.
10106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
10107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParamIterator& operator=(const ParamIterator& other) {
10108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (this != &other)
10109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      impl_.reset(other.impl_->Clone());
10110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
10111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T& operator*() const { return *impl_->Current(); }
10114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T* operator->() const { return impl_->Current(); }
10115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Prefix version of operator++.
10116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParamIterator& operator++() {
10117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    impl_->Advance();
10118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
10119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Postfix version of operator++.
10121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParamIterator operator++(int /*unused*/) {
10122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamIteratorInterface<T>* clone = impl_->Clone();
10123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    impl_->Advance();
10124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamIterator(clone);
10125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator==(const ParamIterator& other) const {
10127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
10128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool operator!=(const ParamIterator& other) const {
10130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return !(*this == other);
10131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class ParamGenerator<T>;
10135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
10136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  scoped_ptr<ParamIteratorInterface<T> > impl_;
10137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ParamGeneratorInterface<T> is the binary interface to access generators
10140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defined in other translation units.
10141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
10142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParamGeneratorInterface {
10143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T ParamType;
10145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~ParamGeneratorInterface() {}
10147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Generator interface definition
10149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<T>* Begin() const = 0;
10150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<T>* End() const = 0;
10151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Wraps ParamGeneratorInterface<T> and provides general generator syntax
10154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compatible with the STL Container concept.
10155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class implements copy initialization semantics and the contained
10156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ParamGeneratorInterface<T> instance is shared among all copies
10157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of the original object. This is possible because that instance is immutable.
10158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate<typename T>
10159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParamGenerator {
10160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ParamIterator<T> iterator;
10162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
10164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
10165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParamGenerator& operator=(const ParamGenerator& other) {
10167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    impl_ = other.impl_;
10168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
10169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  iterator begin() const { return iterator(impl_->Begin()); }
10172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  iterator end() const { return iterator(impl_->End()); }
10173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  linked_ptr<const ParamGeneratorInterface<T> > impl_;
10176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates values from a range of two comparable values. Can be used to
10179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// generate sequences of user-defined types that implement operator+() and
10180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operator<().
10181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class is used in the Range() function.
10182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename IncrementT>
10183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass RangeGenerator : public ParamGeneratorInterface<T> {
10184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  RangeGenerator(T begin, T end, IncrementT step)
10186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : begin_(begin), end_(end),
10187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
10188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~RangeGenerator() {}
10189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<T>* Begin() const {
10191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, begin_, 0, step_);
10192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<T>* End() const {
10194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, end_, end_index_, step_);
10195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<T> {
10199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
10200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
10201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             IncrementT step)
10202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base), value_(value), index_(index), step_(step) {}
10203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
10204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
10206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
10207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
10209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      value_ = value_ + step_;
10210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      index_++;
10211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<T>* Clone() const {
10213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
10214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const T* Current() const { return &value_; }
10216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
10217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
10218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
10219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
10220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
10221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
10222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const int other_index =
10223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other)->index_;
10224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return index_ == other_index;
10225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
10228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
10229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : ParamIteratorInterface<T>(),
10230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          base_(other.base_), value_(other.value_), index_(other.index_),
10231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          step_(other.step_) {}
10232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
10234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
10235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<T>* const base_;
10237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T value_;
10238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    int index_;
10239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const IncrementT step_;
10240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class RangeGenerator::Iterator
10241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static int CalculateEndIndex(const T& begin,
10243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               const T& end,
10244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               const IncrementT& step) {
10245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    int end_index = 0;
10246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    for (T i = begin; i < end; i = i + step)
10247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      end_index++;
10248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return end_index;
10249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const RangeGenerator& other);
10253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T begin_;
10255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T end_;
10256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const IncrementT step_;
10257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The index for the end() iterator. All the elements in the generated
10258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // sequence are indexed (0-based) to aid iterator comparison.
10259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const int end_index_;
10260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class RangeGenerator
10261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates values from a pair of STL-style iterators. Used in the
10264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ValuesIn() function. The elements are copied from the source range
10265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// since the source can be located on the stack, and the generator
10266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is likely to persist beyond that stack frame.
10267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
10268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
10269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename ForwardIterator>
10271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
10272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : container_(begin, end) {}
10273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~ValuesInIteratorRangeGenerator() {}
10274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<T>* Begin() const {
10276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, container_.begin());
10277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<T>* End() const {
10279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, container_.end());
10280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename ::std::vector<T> ContainerType;
10284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<T> {
10286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
10287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<T>* base,
10288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             typename ContainerType::const_iterator iterator)
10289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base), iterator_(iterator) {}
10290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
10291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
10293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
10294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
10296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++iterator_;
10297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      value_.reset();
10298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<T>* Clone() const {
10300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
10301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // We need to use cached value referenced by iterator_ because *iterator_
10303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // can return a temporary object (and of type other then T), so just
10304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // having "return &*iterator_;" doesn't work.
10305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // value_ is updated here and not in Advance() because Advance()
10306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // can advance iterator_ beyond the end of the range, and we cannot
10307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // detect that fact. The client code, on the other hand, is
10308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // responsible for not calling Current() on an out-of-range iterator.
10309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const T* Current() const {
10310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (value_.get() == NULL)
10311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        value_.reset(new T(*iterator_));
10312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return value_.get();
10313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
10315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
10316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
10317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
10318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
10319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
10320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return iterator_ ==
10321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
10322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
10325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
10326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // The explicit constructor call suppresses a false warning
10327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // emitted by gcc when supplied with the -Wextra option.
10328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : ParamIteratorInterface<T>(),
10329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          base_(other.base_),
10330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          iterator_(other.iterator_) {}
10331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<T>* const base_;
10333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ContainerType::const_iterator iterator_;
10334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // A cached value of *iterator_. We keep it here to allow access by
10335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // pointer in the wrapping iterator's operator->().
10336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // value_ needs to be mutable to be accessed in Current().
10337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Use of scoped_ptr helps manage cached value's lifetime,
10338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // which is bound by the lifespan of the iterator itself.
10339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    mutable scoped_ptr<const T> value_;
10340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class ValuesInIteratorRangeGenerator::Iterator
10341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValuesInIteratorRangeGenerator& other);
10344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ContainerType container_;
10346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class ValuesInIteratorRangeGenerator
10347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Stores a parameter value and later creates tests parameterized with that
10351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value.
10352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class TestClass>
10353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParameterizedTestFactory : public TestFactoryBase {
10354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename TestClass::ParamType ParamType;
10356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ParameterizedTestFactory(ParamType parameter) :
10357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      parameter_(parameter) {}
10358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual Test* CreateTest() {
10359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TestClass::SetParam(&parameter_);
10360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new TestClass();
10361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamType parameter_;
10365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
10367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestMetaFactoryBase is a base class for meta-factories that create
10372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test factories for passing into MakeAndRegisterTestInfo function.
10373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class ParamType>
10374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestMetaFactoryBase {
10375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~TestMetaFactoryBase() {}
10377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
10379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestMetaFactory creates test factories for passing into
10384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
10385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ownership of test factory pointer, same factory object cannot be passed
10386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// into that method twice. But ParameterizedTestCaseInfo is going to call
10387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it for each Test/Parameter value combination. Thus it needs meta factory
10388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// creator class.
10389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class TestCase>
10390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestMetaFactory
10391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public TestMetaFactoryBase<typename TestCase::ParamType> {
10392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename TestCase::ParamType ParamType;
10394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestMetaFactory() {}
10396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
10398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new ParameterizedTestFactory<TestCase>(parameter);
10399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
10403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ParameterizedTestCaseInfoBase is a generic interface
10408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
10409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// accumulates test information provided by TEST_P macro invocations
10410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
10411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and uses that information to register all resulting test instances
10412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
10413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a collection of pointers to the ParameterizedTestCaseInfo objects
10414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and calls RegisterTests() on each of them when asked.
10415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParameterizedTestCaseInfoBase {
10416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~ParameterizedTestCaseInfoBase() {}
10418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Base part of test case name for display purposes.
10420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual const string& GetTestCaseName() const = 0;
10421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Test case id to verify identity.
10422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual TypeId GetTestCaseTypeId() const = 0;
10423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // UnitTest class invokes this method to register tests in this
10424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test case right before running them in RUN_ALL_TESTS macro.
10425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This method should not be called more then once on any single
10426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // instance of a ParameterizedTestCaseInfoBase derived class.
10427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void RegisterTests() = 0;
10428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter protected:
10430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParameterizedTestCaseInfoBase() {}
10431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
10434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
10439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macro invocations for a particular test case and generators
10440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
10441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test case. It registers tests with all values generated by all
10442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// generators when asked.
10443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class TestCase>
10444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
10445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ParamType and GeneratorCreationFunc are private types but are required
10447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // for declarations of public methods AddTestPattern() and
10448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // AddTestCaseInstantiation().
10449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename TestCase::ParamType ParamType;
10450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A function that returns an instance of appropriate generator type.
10451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
10452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ParameterizedTestCaseInfo(const char* name)
10454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : test_case_name_(name) {}
10455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Test case base name for display purposes.
10457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual const string& GetTestCaseName() const { return test_case_name_; }
10458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Test case id to verify identity.
10459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
10460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TEST_P macro uses AddTestPattern() to record information
10461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // about a single test in a LocalTestInfo structure.
10462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test_case_name is the base name of the test case (without invocation
10463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // prefix). test_base_name is the name of an individual test without
10464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
10465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test case base name and DoBar is test base name.
10466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AddTestPattern(const char* test_case_name,
10467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      const char* test_base_name,
10468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      TestMetaFactoryBase<ParamType>* meta_factory) {
10469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
10470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                       test_base_name,
10471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                       meta_factory)));
10472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
10474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // about a generator.
10475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int AddTestCaseInstantiation(const string& instantiation_name,
10476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               GeneratorCreationFunc* func,
10477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               const char* /* file */,
10478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                               int /* line */) {
10479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    instantiations_.push_back(::std::make_pair(instantiation_name, func));
10480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return 0;  // Return value used only to run this method in namespace scope.
10481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // UnitTest class invokes this method to register tests in this test case
10483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test cases right before running tests in RUN_ALL_TESTS macro.
10484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This method should not be called more then once on any single
10485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // instance of a ParameterizedTestCaseInfoBase derived class.
10486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // UnitTest has a guard to prevent from calling this method more then once.
10487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void RegisterTests() {
10488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    for (typename TestInfoContainer::iterator test_it = tests_.begin();
10489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         test_it != tests_.end(); ++test_it) {
10490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      linked_ptr<TestInfo> test_info = *test_it;
10491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      for (typename InstantiationContainer::iterator gen_it =
10492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter               instantiations_.begin(); gen_it != instantiations_.end();
10493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter               ++gen_it) {
10494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const string& instantiation_name = gen_it->first;
10495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ParamGenerator<ParamType> generator((*gen_it->second)());
10496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        string test_case_name;
10498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        if ( !instantiation_name.empty() )
10499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          test_case_name = instantiation_name + "/";
10500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        test_case_name += test_info->test_case_base_name;
10501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        int i = 0;
10503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        for (typename ParamGenerator<ParamType>::iterator param_it =
10504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                 generator.begin();
10505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             param_it != generator.end(); ++param_it, ++i) {
10506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          Message test_name_stream;
10507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          test_name_stream << test_info->test_base_name << "/" << i;
10508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          MakeAndRegisterTestInfo(
10509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              test_case_name.c_str(),
10510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              test_name_stream.GetString().c_str(),
10511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              NULL,  // No type parameter.
10512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              PrintToString(*param_it).c_str(),
10513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              GetTestCaseTypeId(),
10514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              TestCase::SetUpTestCase,
10515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              TestCase::TearDownTestCase,
10516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              test_info->test_meta_factory->CreateTestFactory(*param_it));
10517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        }  // for param_it
10518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }  // for gen_it
10519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }  // for test_it
10520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }  // RegisterTests
10521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // LocalTestInfo structure keeps information about a single test registered
10524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // with TEST_P macro.
10525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  struct TestInfo {
10526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TestInfo(const char* a_test_case_base_name,
10527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             const char* a_test_base_name,
10528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
10529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        test_case_base_name(a_test_case_base_name),
10530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        test_base_name(a_test_base_name),
10531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        test_meta_factory(a_test_meta_factory) {}
10532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const string test_case_base_name;
10534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const string test_base_name;
10535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
10536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
10537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
10538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Keeps pairs of <Instantiation name, Sequence generator creation function>
10539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // received from INSTANTIATE_TEST_CASE_P macros.
10540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
10541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      InstantiationContainer;
10542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const string test_case_name_;
10544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestInfoContainer tests_;
10545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  InstantiationContainer instantiations_;
10546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
10548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class ParameterizedTestCaseInfo
10549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
10553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
10554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macros use it to locate their corresponding ParameterizedTestCaseInfo
10555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// descriptors.
10556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ParameterizedTestCaseRegistry {
10557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParameterizedTestCaseRegistry() {}
10559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~ParameterizedTestCaseRegistry() {
10560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         it != test_case_infos_.end(); ++it) {
10562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      delete *it;
10563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Looks up or creates and returns a structure containing information about
10567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // tests and instantiations of a particular test case.
10568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class TestCase>
10569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
10570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* test_case_name,
10571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* file,
10572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      int line) {
10573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
10574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         it != test_case_infos_.end(); ++it) {
10576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if ((*it)->GetTestCaseName() == test_case_name) {
10577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
10578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // Complain about incorrect usage of Google Test facilities
10579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // and terminate the program since we cannot guaranty correct
10580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // test case setup and tear-down in this case.
10581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          ReportInvalidTestCaseType(test_case_name,  file, line);
10582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          posix::Abort();
10583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        } else {
10584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // At this point we are sure that the object we found is of the same
10585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // type we are looking for, so we downcast it to that type
10586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          // without further checks.
10587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typed_test_info = CheckedDowncastToActualType<
10588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              ParameterizedTestCaseInfo<TestCase> >(*it);
10589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        }
10590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        break;
10591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
10592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (typed_test_info == NULL) {
10594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
10595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      test_case_infos_.push_back(typed_test_info);
10596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return typed_test_info;
10598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void RegisterTests() {
10600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         it != test_case_infos_.end(); ++it) {
10602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      (*it)->RegisterTests();
10603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
10604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
10608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestCaseInfoContainer test_case_infos_;
10610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
10612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
10615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
10616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  //  GTEST_HAS_PARAM_TEST
10618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
10620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file was GENERATED by command:
10621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     pump.py gtest-param-util-generated.h.pump
10622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DO NOT EDIT BY HAND!!!
10623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008 Google Inc.
10625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All Rights Reserved.
10626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
10628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
10629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
10630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
10632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
10633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
10634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
10635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
10636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
10637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
10638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
10639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
10640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: vladl@google.com (Vlad Losev)
10654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Type and function utilities for implementing parameterized tests.
10656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
10657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
10658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Currently Google Test supports at most 50 arguments in Values,
10659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and at most 10 arguments in Combine. Please contact
10660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// googletestframework@googlegroups.com if you need more.
10661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Please note that the number of arguments to Combine is limited
10662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by the maximum arity of the implementation of tr1::tuple which is
10663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// currently set at 10.
10664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
10666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
10667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// scripts/fuse_gtest.py depends on gtest's own header being #included
10669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// *unconditionally*.  Therefore these #includes cannot be moved
10670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// inside #if GTEST_HAS_PARAM_TEST.
10671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
10673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
10675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Forward declarations of ValuesIn(), which is implemented in
10677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// include/gtest/gtest-param-test.h.
10678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename ForwardIterator>
10679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<
10680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
10681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterValuesIn(ForwardIterator begin, ForwardIterator end);
10682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, size_t N>
10684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
10685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Container>
10687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<typename Container::value_type> ValuesIn(
10688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Container& container);
10689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
10691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Used in the Values() function to provide polymorphic capabilities.
10693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1>
10694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray1 {
10695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit ValueArray1(T1 v1) : v1_(v1) {}
10697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
10700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray1& other);
10704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
10709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray2 {
10710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
10712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
10716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray2& other);
10722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3>
10728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray3 {
10729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
10731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_)};
10736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray3& other);
10742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4>
10749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray4 {
10750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
10752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4) {}
10753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_)};
10758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray4& other);
10764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
10772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray5 {
10773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
10775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4), v5_(v5) {}
10776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
10781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray5& other);
10787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6>
10797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray6 {
10798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
10800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
10801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_)};
10807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray6& other);
10813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
10820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7>
10824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray7 {
10825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
10827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
10828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_)};
10834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray7& other);
10840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
10847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
10848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8>
10852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray8 {
10853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8) {}
10857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
10863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray8& other);
10869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
10876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
10877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
10878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9>
10882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray9 {
10883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9) {}
10887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_)};
10894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray9& other);
10900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
10907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
10908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
10909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
10910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10>
10914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray10 {
10915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10) {}
10919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_)};
10926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray10& other);
10932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
10939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
10940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
10941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
10942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
10943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
10947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11>
10948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray11 {
10949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
10952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
10953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
10960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
10964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
10965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray11& other);
10966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
10968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
10969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
10970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
10971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
10972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
10973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
10974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
10975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
10976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
10977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
10978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
10979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
10982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12>
10983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray12 {
10984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
10985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
10987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
10988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
10990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
10991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
10995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_)};
10996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
10997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
10998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
10999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray12& other);
11002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13>
11020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray13 {
11021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12_(v12), v13_(v13) {}
11026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_)};
11034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray13& other);
11040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14>
11059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray14 {
11060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
11063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
11065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
11073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray14& other);
11079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15>
11099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray15 {
11100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
11103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
11105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_)};
11114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray15& other);
11120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16>
11142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray16 {
11143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
11146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
11147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
11148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16_(v16) {}
11149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_)};
11158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray16& other);
11164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17>
11187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray17 {
11188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
11191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17) {}
11194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
11203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray17& other);
11209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18>
11233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray18 {
11234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
11240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_)};
11250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray18& other);
11256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19>
11281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray19 {
11282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
11288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_)};
11298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray19& other);
11304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20>
11330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray20 {
11331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v19_(v19), v20_(v20) {}
11338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
11348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray20& other);
11354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21>
11382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray21 {
11383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
11390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_)};
11401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray21& other);
11407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22>
11436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray22 {
11437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
11441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
11444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_)};
11455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray22& other);
11461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23>
11491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray23 {
11492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
11496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
11499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23) {}
11500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
11511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray23& other);
11517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24>
11548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray24 {
11549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
11553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
11554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
11555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
11556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v22_(v22), v23_(v23), v24_(v24) {}
11557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_)};
11569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray24& other);
11575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25>
11607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray25 {
11608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
11612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
11615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
11616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_)};
11628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray25& other);
11634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
11660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
11667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26>
11668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray26 {
11669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
11676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
11677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
11689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray26& other);
11695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
11721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
11722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
11729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27>
11730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray27 {
11731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
11738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
11739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v26_(v26), v27_(v27) {}
11740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_)};
11753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray27& other);
11759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
11785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
11786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
11787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
11794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28>
11795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray28 {
11796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
11804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
11805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_)};
11818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray28& other);
11824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
11850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
11851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
11852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
11853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
11860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29>
11861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray29 {
11862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
11870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
11871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
11884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray29& other);
11890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
11916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
11917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
11918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
11919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
11920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
11927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30>
11928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray30 {
11929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
11930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
11934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
11937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
11938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29_(v29), v30_(v30) {}
11939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
11941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
11942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
11952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_)};
11953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
11954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
11955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
11957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
11958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray30& other);
11959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
11961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
11962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
11963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
11964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
11965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
11966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
11967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
11968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
11969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
11970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
11971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
11972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
11973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
11974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
11975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
11976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
11977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
11978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
11979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
11980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
11981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
11982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
11983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
11984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
11985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
11986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
11987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
11988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
11989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
11990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
11991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
11992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
11994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
11995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
11996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
11997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
11998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31>
11999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray31 {
12000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
12005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29_(v29), v30_(v30), v31_(v31) {}
12010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_)};
12024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray31& other);
12030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32>
12071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray32 {
12072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
12077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
12078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
12079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
12080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
12081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
12082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
12096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray32& other);
12102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33>
12144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray33 {
12145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
12150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33_(v33) {}
12156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_)};
12171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray33& other);
12177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34>
12220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray34 {
12221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33_(v33), v34_(v34) {}
12232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_)};
12247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray34& other);
12253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35>
12297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray35 {
12298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
12304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
12305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
12306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
12307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
12308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
12309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
12324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray35& other);
12330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36>
12376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray36 {
12377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
12383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
12384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
12385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
12386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
12387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
12388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_)};
12404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray36& other);
12410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37>
12457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray37 {
12458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
12464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
12465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
12466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
12467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
12468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
12469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v36_(v36), v37_(v37) {}
12470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_)};
12486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray37& other);
12492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
12530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38>
12540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray38 {
12541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
12547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
12552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
12553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
12569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray38& other);
12575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
12613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
12614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39>
12624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray39 {
12625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
12631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
12636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
12637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_)};
12654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray39& other);
12660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
12698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
12699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
12700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40>
12710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray40 {
12711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
12717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
12718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
12719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
12720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
12721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
12722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
12723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v40_(v40) {}
12724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_)};
12741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray40& other);
12747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
12785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
12786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
12787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
12788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
12798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41>
12799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray41 {
12800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
12806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
12812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v39_(v39), v40_(v40), v41_(v41) {}
12813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
12830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray41& other);
12836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
12874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
12875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
12876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
12877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
12878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
12888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42>
12889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray42 {
12890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
12896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
12902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
12903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
12920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_)};
12921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
12922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
12923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
12925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
12926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray42& other);
12927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
12929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
12930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
12931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
12932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
12933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
12934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
12935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
12936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
12937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
12938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
12939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
12940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
12941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
12942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
12943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
12944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
12945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
12946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
12947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
12948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
12949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
12950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
12951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
12952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
12953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
12954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
12955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
12956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
12957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
12958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
12959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
12960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
12961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
12962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
12963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
12964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
12965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
12966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
12967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
12968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
12969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
12970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
12971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
12974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
12975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
12976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
12977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
12978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
12979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
12980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43>
12981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray43 {
12982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
12983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
12988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
12989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
12990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
12991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
12992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
12993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
12994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
12995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
12996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
12997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
12998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_)};
13013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray43& other);
13019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44>
13074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray44 {
13075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
13082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
13083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
13084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
13085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
13086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
13087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
13088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v43_(v43), v44_(v44) {}
13089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
13107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray44& other);
13113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45>
13169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray45 {
13170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
13177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
13178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
13179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
13180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
13181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
13182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
13183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
13184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v45_)};
13203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray45& other);
13209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T45 v45_;
13255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
13266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46>
13267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray46 {
13268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
13275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
13280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
13281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
13282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v45_), static_cast<T>(v46_)};
13301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray46& other);
13307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T45 v45_;
13353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T46 v46_;
13354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
13365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47>
13366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray47 {
13367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
13374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
13379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
13380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
13381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v47_(v47) {}
13382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
13401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray47& other);
13407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T45 v45_;
13453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T46 v46_;
13454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T47 v47_;
13455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
13466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48>
13467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray48 {
13468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
13475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
13476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
13477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
13478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
13479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
13480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
13481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
13482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v46_(v46), v47_(v47), v48_(v48) {}
13483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v48_)};
13503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray48& other);
13509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T45 v45_;
13555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T46 v46_;
13556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T47 v47_;
13557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T48 v48_;
13558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
13569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49>
13570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray49 {
13571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
13578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
13579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
13580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
13581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
13582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
13583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
13584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
13585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
13586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v48_), static_cast<T>(v49_)};
13606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray49& other);
13612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T45 v45_;
13658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T46 v46_;
13659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T47 v47_;
13660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T48 v48_;
13661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T49 v49_;
13662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
13666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
13667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
13668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
13669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
13670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
13671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
13672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
13673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49, typename T50>
13674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ValueArray50 {
13675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
13682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
13683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
13684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
13685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
13686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
13687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
13688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
13689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
13690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
13692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator<T>() const {
13693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
13710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ValuesIn(array);
13711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const ValueArray50& other);
13716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T1 v1_;
13718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T2 v2_;
13719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T3 v3_;
13720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T4 v4_;
13721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T5 v5_;
13722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T6 v6_;
13723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T7 v7_;
13724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T8 v8_;
13725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T9 v9_;
13726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T10 v10_;
13727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T11 v11_;
13728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T12 v12_;
13729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T13 v13_;
13730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T14 v14_;
13731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T15 v15_;
13732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T16 v16_;
13733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T17 v17_;
13734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T18 v18_;
13735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T19 v19_;
13736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T20 v20_;
13737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T21 v21_;
13738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T22 v22_;
13739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T23 v23_;
13740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T24 v24_;
13741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T25 v25_;
13742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T26 v26_;
13743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T27 v27_;
13744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T28 v28_;
13745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T29 v29_;
13746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T30 v30_;
13747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T31 v31_;
13748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T32 v32_;
13749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T33 v33_;
13750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T34 v34_;
13751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T35 v35_;
13752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T36 v36_;
13753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T37 v37_;
13754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T38 v38_;
13755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T39 v39_;
13756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T40 v40_;
13757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T41 v41_;
13758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T42 v42_;
13759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T43 v43_;
13760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T44 v44_;
13761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T45 v45_;
13762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T46 v46_;
13763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T47 v47_;
13764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T48 v48_;
13765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T49 v49_;
13766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const T50 v50_;
13767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
13768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_HAS_COMBINE
13770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
13771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
13772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates values from the Cartesian product of values produced
13773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by the argument generators.
13774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
13775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
13776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator2
13777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
13778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2> ParamType;
13780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
13782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2)
13783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2) {}
13784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator2() {}
13785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
13787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
13788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
13790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
13791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
13795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
13796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
13797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
13798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
13799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
13800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2)
13801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
13802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
13803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
13804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
13805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
13807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
13809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
13810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
13812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
13813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
13814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
13815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current2_;
13816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
13817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
13818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
13819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
13820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
13821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
13823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
13824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
13826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
13827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
13828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
13829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
13830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
13831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
13832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
13833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
13834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
13835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
13836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
13837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
13838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
13839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
13840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_);
13841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
13844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
13845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
13846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
13847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
13848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
13849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
13850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
13851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_) {
13852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
13853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
13856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
13857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_);
13858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
13860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
13861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
13862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
13863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
13864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_;
13865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
13868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
13869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
13871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
13872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
13873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
13874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
13875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
13876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
13877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
13878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
13879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
13880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator2::Iterator
13881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
13883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator2& other);
13884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
13886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
13887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator2
13888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3>
13891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator3
13892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
13893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
13894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
13895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
13897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
13898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3) {}
13899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator3() {}
13900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
13902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
13903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin());
13904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
13906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
13907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
13908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
13910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
13911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
13912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
13913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
13914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
13915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
13916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
13917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
13918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3)
13919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
13920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
13921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
13922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
13923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
13924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
13926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
13928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
13929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
13931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
13932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
13933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
13934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current3_;
13935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
13936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
13937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
13938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
13939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
13940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
13941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
13942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
13943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
13944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
13946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
13947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
13949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
13950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
13951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
13952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
13953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
13954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
13955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
13956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
13957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
13958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
13959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
13960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
13961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
13962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
13963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
13964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_);
13965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
13968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
13969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
13970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
13971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
13972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
13973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
13974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
13975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
13976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
13977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
13978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_) {
13979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
13980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
13983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
13984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_);
13985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
13987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
13988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
13989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
13990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
13991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
13992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_;
13993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
13994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
13996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
13997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
13998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
13999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
14001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
14002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
14003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
14004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
14005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
14006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
14007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
14008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
14009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
14010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
14011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator3::Iterator
14012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
14014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator3& other);
14015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
14017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
14018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
14019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator3
14020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4>
14023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator4
14024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
14025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
14026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
14027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
14029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4)
14031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
14032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator4() {}
14033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
14035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin());
14037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
14039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end());
14041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
14044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
14045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
14046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
14047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
14048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
14049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
14050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
14051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
14052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
14053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
14054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4)
14055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
14056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
14060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
14063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
14066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
14068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
14069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
14070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
14071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current4_;
14072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
14073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
14074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
14075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
14077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
14078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
14079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
14081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
14082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
14083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
14087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
14088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
14090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
14092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
14093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
14095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
14096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
14097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
14098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
14099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
14100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
14101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
14102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
14103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
14104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
14105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
14106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_);
14107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
14110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
14111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
14112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
14113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
14114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
14115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
14116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
14117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
14118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
14119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
14120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
14121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
14122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
14123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_) {
14124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
14128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
14129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
14130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_);
14131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
14133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
14134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
14135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
14136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
14137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
14138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
14139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_;
14140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
14143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
14144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
14146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
14148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
14149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
14150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
14151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
14152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
14153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
14154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
14155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
14156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
14157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
14158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
14159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
14160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
14161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator4::Iterator
14162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
14164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator4& other);
14165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
14167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
14168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
14169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
14170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator4
14171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
14174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator5
14175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
14176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
14177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
14178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
14180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
14182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
14183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator5() {}
14184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
14186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
14188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
14190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end(), g5_, g5_.end());
14192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
14195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
14196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
14197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
14198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
14199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
14200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
14201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
14202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
14203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
14204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
14205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4,
14206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T5>& g5,
14207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T5>::iterator& current5)
14208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
14209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
14214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
14217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
14220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
14222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
14223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
14224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
14225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current5_;
14226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current5_ == end5_) {
14227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_ = begin5_;
14228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current4_;
14229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
14231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
14232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
14233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
14235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
14236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
14237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
14239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
14240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
14241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
14245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
14246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
14248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
14250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
14251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
14253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
14254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
14255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
14256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
14257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
14258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
14259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
14260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
14261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
14262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
14263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
14264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_ &&
14265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == typed_other->current5_);
14266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
14269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
14270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
14271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
14272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
14273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
14274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
14275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
14276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
14277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
14278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
14279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
14280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
14281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
14282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_),
14283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin5_(other.begin5_),
14284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end5_(other.end5_),
14285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_(other.current5_) {
14286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
14290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
14291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
14292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_, *current5_);
14293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
14295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
14296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
14297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
14298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
14299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
14300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
14301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_ ||
14302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == end5_;
14303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
14306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
14307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
14309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
14311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
14312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
14313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
14314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
14315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
14316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
14317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
14318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
14319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
14320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
14321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
14322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
14323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator begin5_;
14324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator end5_;
14325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T5>::iterator current5_;
14326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
14327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator5::Iterator
14328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
14330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator5& other);
14331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
14333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
14334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
14335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
14336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T5> g5_;
14337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator5
14338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6>
14342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator6
14343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
14344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T6> > {
14345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
14346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
14347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
14349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6)
14352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
14353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator6() {}
14354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
14356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
14358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
14360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
14362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
14365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
14366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
14367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
14368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
14369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
14370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
14371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
14372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
14373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
14374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
14375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4,
14376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T5>& g5,
14377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T5>::iterator& current5,
14378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6,
14379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T6>::iterator& current6)
14380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
14381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
14387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
14390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
14393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
14395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
14396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
14397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
14398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current6_;
14399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current6_ == end6_) {
14400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_ = begin6_;
14401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current5_;
14402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current5_ == end5_) {
14404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_ = begin5_;
14405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current4_;
14406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
14408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
14409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
14410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
14412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
14413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
14414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
14416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
14417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
14418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
14422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
14423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
14425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
14427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
14428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
14430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
14431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
14432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
14433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
14434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
14435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
14436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
14437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
14438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
14439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
14440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
14441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_ &&
14442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == typed_other->current5_ &&
14443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == typed_other->current6_);
14444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
14447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
14448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
14449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
14450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
14451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
14452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
14453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
14454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
14455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
14456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
14457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
14458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
14459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
14460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_),
14461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin5_(other.begin5_),
14462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end5_(other.end5_),
14463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_(other.current5_),
14464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin6_(other.begin6_),
14465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end6_(other.end6_),
14466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_(other.current6_) {
14467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
14471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
14472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
14473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_, *current5_, *current6_);
14474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
14476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
14477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
14478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
14479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
14480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
14481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
14482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_ ||
14483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == end5_ ||
14484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == end6_;
14485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
14488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
14489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
14491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
14493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
14494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
14495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
14496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
14497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
14498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
14499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
14500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
14501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
14502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
14503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
14504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
14505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator begin5_;
14506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator end5_;
14507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T5>::iterator current5_;
14508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator begin6_;
14509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator end6_;
14510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T6>::iterator current6_;
14511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
14512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator6::Iterator
14513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
14515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator6& other);
14516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
14518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
14519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
14520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
14521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T5> g5_;
14522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T6> g6_;
14523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator6
14524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7>
14528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator7
14529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T7> > {
14531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
14532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
14533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
14535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
14538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
14539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator7() {}
14540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
14542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g7_.begin());
14545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
14547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
14549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
14552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
14553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
14554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
14555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
14556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
14557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
14558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
14559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
14560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
14561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
14562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4,
14563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T5>& g5,
14564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T5>::iterator& current5,
14565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6,
14566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T6>::iterator& current6,
14567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T7>& g7,
14568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T7>::iterator& current7)
14569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
14570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
14576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
14577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
14580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
14583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
14585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
14586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
14587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
14588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current7_;
14589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current7_ == end7_) {
14590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_ = begin7_;
14591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current6_;
14592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current6_ == end6_) {
14594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_ = begin6_;
14595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current5_;
14596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current5_ == end5_) {
14598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_ = begin5_;
14599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current4_;
14600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
14602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
14603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
14604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
14606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
14607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
14608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
14610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
14611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
14612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
14616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
14617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
14619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
14621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
14622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
14624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
14625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
14626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
14627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
14628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
14629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
14630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
14631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
14632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
14633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
14634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
14635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_ &&
14636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == typed_other->current5_ &&
14637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == typed_other->current6_ &&
14638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == typed_other->current7_);
14639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
14642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
14643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
14644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
14645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
14646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
14647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
14648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
14649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
14650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
14651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
14652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
14653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
14654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
14655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_),
14656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin5_(other.begin5_),
14657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end5_(other.end5_),
14658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_(other.current5_),
14659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin6_(other.begin6_),
14660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end6_(other.end6_),
14661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_(other.current6_),
14662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin7_(other.begin7_),
14663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end7_(other.end7_),
14664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_(other.current7_) {
14665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
14669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
14670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
14671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_, *current5_, *current6_, *current7_);
14672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
14674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
14675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
14676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
14677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
14678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
14679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
14680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_ ||
14681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == end5_ ||
14682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == end6_ ||
14683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == end7_;
14684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
14687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
14688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
14690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
14692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
14693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
14694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
14695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
14696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
14697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
14698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
14699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
14700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
14701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
14702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
14703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
14704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator begin5_;
14705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator end5_;
14706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T5>::iterator current5_;
14707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator begin6_;
14708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator end6_;
14709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T6>::iterator current6_;
14710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator begin7_;
14711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator end7_;
14712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T7>::iterator current7_;
14713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
14714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator7::Iterator
14715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
14717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator7& other);
14718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
14720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
14721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
14722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
14723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T5> g5_;
14724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T6> g6_;
14725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T7> g7_;
14726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator7
14727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8>
14731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator8
14732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T7, T8> > {
14734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
14735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
14736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
14738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
14741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T8>& g8)
14742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
14743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          g8_(g8) {}
14744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator8() {}
14745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
14747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g7_.begin(), g8_, g8_.begin());
14750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
14752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
14754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g8_.end());
14755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
14758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
14759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
14760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
14761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
14762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
14763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
14764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
14765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
14766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
14767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
14768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4,
14769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T5>& g5,
14770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T5>::iterator& current5,
14771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6,
14772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T6>::iterator& current6,
14773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T7>& g7,
14774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T7>::iterator& current7,
14775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T8>& g8,
14776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T8>::iterator& current8)
14777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
14778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
14784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
14785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
14786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
14789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
14792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
14794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
14795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
14796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
14797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current8_;
14798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current8_ == end8_) {
14799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current8_ = begin8_;
14800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current7_;
14801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current7_ == end7_) {
14803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_ = begin7_;
14804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current6_;
14805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current6_ == end6_) {
14807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_ = begin6_;
14808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current5_;
14809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current5_ == end5_) {
14811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_ = begin5_;
14812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current4_;
14813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
14815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
14816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
14817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
14819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
14820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
14821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
14823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
14824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
14825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
14826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
14829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
14830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
14832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
14834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
14835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
14837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
14838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
14839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
14840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
14841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
14842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
14843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
14844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
14845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
14846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
14847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
14848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_ &&
14849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == typed_other->current5_ &&
14850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == typed_other->current6_ &&
14851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == typed_other->current7_ &&
14852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current8_ == typed_other->current8_);
14853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
14856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
14857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
14858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
14859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
14860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
14861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
14862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
14863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
14864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
14865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
14866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
14867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
14868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
14869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_),
14870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin5_(other.begin5_),
14871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end5_(other.end5_),
14872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_(other.current5_),
14873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin6_(other.begin6_),
14874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end6_(other.end6_),
14875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_(other.current6_),
14876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin7_(other.begin7_),
14877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end7_(other.end7_),
14878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_(other.current7_),
14879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin8_(other.begin8_),
14880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end8_(other.end8_),
14881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current8_(other.current8_) {
14882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
14883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
14886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
14887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
14888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_, *current5_, *current6_, *current7_, *current8_);
14889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
14891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
14892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
14893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
14894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
14895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
14896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
14897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_ ||
14898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == end5_ ||
14899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == end6_ ||
14900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == end7_ ||
14901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current8_ == end8_;
14902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
14903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
14905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
14906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
14908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
14910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
14911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
14912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
14913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
14914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
14915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
14916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
14917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
14918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
14919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
14920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
14921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
14922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator begin5_;
14923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator end5_;
14924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T5>::iterator current5_;
14925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator begin6_;
14926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator end6_;
14927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T6>::iterator current6_;
14928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator begin7_;
14929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator end7_;
14930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T7>::iterator current7_;
14931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T8>::iterator begin8_;
14932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T8>::iterator end8_;
14933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T8>::iterator current8_;
14934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
14935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator8::Iterator
14936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
14938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator8& other);
14939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
14941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
14942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
14943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
14944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T5> g5_;
14945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T6> g6_;
14946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T7> g7_;
14947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T8> g8_;
14948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator8
14949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9>
14953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator9
14954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T7, T8, T9> > {
14956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
14957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
14958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
14960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
14963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
14964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
14965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          g9_(g9) {}
14966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator9() {}
14967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
14969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
14972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
14974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
14976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g8_.end(), g9_, g9_.end());
14977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
14978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
14979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
14980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
14981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
14982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
14983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
14984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
14985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
14986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
14987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
14988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
14989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
14990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4,
14991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T5>& g5,
14992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T5>::iterator& current5,
14993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6,
14994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T6>::iterator& current6,
14995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T7>& g7,
14996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T7>::iterator& current7,
14997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T8>& g8,
14998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T8>::iterator& current8,
14999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T9>& g9,
15000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T9>::iterator& current9)
15001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
15002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
15003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
15004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
15005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
15006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
15007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
15008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
15009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
15010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
15011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
15012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
15014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
15016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
15017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
15019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
15020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
15021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
15022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current9_;
15023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current9_ == end9_) {
15024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current9_ = begin9_;
15025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current8_;
15026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current8_ == end8_) {
15028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current8_ = begin8_;
15029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current7_;
15030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current7_ == end7_) {
15032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_ = begin7_;
15033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current6_;
15034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current6_ == end6_) {
15036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_ = begin6_;
15037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current5_;
15038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current5_ == end5_) {
15040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_ = begin5_;
15041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current4_;
15042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
15044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
15045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
15046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
15048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
15049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
15050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
15052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
15053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
15054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
15056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
15058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
15059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
15061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
15062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
15063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
15064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
15065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
15066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
15067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
15068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
15069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
15070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
15071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
15072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
15073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
15074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
15075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
15076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
15077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_ &&
15078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == typed_other->current5_ &&
15079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == typed_other->current6_ &&
15080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == typed_other->current7_ &&
15081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current8_ == typed_other->current8_ &&
15082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current9_ == typed_other->current9_);
15083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
15086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
15087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
15088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
15089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
15090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
15091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
15092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
15093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
15094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
15095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
15096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
15097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
15098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
15099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_),
15100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin5_(other.begin5_),
15101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end5_(other.end5_),
15102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_(other.current5_),
15103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin6_(other.begin6_),
15104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end6_(other.end6_),
15105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_(other.current6_),
15106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin7_(other.begin7_),
15107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end7_(other.end7_),
15108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_(other.current7_),
15109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin8_(other.begin8_),
15110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end8_(other.end8_),
15111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current8_(other.current8_),
15112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin9_(other.begin9_),
15113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end9_(other.end9_),
15114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current9_(other.current9_) {
15115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
15116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
15119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
15120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
15121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_, *current5_, *current6_, *current7_, *current8_,
15122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current9_);
15123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
15125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
15126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
15127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
15128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
15129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
15130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
15131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_ ||
15132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == end5_ ||
15133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == end6_ ||
15134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == end7_ ||
15135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current8_ == end8_ ||
15136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current9_ == end9_;
15137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
15140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
15141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
15143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
15144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
15145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
15146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
15147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
15148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
15149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
15150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
15151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
15152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
15153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
15154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
15155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
15156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
15157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator begin5_;
15158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator end5_;
15159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T5>::iterator current5_;
15160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator begin6_;
15161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator end6_;
15162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T6>::iterator current6_;
15163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator begin7_;
15164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator end7_;
15165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T7>::iterator current7_;
15166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T8>::iterator begin8_;
15167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T8>::iterator end8_;
15168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T8>::iterator current8_;
15169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T9>::iterator begin9_;
15170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T9>::iterator end9_;
15171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T9>::iterator current9_;
15172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
15173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator9::Iterator
15174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator9& other);
15177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
15179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
15180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
15181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
15182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T5> g5_;
15183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T6> g6_;
15184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T7> g7_;
15185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T8> g8_;
15186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T9> g9_;
15187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator9
15188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10>
15192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductGenerator10
15193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
15194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T7, T8, T9, T10> > {
15195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
15197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
15199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
15200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
15201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
15202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
15203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T10>& g10)
15204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          g9_(g9), g10_(g10) {}
15206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~CartesianProductGenerator10() {}
15207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* Begin() const {
15209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
15210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
15211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
15212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ParamIteratorInterface<ParamType>* End() const {
15214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
15215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
15216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
15217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class Iterator : public ParamIteratorInterface<ParamType> {
15221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:
15222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const ParamGeneratorInterface<ParamType>* base,
15223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T1>& g1,
15224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T1>::iterator& current1,
15225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T2>& g2,
15226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T2>::iterator& current2,
15227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T3>& g3,
15228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T3>::iterator& current3,
15229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T4>& g4,
15230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T4>::iterator& current4,
15231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T5>& g5,
15232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T5>::iterator& current5,
15233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T6>& g6,
15234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T6>::iterator& current6,
15235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T7>& g7,
15236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T7>::iterator& current7,
15237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T8>& g8,
15238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T8>::iterator& current8,
15239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T9>& g9,
15240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T9>::iterator& current9,
15241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const ParamGenerator<T10>& g10,
15242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const typename ParamGenerator<T10>::iterator& current10)
15243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(base),
15244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
15245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
15246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
15247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
15248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
15249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
15250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
15251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
15252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
15253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
15254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
15255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ~Iterator() {}
15257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
15259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return base_;
15260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // Advance should not be called on beyond-of-range iterators
15262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // so no component iterators must be beyond end of range, either.
15263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void Advance() {
15264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      assert(!AtEnd());
15265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ++current10_;
15266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current10_ == end10_) {
15267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current10_ = begin10_;
15268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current9_;
15269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current9_ == end9_) {
15271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current9_ = begin9_;
15272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current8_;
15273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current8_ == end8_) {
15275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current8_ = begin8_;
15276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current7_;
15277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current7_ == end7_) {
15279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_ = begin7_;
15280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current6_;
15281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current6_ == end6_) {
15283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_ = begin6_;
15284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current5_;
15285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current5_ == end5_) {
15287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_ = begin5_;
15288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current4_;
15289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current4_ == end4_) {
15291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_ = begin4_;
15292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current3_;
15293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current3_ == end3_) {
15295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_ = begin3_;
15296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current2_;
15297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (current2_ == end2_) {
15299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_ = begin2_;
15300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        ++current1_;
15301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      }
15302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
15303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual ParamIteratorInterface<ParamType>* Clone() const {
15305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return new Iterator(*this);
15306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual const ParamType* Current() const { return &current_value_; }
15308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
15309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Having the same base generator guarantees that the other
15310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // iterator is of the same type and we can downcast.
15311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
15312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "The program attempted to compare iterators "
15313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          << "from different generators." << std::endl;
15314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const Iterator* typed_other =
15315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CheckedDowncastToActualType<const Iterator>(&other);
15316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterators equal if they both point beyond their
15317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // respective ranges. That can happen in a variety of fashions,
15318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // so we have to consult AtEnd().
15319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return (AtEnd() && typed_other->AtEnd()) ||
15320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter         (
15321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == typed_other->current1_ &&
15322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == typed_other->current2_ &&
15323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == typed_other->current3_ &&
15324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == typed_other->current4_ &&
15325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == typed_other->current5_ &&
15326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == typed_other->current6_ &&
15327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == typed_other->current7_ &&
15328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current8_ == typed_other->current8_ &&
15329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current9_ == typed_other->current9_ &&
15330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current10_ == typed_other->current10_);
15331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
15334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Iterator(const Iterator& other)
15335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : base_(other.base_),
15336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin1_(other.begin1_),
15337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end1_(other.end1_),
15338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current1_(other.current1_),
15339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin2_(other.begin2_),
15340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end2_(other.end2_),
15341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current2_(other.current2_),
15342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin3_(other.begin3_),
15343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end3_(other.end3_),
15344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current3_(other.current3_),
15345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin4_(other.begin4_),
15346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end4_(other.end4_),
15347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current4_(other.current4_),
15348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin5_(other.begin5_),
15349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end5_(other.end5_),
15350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current5_(other.current5_),
15351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin6_(other.begin6_),
15352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end6_(other.end6_),
15353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current6_(other.current6_),
15354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin7_(other.begin7_),
15355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end7_(other.end7_),
15356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current7_(other.current7_),
15357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin8_(other.begin8_),
15358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end8_(other.end8_),
15359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current8_(other.current8_),
15360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin9_(other.begin9_),
15361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end9_(other.end9_),
15362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current9_(other.current9_),
15363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        begin10_(other.begin10_),
15364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        end10_(other.end10_),
15365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current10_(other.current10_) {
15366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ComputeCurrentValue();
15367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void ComputeCurrentValue() {
15370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      if (!AtEnd())
15371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        current_value_ = ParamType(*current1_, *current2_, *current3_,
15372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current4_, *current5_, *current6_, *current7_, *current8_,
15373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            *current9_, *current10_);
15374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    bool AtEnd() const {
15376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We must report iterator past the end of the range when either of the
15377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // component iterators has reached the end of its range.
15378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return
15379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current1_ == end1_ ||
15380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current2_ == end2_ ||
15381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current3_ == end3_ ||
15382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current4_ == end4_ ||
15383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current5_ == end5_ ||
15384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current6_ == end6_ ||
15385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current7_ == end7_ ||
15386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current8_ == end8_ ||
15387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current9_ == end9_ ||
15388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          current10_ == end10_;
15389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }
15390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // No implementation - assignment is unsupported.
15392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    void operator=(const Iterator& other);
15393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ParamGeneratorInterface<ParamType>* const base_;
15395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
15396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // current[i]_ is the actual traversing iterator.
15397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator begin1_;
15398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T1>::iterator end1_;
15399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T1>::iterator current1_;
15400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator begin2_;
15401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T2>::iterator end2_;
15402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T2>::iterator current2_;
15403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator begin3_;
15404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T3>::iterator end3_;
15405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T3>::iterator current3_;
15406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator begin4_;
15407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T4>::iterator end4_;
15408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T4>::iterator current4_;
15409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator begin5_;
15410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T5>::iterator end5_;
15411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T5>::iterator current5_;
15412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator begin6_;
15413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T6>::iterator end6_;
15414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T6>::iterator current6_;
15415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator begin7_;
15416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T7>::iterator end7_;
15417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T7>::iterator current7_;
15418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T8>::iterator begin8_;
15419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T8>::iterator end8_;
15420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T8>::iterator current8_;
15421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T9>::iterator begin9_;
15422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T9>::iterator end9_;
15423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T9>::iterator current9_;
15424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T10>::iterator begin10_;
15425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const typename ParamGenerator<T10>::iterator end10_;
15426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename ParamGenerator<T10>::iterator current10_;
15427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ParamType current_value_;
15428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };  // class CartesianProductGenerator10::Iterator
15429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductGenerator10& other);
15432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T1> g1_;
15434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T2> g2_;
15435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T3> g3_;
15436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T4> g4_;
15437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T5> g5_;
15438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T6> g6_;
15439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T7> g7_;
15440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T8> g8_;
15441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T9> g9_;
15442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamGenerator<T10> g10_;
15443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductGenerator10
15444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
15447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper classes providing Combine() with polymorphic features. They allow
15449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
15450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// convertible to U.
15451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2>
15453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder2 {
15454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
15456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2) {}
15457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2>
15458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
15459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
15460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator2<T1, T2>(
15461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_)));
15463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder2& other);
15468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder2
15472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3>
15474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder3 {
15475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
15477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3)
15478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3) {}
15479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3>
15480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
15481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
15482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator3<T1, T2, T3>(
15483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_)));
15486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder3& other);
15491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder3
15496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4>
15499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder4 {
15500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
15502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4)
15503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
15504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4>
15505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
15506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
15507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator4<T1, T2, T3, T4>(
15508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_)));
15512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder4& other);
15517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder4
15523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4, class Generator5>
15526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder5 {
15527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
15529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4, const Generator5& g5)
15530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
15531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4, typename T5>
15532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
15533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
15534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
15535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_),
15539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T5> >(g5_)));
15540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder5& other);
15545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator5 g5_;
15551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder5
15552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4, class Generator5, class Generator6>
15555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder6 {
15556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
15558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator6& g6)
15560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
15561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typename T6>
15563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
15564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
15565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
15566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_),
15570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T5> >(g5_),
15571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T6> >(g6_)));
15572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder6& other);
15577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator5 g5_;
15583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator6 g6_;
15584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder6
15585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4, class Generator5, class Generator6, class Generator7>
15588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder7 {
15589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
15591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator6& g6, const Generator7& g7)
15593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
15594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typename T6, typename T7>
15596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
15597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T7> >() const {
15598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
15599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
15600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_),
15604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T5> >(g5_),
15605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T6> >(g6_),
15606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T7> >(g7_)));
15607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder7& other);
15612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator5 g5_;
15618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator6 g6_;
15619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator7 g7_;
15620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder7
15621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4, class Generator5, class Generator6, class Generator7,
15624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator8>
15625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder8 {
15626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
15628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator6& g6, const Generator7& g7, const Generator8& g8)
15630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
15631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          g8_(g8) {}
15632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typename T6, typename T7, typename T8>
15634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
15635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T8> >() const {
15636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
15637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
15638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_),
15642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T5> >(g5_),
15643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T6> >(g6_),
15644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T7> >(g7_),
15645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T8> >(g8_)));
15646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder8& other);
15651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator5 g5_;
15657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator6 g6_;
15658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator7 g7_;
15659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator8 g8_;
15660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder8
15661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4, class Generator5, class Generator6, class Generator7,
15664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator8, class Generator9>
15665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder9 {
15666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
15668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator6& g6, const Generator7& g7, const Generator8& g8,
15670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator9& g9)
15671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          g9_(g9) {}
15673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typename T6, typename T7, typename T8, typename T9>
15675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T9> >() const {
15677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T9> >(
15679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
15680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_),
15684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T5> >(g5_),
15685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T6> >(g6_),
15686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T7> >(g7_),
15687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T8> >(g8_),
15688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T9> >(g9_)));
15689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder9& other);
15694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator5 g5_;
15700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator6 g6_;
15701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator7 g7_;
15702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator8 g8_;
15703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator9 g9_;
15704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder9
15705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Generator1, class Generator2, class Generator3,
15707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator4, class Generator5, class Generator6, class Generator7,
15708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    class Generator8, class Generator9, class Generator10>
15709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass CartesianProductHolder10 {
15710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
15711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
15712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator6& g6, const Generator7& g7, const Generator8& g8,
15714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator9& g9, const Generator10& g10)
15715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          g9_(g9), g10_(g10) {}
15717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typename T6, typename T7, typename T8, typename T9, typename T10>
15719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T9, T10> >() const {
15721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        T9, T10> >(
15723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
15724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            T10>(
15725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T1> >(g1_),
15726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T2> >(g2_),
15727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T3> >(g3_),
15728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T4> >(g4_),
15729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T5> >(g5_),
15730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T6> >(g6_),
15731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T7> >(g7_),
15732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T8> >(g8_),
15733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T9> >(g9_),
15734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        static_cast<ParamGenerator<T10> >(g10_)));
15735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
15736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
15738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // No implementation - assignment is unsupported.
15739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const CartesianProductHolder10& other);
15740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator1 g1_;
15742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator2 g2_;
15743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator3 g3_;
15744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator4 g4_;
15745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator5 g5_;
15746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator6 g6_;
15747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator7 g7_;
15748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator8 g8_;
15749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator9 g9_;
15750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const Generator10 g10_;
15751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class CartesianProductHolder10
15752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_HAS_COMBINE
15754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
15756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
15757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  //  GTEST_HAS_PARAM_TEST
15759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
15761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
15763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
15765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Functions producing parameter generators.
15767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test uses these generators to produce parameters for value-
15769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameterized tests. When a parameterized test case is instantiated
15770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with a particular generator, Google Test creates and runs tests
15771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for each element in the sequence produced by the generator.
15772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In the following sample, tests from test case FooTest are instantiated
15774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each three times with parameter values 3, 5, and 8:
15775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class FooTest : public TestWithParam<int> { ... };
15777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_P(FooTest, TestThis) {
15779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
15780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_P(FooTest, TestThat) {
15781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
15782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
15783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Range() returns generators providing sequences of values in a range.
15786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synopsis:
15788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Range(start, end)
15789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing a sequence of values {start, start+1,
15790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     start+2, ..., }.
15791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Range(start, end, step)
15792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing a sequence of values {start, start+step,
15793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     start+step+step, ..., }.
15794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Notes:
15795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   * The generated sequences never include end. For example, Range(1, 5)
15796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
15797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     returns a generator producing {1, 3, 5, 7}.
15798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   * start and end must have the same type. That type may be any integral or
15799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     floating-point type or a user defined type satisfying these conditions:
15800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * It must be assignable (have operator=() defined).
15801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * It must have operator+() (operator+(int-compatible type) for
15802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       two-operand version).
15803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * It must have operator<() defined.
15804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Elements in the resulting sequences will also have that type.
15805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   * Condition start < end must be satisfied in order for resulting sequences
15806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     to contain any elements.
15807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, typename IncrementT>
15809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
15810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ParamGenerator<T>(
15811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      new internal::RangeGenerator<T, IncrementT>(start, end, step));
15812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
15815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<T> Range(T start, T end) {
15816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return Range(start, end, 1);
15817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ValuesIn() function allows generation of tests with parameters coming from
15820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a container.
15821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synopsis:
15823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ValuesIn(const T (&array)[N])
15824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing sequences with elements from
15825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     a C-style array.
15826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ValuesIn(const Container& container)
15827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing sequences with elements from
15828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     an STL-style container.
15829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ValuesIn(Iterator begin, Iterator end)
15830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing sequences with elements from
15831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     a range [begin, end) defined by a pair of STL-style iterators. These
15832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     iterators can also be plain C pointers.
15833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Please note that ValuesIn copies the values from the containers
15835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// passed in and keeps them to generate tests in RUN_ALL_TESTS().
15836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Examples:
15838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This instantiates tests from test case StringTest
15840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each with C-string values of "foo", "bar", and "baz":
15841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// const char* strings[] = {"foo", "bar", "baz"};
15843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
15844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This instantiates tests from test case StlStringTest
15846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each with STL strings with values "a" and "b":
15847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::std::vector< ::std::string> GetParameterStrings() {
15849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ::std::vector< ::std::string> v;
15850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   v.push_back("a");
15851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   v.push_back("b");
15852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   return v;
15853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
15854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(CharSequence,
15856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         StlStringTest,
15857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         ValuesIn(GetParameterStrings()));
15858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This will also instantiate tests from CharTest
15861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each with parameter values 'a' and 'b':
15862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::std::list<char> GetParameterChars() {
15864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ::std::list<char> list;
15865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   list.push_back('a');
15866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   list.push_back('b');
15867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   return list;
15868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
15869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::std::list<char> l = GetParameterChars();
15870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(CharSequence2,
15871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         CharTest,
15872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         ValuesIn(l.begin(), l.end()));
15873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename ForwardIterator>
15875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<
15876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
15877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterValuesIn(ForwardIterator begin, ForwardIterator end) {
15878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
15879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::value_type ParamType;
15880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ParamGenerator<ParamType>(
15881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
15882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T, size_t N>
15885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
15886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ValuesIn(array, array + N);
15887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Container>
15890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ParamGenerator<typename Container::value_type> ValuesIn(
15891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Container& container) {
15892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ValuesIn(container.begin(), container.end());
15893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Values() allows generating tests from explicitly specified list of
15896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameters.
15897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synopsis:
15899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Values(T v1, T v2, ..., T vN)
15900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing sequences with elements v1, v2, ..., vN.
15901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For example, this instantiates tests from test case BarTest each
15903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with values "one", "two", and "three":
15904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
15906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
15908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The exact type of values will depend on the type of parameter in BazTest.
15909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
15911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Currently, Values() supports from 1 to 50 parameters.
15913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
15914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1>
15915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray1<T1> Values(T1 v1) {
15916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray1<T1>(v1);
15917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
15920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
15921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray2<T1, T2>(v1, v2);
15922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3>
15925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
15926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
15927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4>
15930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
15931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
15932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
15935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
15936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T5 v5) {
15937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
15938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6>
15942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
15943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T4 v4, T5 v5, T6 v6) {
15944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
15945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7>
15949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
15950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T4 v4, T5 v5, T6 v6, T7 v7) {
15951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
15952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v6, v7);
15953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8>
15957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
15958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
15959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
15960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5, v6, v7, v8);
15961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9>
15965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
15966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
15967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
15968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4, v5, v6, v7, v8, v9);
15969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10>
15973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
15974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
15975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
15976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2, v3, v4, v5, v6, v7, v8, v9, v10);
15977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
15981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11>
15982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
15983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11) {
15985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
15986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
15987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
15991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12>
15992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
15993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12) {
15995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
15996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
15997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
15998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
15999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13>
16002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
16003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13) {
16005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
16007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14>
16012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
16015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14);
16018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15>
16023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
16026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13, v14, v15);
16029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16>
16035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16) {
16039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12, v13, v14, v15, v16);
16042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17>
16048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17) {
16052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11, v12, v13, v14, v15, v16, v17);
16055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18>
16061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18) {
16065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10, v11, v12, v13, v14, v15, v16, v17, v18);
16068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19>
16074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
16078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
16080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
16081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20>
16087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
16091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
16093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
16094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21>
16101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
16105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
16107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
16108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22>
16115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
16117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T21 v21, T22 v22) {
16120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
16122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20, v21, v22);
16124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23>
16131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
16133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T21 v21, T22 v22, T23 v23) {
16136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
16138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20, v21, v22, v23);
16140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24>
16147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
16149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T21 v21, T22 v22, T23 v23, T24 v24) {
16152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
16154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
16155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v19, v20, v21, v22, v23, v24);
16156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25>
16163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
16165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
16166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
16167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
16168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
16170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
16171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v18, v19, v20, v21, v22, v23, v24, v25);
16172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26>
16180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26) {
16186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
16189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
16190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27>
16198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
16200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27) {
16204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
16207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
16208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28>
16216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
16218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27, T28 v28) {
16222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
16226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v28);
16227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29>
16235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27, T28 v28, T29 v29) {
16241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
16245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27, v28, v29);
16246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30>
16254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
16258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
16259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
16260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
16264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v26, v27, v28, v29, v30);
16265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31>
16274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
16280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
16284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v25, v26, v27, v28, v29, v30, v31);
16285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32>
16294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T32 v32) {
16301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24, v25, v26, v27, v28, v29, v30, v31, v32);
16306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33>
16315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T32 v32, T33 v33) {
16322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
16325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
16327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34>
16336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
16341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
16342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31 v31, T32 v32, T33 v33, T34 v34) {
16343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
16346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
16347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
16348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35>
16357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
16364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
16367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
16368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
16369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36>
16379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
16386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
16389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v34, v35, v36);
16392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37>
16402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
16405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T37 v37) {
16410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
16413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v34, v35, v36, v37);
16416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38>
16426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
16429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T37 v37, T38 v38) {
16434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
16437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
16438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
16439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v33, v34, v35, v36, v37, v38);
16440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39>
16450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
16453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T37 v37, T38 v38, T39 v39) {
16458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
16461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
16462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
16463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v32, v33, v34, v35, v36, v37, v38, v39);
16464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40>
16474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
16477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
16478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
16479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
16480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
16481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
16482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
16486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
16487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
16488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41>
16499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
16502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
16507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
16511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
16512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
16513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42>
16524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
16527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T42 v42) {
16533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
16538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
16539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v42);
16540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43>
16551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
16554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T42 v42, T43 v43) {
16560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
16565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
16566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v41, v42, v43);
16567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44>
16578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T42 v42, T43 v43, T44 v44) {
16587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
16592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
16593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v40, v41, v42, v43, v44);
16594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45>
16605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
16610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
16611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
16612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
16613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
16614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
16619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
16620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v39, v40, v41, v42, v43, v44, v45);
16621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
16632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46>
16633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
16642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
16648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v38, v39, v40, v41, v42, v43, v44, v45, v46);
16649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
16660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47>
16661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
16670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
16674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
16676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
16677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
16688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48>
16689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
16698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T48 v48) {
16699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
16703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
16704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
16705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
16706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
16717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49>
16718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
16724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
16725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
16726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
16727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T47 v47, T48 v48, T49 v49) {
16728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
16732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
16733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
16734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
16735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T6, typename T7, typename T8, typename T9, typename T10,
16739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T11, typename T12, typename T13, typename T14, typename T15,
16740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T16, typename T17, typename T18, typename T19, typename T20,
16741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T21, typename T22, typename T23, typename T24, typename T25,
16742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T26, typename T27, typename T28, typename T29, typename T30,
16743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T31, typename T32, typename T33, typename T34, typename T35,
16744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T36, typename T37, typename T38, typename T39, typename T40,
16745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T41, typename T42, typename T43, typename T44, typename T45,
16746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename T46, typename T47, typename T48, typename T49, typename T50>
16747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
16755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
16756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
16757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
16761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
16764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      v48, v49, v50);
16765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Bool() allows generating tests with parameters in a set of (false, true).
16768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synopsis:
16770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Bool()
16771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing sequences with elements {false, true}.
16772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// It is useful when testing code that depends on Boolean flags. Combinations
16774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of multiple flags can be tested when several Bool()'s are combined using
16775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Combine() function.
16776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In the following example all tests in the test case FlagDependentTest
16778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will be instantiated twice with parameters false and true.
16779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class FlagDependentTest : public testing::TestWithParam<bool> {
16781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   virtual void SetUp() {
16782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     external_flag = GetParam();
16783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
16784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
16785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
16786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline internal::ParamGenerator<bool> Bool() {
16788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return Values(false, true);
16789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_HAS_COMBINE
16792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Combine() allows the user to combine two or more sequences to produce
16793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// values of a Cartesian product of those sequences' elements.
16794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Synopsis:
16796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Combine(gen1, gen2, ..., genN)
16797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   - returns a generator producing sequences with elements coming from
16798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     the Cartesian product of elements from the sequences generated by
16799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     gen1, gen2, ..., genN. The sequence elements will have a type of
16800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
16801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     of elements from sequences produces by gen1, gen2, ..., genN.
16802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Combine can have up to 10 arguments. This number is currently limited
16804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by the maximum number of elements in the tuple implementation used by Google
16805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Test.
16806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Example:
16808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This will instantiate tests in test case AnimalTest each one with
16810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
16811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tuple("dog", BLACK), and tuple("dog", WHITE):
16812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// enum Color { BLACK, GRAY, WHITE };
16814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class AnimalTest
16815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
16816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_P(AnimalTest, AnimalLooksNice) {...}
16818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
16820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         Combine(Values("cat", "dog"),
16821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                                 Values(BLACK, WHITE)));
16822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This will instantiate tests in FlagDependentTest with all variations of two
16824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Boolean flags:
16825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class FlagDependentTest
16827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     : public testing::TestWithParam<tuple<bool, bool> > {
16828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   virtual void SetUp() {
16829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
16830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     tie(external_flag_1, external_flag_2) = GetParam();
16831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
16832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// };
16833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_P(FlagDependentTest, TestFeature1) {
16835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Test your code using external_flag_1 and external_flag_2 here.
16836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
16837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
16838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//                         Combine(Bool(), Bool()));
16839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2>
16841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder2<Generator1, Generator2> Combine(
16842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2) {
16843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder2<Generator1, Generator2>(
16844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2);
16845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3>
16848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
16849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
16850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
16851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3);
16852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4>
16856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
16857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4> Combine(
16858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4) {
16860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
16861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4>(
16862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4);
16863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4, typename Generator5>
16867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
16868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4, Generator5> Combine(
16869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4, const Generator5& g5) {
16871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
16872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4, Generator5>(
16873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4, g5);
16874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4, typename Generator5, typename Generator6>
16878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
16879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4, Generator5, Generator6> Combine(
16880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
16882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
16883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4, Generator5, Generator6>(
16884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4, g5, g6);
16885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4, typename Generator5, typename Generator6,
16889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator7>
16890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
16891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4, Generator5, Generator6, Generator7> Combine(
16892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator7& g7) {
16895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
16896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4, Generator5, Generator6, Generator7>(
16897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4, g5, g6, g7);
16898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4, typename Generator5, typename Generator6,
16902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator7, typename Generator8>
16903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
16904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
16905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator7& g7, const Generator8& g8) {
16908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
16909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4, Generator5, Generator6, Generator7, Generator8>(
16910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4, g5, g6, g7, g8);
16911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4, typename Generator5, typename Generator6,
16915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator7, typename Generator8, typename Generator9>
16916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
16917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4, Generator5, Generator6, Generator7, Generator8,
16918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator9> Combine(
16919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
16922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
16923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
16924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4, g5, g6, g7, g8, g9);
16925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Generator1, typename Generator2, typename Generator3,
16928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator4, typename Generator5, typename Generator6,
16929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator7, typename Generator8, typename Generator9,
16930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typename Generator10>
16931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
16932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
16933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    Generator10> Combine(
16934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator7& g7, const Generator8& g8, const Generator9& g9,
16937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        const Generator10& g10) {
16938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
16939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
16940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Generator10>(
16941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
16942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
16943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif  // GTEST_HAS_COMBINE
16944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define TEST_P(test_case_name, test_name) \
16948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
16949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : public test_case_name { \
16950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public: \
16951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
16952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void TestBody(); \
16953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private: \
16954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    static int AddToRegistry() { \
16955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
16956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          GetTestCasePatternHolder<test_case_name>(\
16957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
16958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  #test_case_name, \
16959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  #test_name, \
16960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  new ::testing::internal::TestMetaFactory< \
16961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
16962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return 0; \
16963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    } \
16964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    static int gtest_registering_dummy_; \
16965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
16966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
16967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }; \
16968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int GTEST_TEST_CLASS_NAME_(test_case_name, \
16969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                             test_name)::gtest_registering_dummy_ = \
16970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
16971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
16972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
16974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
16975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
16976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int gtest_##prefix##test_case_name##_dummy_ = \
16977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
16978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          GetTestCasePatternHolder<test_case_name>(\
16979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
16980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  #prefix, \
16981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
16982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                  __FILE__, __LINE__)
16983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
16985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
16987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
16988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
16989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2006, Google Inc.
16990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
16991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
16993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
16994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
16995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
16996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
16997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
16998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
16999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
17000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
17001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
17002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
17003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
17004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
17005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
17012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
17014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
17019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google C++ Testing Framework definitions useful in production code.
17021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When you need to test the private or protected members of a class,
17026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// use the FRIEND_TEST macro to declare your tests as friends of the
17027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class.  For example:
17028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class MyClass {
17030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  private:
17031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void MyMethod();
17032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   FRIEND_TEST(MyClassTest, MyMethod);
17033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// };
17034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class MyClassTest : public testing::Test {
17036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // ...
17037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// };
17038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_F(MyClassTest, MyMethod) {
17040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Can call MyClass::MyMethod() here.
17041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
17042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define FRIEND_TEST(test_case_name, test_name)\
17044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterfriend class test_case_name##_##test_name##_Test
17045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008, Google Inc.
17048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
17049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
17051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
17052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
17053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
17055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
17056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
17057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
17058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
17059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
17060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
17061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
17062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
17063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
17070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
17072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: mheule@google.com (Markus Heule)
17077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <iosfwd>
17083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <vector>
17084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
17086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A copyable object representing the result of a test part (i.e. an
17088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
17089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't inherit from TestPartResult as its destructor is not virtual.
17091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TestPartResult {
17092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The possible outcomes of a test part (i.e. an assertion or an
17094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
17095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  enum Type {
17096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    kSuccess,          // Succeeded.
17097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    kNonFatalFailure,  // Failed but the test can continue.
17098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    kFatalFailure      // Failed and the test should be terminated.
17099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
17100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // C'tor.  TestPartResult does NOT have a default constructor.
17102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Always use this constructor (with parameters) to create a
17103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TestPartResult object.
17104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestPartResult(Type a_type,
17105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                 const char* a_file_name,
17106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                 int a_line_number,
17107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                 const char* a_message)
17108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : type_(a_type),
17109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        file_name_(a_file_name == NULL ? "" : a_file_name),
17110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        line_number_(a_line_number),
17111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        summary_(ExtractSummary(a_message)),
17112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        message_(a_message) {
17113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the outcome of the test part.
17116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Type type() const { return type_; }
17117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the name of the source file where the test part took place, or
17119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NULL if it's unknown.
17120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* file_name() const {
17121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return file_name_.empty() ? NULL : file_name_.c_str();
17122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the line in the source file where the test part took place,
17125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // or -1 if it's unknown.
17126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int line_number() const { return line_number_; }
17127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the summary of the failure message.
17129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* summary() const { return summary_.c_str(); }
17130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the message associated with the test part.
17132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* message() const { return message_.c_str(); }
17133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test part passed.
17135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool passed() const { return type_ == kSuccess; }
17136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test part failed.
17138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool failed() const { return type_ != kSuccess; }
17139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test part non-fatally failed.
17141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
17142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test part fatally failed.
17144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool fatally_failed() const { return type_ == kFatalFailure; }
17145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Type type_;
17148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the summary of the failure message by omitting the stack
17150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // trace in it.
17151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static std::string ExtractSummary(const char* message);
17152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The name of the source file where the test part took place, or
17154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // "" if the source file is unknown.
17155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string file_name_;
17156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The line in the source file where the test part took place, or -1
17157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // if the line number is unknown.
17158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int line_number_;
17159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string summary_;  // The test failure summary.
17160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string message_;  // The test failure message.
17161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Prints a TestPartResult object.
17164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
17165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// An array of TestPartResult objects.
17167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't inherit from TestPartResultArray as its destructor is not
17169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// virtual.
17170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TestPartResultArray {
17171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestPartResultArray() {}
17173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Appends the given TestPartResult to the array.
17175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Append(const TestPartResult& result);
17176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the TestPartResult at the given index (0-based).
17178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestPartResult& GetTestPartResult(int index) const;
17179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the number of TestPartResult objects in the array.
17181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int size() const;
17182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::vector<TestPartResult> array_;
17185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
17187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This interface knows how to report a test part result.
17190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestPartResultReporterInterface {
17191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~TestPartResultReporterInterface() {}
17193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
17195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
17198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
17200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// statement generates new fatal failures. To do so it registers itself as the
17201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// current test part result reporter. Besides checking if fatal failures were
17202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// reported, it only delegates the reporting to the former result reporter.
17203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The original result reporter is restored in the destructor.
17204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
17205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ HasNewFatalFailureHelper
17206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    : public TestPartResultReporterInterface {
17207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  HasNewFatalFailureHelper();
17209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~HasNewFatalFailureHelper();
17210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void ReportTestPartResult(const TestPartResult& result);
17211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
17212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool has_new_fatal_failure_;
17214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestPartResultReporterInterface* original_reporter_;
17215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
17217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
17220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
17222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2008 Google Inc.
17225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All Rights Reserved.
17226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
17228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
17229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
17230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
17232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
17233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
17234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
17235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
17236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
17237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
17238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
17239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
17240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
17247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
17249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan)
17254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header implements typed tests and type-parameterized tests.
17259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Typed (aka type-driven) tests repeat the same test for types in a
17261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// list.  You must know which types you want to test with when writing
17262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// typed tests. Here's how you do it:
17263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if 0
17265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// First, define a fixture class template.  It should be parameterized
17267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by a type.  Remember to derive it from testing::Test.
17268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
17269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FooTest : public testing::Test {
17270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ...
17272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef std::list<T> List;
17273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static T shared_;
17274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  T value_;
17275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Next, associate a list of types with the test case, which will be
17278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// repeated for each type in the list.  The typedef is necessary for
17279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the macro to parse correctly.
17280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef testing::Types<char, int, unsigned int> MyTypes;
17281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE(FooTest, MyTypes);
17282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the type list contains only one type, you can write that type
17284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// directly without Types<...>:
17285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TYPED_TEST_CASE(FooTest, int);
17286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
17288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tests for this test case as you want.
17289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(FooTest, DoesBlah) {
17290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Inside a test, refer to TypeParam to get the type parameter.
17291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Since we are inside a derived class template, C++ requires use to
17292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // visit the members of FooTest via 'this'.
17293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TypeParam n = this->value_;
17294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // To visit static members of the fixture, add the TestFixture::
17296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // prefix.
17297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  n += TestFixture::shared_;
17298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // To refer to typedefs in the fixture, add the "typename
17300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TestFixture::" prefix.
17301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typename TestFixture::List values;
17302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  values.push_back(n);
17303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ...
17304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
17305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST(FooTest, HasPropertyA) { ... }
17307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // 0
17309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Type-parameterized tests are abstract test patterns parameterized
17311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by a type.  Compared with typed tests, type-parameterized tests
17312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// allow you to define the test pattern without knowing what the type
17313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameters are.  The defined pattern can be instantiated with
17314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// different types any number of times, in any number of translation
17315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// units.
17316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If you are designing an interface or concept, you can define a
17318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// suite of type-parameterized tests to verify properties that any
17319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// valid implementation of the interface/concept should have.  Then,
17320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each implementation can easily instantiate the test suite to verify
17321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that it conforms to the requirements, without having to write
17322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// similar tests repeatedly.  Here's an example:
17323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if 0
17325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// First, define a fixture class template.  It should be parameterized
17327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// by a type.  Remember to derive it from testing::Test.
17328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
17329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FooTest : public testing::Test {
17330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ...
17331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Next, declare that you will define a type-parameterized test case
17334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (the _P suffix is for "parameterized" or "pattern", whichever you
17335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// prefer):
17336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_CASE_P(FooTest);
17337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Then, use TYPED_TEST_P() to define as many type-parameterized tests
17339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for this type-parameterized test case as you want.
17340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(FooTest, DoesBlah) {
17341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Inside a test, refer to TypeParam to get the type parameter.
17342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TypeParam n = 0;
17343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ...
17344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
17345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterTYPED_TEST_P(FooTest, HasPropertyA) { ... }
17347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Now the tricky part: you need to register all test patterns before
17349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// you can instantiate them.  The first argument of the macro is the
17350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test case name; the rest are the names of the tests in this test
17351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// case.
17352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterREGISTER_TYPED_TEST_CASE_P(FooTest,
17353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                           DoesBlah, HasPropertyA);
17354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Finally, you are free to instantiate the pattern with the types you
17356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// want.  If you put the above code in a header file, you can #include
17357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it in multiple C++ source files and instantiate it multiple times.
17358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To distinguish different instances of the pattern, the first
17360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// argument to the INSTANTIATE_* macro is a prefix that will be added
17361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to the actual test case name.  Remember to pick unique prefixes for
17362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// different instances.
17363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef testing::Types<char, int, unsigned int> MyTypes;
17364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
17365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the type list contains only one type, you can write that type
17367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// directly without Types<...>:
17368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
17369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // 0
17371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements typed tests.
17374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TYPED_TEST
17376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Expands to the name of the typedef for the type parameters of the
17380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// given test case.
17381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
17382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The 'Types' template argument below must have spaces around it
17384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// since some compilers may choke on '>>' when passing a template
17385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instance (e.g. Types<int>)
17386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define TYPED_TEST_CASE(CaseName, Types) \
17387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::testing::internal::TypeList< Types >::type \
17388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_TYPE_PARAMS_(CaseName)
17389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define TYPED_TEST(CaseName, TestName) \
17391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename gtest_TypeParam_> \
17392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
17393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      : public CaseName<gtest_TypeParam_> { \
17394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private: \
17395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef CaseName<gtest_TypeParam_> TestFixture; \
17396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef gtest_TypeParam_ TypeParam; \
17397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void TestBody(); \
17398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }; \
17399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
17400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::internal::TypeParameterizedTest< \
17401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          CaseName, \
17402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          ::testing::internal::TemplateSel< \
17403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
17404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
17405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              "", #CaseName, #TestName, 0); \
17406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename gtest_TypeParam_> \
17407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
17408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TYPED_TEST
17410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements type-parameterized tests.
17412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_TYPED_TEST_P
17414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Expands to the namespace name that the type-parameterized tests for
17418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the given type-parameterized test case are defined in.  The exact
17419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// name of the namespace is subject to change without notice.
17420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_CASE_NAMESPACE_(TestCaseName) \
17421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  gtest_case_##TestCaseName##_
17422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Expands to the name of the variable used to remember the names of
17426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the defined tests in the given test case.
17427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
17428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  gtest_typed_test_case_p_state_##TestCaseName##_
17429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
17431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Expands to the name of the variable used to remember the names of
17433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the registered tests in the given test case.
17434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
17435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  gtest_registered_test_names_##TestCaseName##_
17436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The variables defined in the type-parameterized test macros are
17438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// static as typically these macros are used in a .h file that can be
17439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// #included in multiple translation units linked together.
17440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define TYPED_TEST_CASE_P(CaseName) \
17441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static ::testing::internal::TypedTestCasePState \
17442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
17443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define TYPED_TEST_P(CaseName, TestName) \
17445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
17446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename gtest_TypeParam_> \
17447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class TestName : public CaseName<gtest_TypeParam_> { \
17448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private: \
17449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef CaseName<gtest_TypeParam_> TestFixture; \
17450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    typedef gtest_TypeParam_ TypeParam; \
17451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    virtual void TestBody(); \
17452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }; \
17453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
17454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
17455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          __FILE__, __LINE__, #CaseName, #TestName); \
17456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } \
17457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename gtest_TypeParam_> \
17458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
17459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
17461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
17462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
17463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } \
17464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
17465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
17466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          __FILE__, __LINE__, #__VA_ARGS__)
17467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The 'Types' template argument below must have spaces around it
17469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// since some compilers may choke on '>>' when passing a template
17470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instance (e.g. Types<int>)
17471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
17472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
17473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::testing::internal::TypeParameterizedTestCase<CaseName, \
17474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
17475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          ::testing::internal::TypeList< Types >::type>::Register(\
17476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
17477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_TYPED_TEST_P
17479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Depending on the platform, different string classes are available.
17483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On Linux, in addition to ::std::string, Google also makes use of
17484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class ::string, which has the same interface as ::std::string, but
17485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// has a different implementation.
17486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
17488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::string is available AND is a distinct type to ::std::string, or
17489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// define it to 0 to indicate otherwise.
17490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the user's ::std::string and ::string are the same class due to
17492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
17493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
17495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// heuristically.
17496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing {
17498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Declares the flags.
17500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag temporary enables the disabled tests.
17502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(also_run_disabled_tests);
17503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag brings the debugger on an assertion failure.
17505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(break_on_failure);
17506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag controls whether Google Test catches all test-thrown exceptions
17508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and logs them as failures.
17509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(catch_exceptions);
17510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag enables using colors in terminal output. Available values are
17512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
17513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to let Google Test decide.
17514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(color);
17515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag sets up the filter to select by name using a glob pattern
17517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the tests to run. If the filter is not given all tests are executed.
17518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(filter);
17519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag causes the Google Test to list tests. None of the tests listed
17521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// are actually run if the flag is provided.
17522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(list_tests);
17523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag controls whether Google Test emits a detailed XML report to a file
17525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in addition to its normal textual output.
17526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(output);
17527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flags control whether Google Test prints the elapsed time for each
17529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test.
17530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(print_time);
17531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag specifies the random number seed.
17533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_int32_(random_seed);
17534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag sets how many times the tests are repeated. The default value
17536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is 1. If the value is -1 the tests are repeating forever.
17537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_int32_(repeat);
17538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag controls whether Google Test includes Google Test internal
17540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// stack frames in failure stack traces.
17541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(show_internal_stack_frames);
17542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When this flag is specified, tests' order is randomized on every iteration.
17544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(shuffle);
17545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This flag specifies the maximum number of stack frames to be
17547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// printed in a failure message.
17548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_int32_(stack_trace_depth);
17549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When this flag is specified, a failed assertion will throw an
17551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// exception if exceptions are enabled, or exit the program with a
17552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// non-zero code otherwise.
17553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(throw_on_failure);
17554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When this flag is set with a "host:port" string, on supported
17556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platforms test results are streamed to the specified port on
17557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the specified host machine.
17558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_string_(stream_result_to);
17559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The upper limit for valid stack trace depths.
17561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst int kMaxStackTraceDepth = 100;
17562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
17564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass AssertHelper;
17566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DefaultGlobalTestPartResultReporter;
17567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass ExecDeathTest;
17568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass NoExecDeathTest;
17569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FinalSuccessChecker;
17570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTestFlagSaver;
17571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass StreamingListenerTest;
17572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestResultAccessor;
17573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestEventListenersAccessor;
17574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestEventRepeater;
17575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UnitTestRecordPropertyTestHelper;
17576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass WindowsDeathTest;
17577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UnitTestImpl* GetUnitTestImpl();
17578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
17579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                    const std::string& message);
17580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
17582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The friend relationship of some of these classes is cyclic.
17584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If we don't forward declare them the compiler might confuse the classes
17585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in friendship clauses with same named classes on the scope.
17586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Test;
17587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestCase;
17588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestInfo;
17589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass UnitTest;
17590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A class for indicating whether an assertion was successful.  When
17592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the assertion wasn't successful, the AssertionResult object
17593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// remembers a non-empty message that describes how it failed.
17594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To create an instance of this class, use one of the factory functions
17596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (AssertionSuccess() and AssertionFailure()).
17597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class is useful for two purposes:
17599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   1. Defining predicate functions to be used with Boolean test assertions
17600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
17601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   2. Defining predicate-format functions to be
17602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
17603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For example, if you define IsEven predicate:
17605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   testing::AssertionResult IsEven(int n) {
17607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     if ((n % 2) == 0)
17608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       return testing::AssertionSuccess();
17609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     else
17610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       return testing::AssertionFailure() << n << " is odd";
17611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
17612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
17614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will print the message
17615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Value of: IsEven(Fib(5))
17617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Actual: false (5 is odd)
17618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Expected: true
17619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instead of a more opaque
17621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Value of: IsEven(Fib(5))
17623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Actual: false
17624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Expected: true
17625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in case IsEven is a simple Boolean predicate.
17627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If you expect your predicate to be reused and want to support informative
17629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
17630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// about half as often as positive ones in our tests), supply messages for
17631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// both success and failure cases:
17632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   testing::AssertionResult IsEven(int n) {
17634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     if ((n % 2) == 0)
17635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       return testing::AssertionSuccess() << n << " is even";
17636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     else
17637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       return testing::AssertionFailure() << n << " is odd";
17638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
17639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
17641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Value of: IsEven(Fib(6))
17643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Actual: true (8 is even)
17644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Expected: false
17645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// NB: Predicates that support negative Boolean assertions have reduced
17647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// performance in positive ones so be careful not to use them in tests
17648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that have lots (tens of thousands) of positive Boolean assertions.
17649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// To use this class with EXPECT_PRED_FORMAT assertions such as:
17651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Verifies that Foo() returns an even number.
17653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_PRED_FORMAT1(IsEven, Foo());
17654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// you need to define:
17656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   testing::AssertionResult IsEven(const char* expr, int n) {
17658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     if ((n % 2) == 0)
17659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       return testing::AssertionSuccess();
17660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     else
17661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       return testing::AssertionFailure()
17662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
17663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
17664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If Foo() returns 5, you will see the following message:
17666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Expected: Foo() is even
17668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Actual: it's 5
17669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ AssertionResult {
17671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Copy constructor.
17673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Used in EXPECT_TRUE/FALSE(assertion_result).
17674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  AssertionResult(const AssertionResult& other);
17675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Used in the EXPECT_TRUE/FALSE(bool_expression).
17676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  explicit AssertionResult(bool success) : success_(success) {}
17677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the assertion succeeded.
17679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  operator bool() const { return success_; }  // NOLINT
17680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
17682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  AssertionResult operator!() const;
17683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the text streamed into this AssertionResult. Test assertions
17685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // use it when they fail (i.e., the predicate's outcome doesn't match the
17686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // assertion's expectation). When nothing has been streamed into the
17687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // object, returns an empty string.
17688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* message() const {
17689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return message_.get() != NULL ?  message_->c_str() : "";
17690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TODO(vladl@google.com): Remove this after making sure no clients use it.
17692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Deprecated; please use message() instead.
17693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* failure_message() const { return message(); }
17694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Streams a custom failure message into this object.
17696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T> AssertionResult& operator<<(const T& value) {
17697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    AppendMessage(Message() << value);
17698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
17699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Allows streaming basic output manipulators such as endl or flush into
17702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // this object.
17703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  AssertionResult& operator<<(
17704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
17705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    AppendMessage(Message() << basic_manipulator);
17706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *this;
17707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Appends the contents of message to message_.
17711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AppendMessage(const Message& a_message) {
17712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (message_.get() == NULL)
17713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      message_.reset(new ::std::string);
17714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    message_->append(a_message.GetString().c_str());
17715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Stores result of the assertion predicate.
17718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool success_;
17719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Stores the message describing the condition in case the expectation
17720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // construct is not satisfied with the predicate's outcome.
17721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Referenced via a pointer to avoid taking too much stack frame space
17722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // with test assertions.
17723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::scoped_ptr< ::std::string> message_;
17724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_ASSIGN_(AssertionResult);
17726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Makes a successful assertion result.
17729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult AssertionSuccess();
17730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Makes a failed assertion result.
17732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult AssertionFailure();
17733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Makes a failed assertion result with the given failure message.
17735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Deprecated; use AssertionFailure() << msg.
17736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult AssertionFailure(const Message& msg);
17737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The abstract class that all tests inherit from.
17739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In Google Test, a unit test program contains one or many TestCases, and
17741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// each TestCase contains one or many Tests.
17742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When you define a test using the TEST macro, you don't need to
17744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// explicitly derive from Test - the TEST macro automatically does
17745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this for you.
17746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The only time you derive from Test is when defining a test fixture
17748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to be used a TEST_F.  For example:
17749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   class FooTest : public testing::Test {
17751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    protected:
17752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     virtual void SetUp() { ... }
17753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     virtual void TearDown() { ... }
17754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     ...
17755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   };
17756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TEST_F(FooTest, Bar) { ... }
17758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TEST_F(FooTest, Baz) { ... }
17759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Test is not copyable.
17761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ Test {
17762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class TestInfo;
17764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Defines types for pointers to functions that set up and tear down
17766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // a test case.
17767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
17768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
17769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The d'tor is virtual as we intend to inherit from Test.
17771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~Test();
17772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets up the stuff shared by all tests in this test case.
17774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Google Test will call Foo::SetUpTestCase() before running the first
17776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test in test case Foo.  Hence a sub-class can define its own
17777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // SetUpTestCase() method to shadow the one defined in the super
17778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // class.
17779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void SetUpTestCase() {}
17780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Tears down the stuff shared by all tests in this test case.
17782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Google Test will call Foo::TearDownTestCase() after running the last
17784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test in test case Foo.  Hence a sub-class can define its own
17785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TearDownTestCase() method to shadow the one defined in the super
17786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // class.
17787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void TearDownTestCase() {}
17788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the current test has a fatal failure.
17790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool HasFatalFailure();
17791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the current test has a non-fatal failure.
17793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool HasNonfatalFailure();
17794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the current test has a (either fatal or
17796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // non-fatal) failure.
17797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
17798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Logs a property for the current test, test case, or for the entire
17800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // invocation of the test program when used outside of the context of a
17801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test case.  Only the last value for a given key is remembered.  These
17802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // are public static so they can be called from utility functions that are
17803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // not members of the test fixture.  Calls to RecordProperty made during
17804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // lifespan of the test (from the moment its constructor starts to the
17805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // moment its destructor finishes) will be output in XML as attributes of
17806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the <testcase> element.  Properties recorded from fixture's
17807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // SetUpTestCase or TearDownTestCase are logged as attributes of the
17808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // corresponding <testsuite> element.  Calls to RecordProperty made in the
17809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // global context (before or after invocation of RUN_ALL_TESTS and from
17810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // SetUp/TearDown method of Environment objects registered with Google
17811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Test) will be output as attributes of the <testsuites> element.
17812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void RecordProperty(const std::string& key, const std::string& value);
17813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void RecordProperty(const std::string& key, int value);
17814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter protected:
17816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates a Test object.
17817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Test();
17818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets up the test fixture.
17820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void SetUp();
17821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Tears down the test fixture.
17823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void TearDown();
17824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the current test has the same fixture class as
17827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the first test in the current test case.
17828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool HasSameFixtureClass();
17829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Runs the test after the test fixture has been set up.
17831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A sub-class must implement this to define the test logic.
17833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
17835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Instead, use the TEST or TEST_F macro.
17836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void TestBody() = 0;
17837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets up, executes, and tears down the test.
17839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Run();
17840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Deletes self.  We deliberately pick an unusual name for this
17842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // internal method to avoid clashing with names used in user TESTs.
17843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void DeleteSelf_() { delete this; }
17844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Uses a GTestFlagSaver to save and restore all Google Test flags.
17846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::GTestFlagSaver* const gtest_flag_saver_;
17847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Often a user mis-spells SetUp() as Setup() and spends a long time
17849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // wondering why it is never called by Google Test.  The declaration of
17850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the following method is solely for catching such an error at
17851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // compile time:
17852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   - The return type is deliberately chosen to be not void, so it
17854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   will be a conflict if a user declares void Setup() in his test
17855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   fixture.
17856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   - This method is private, so it will be another compiler error
17858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   if a user calls it from his test fixture.
17859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // DO NOT OVERRIDE THIS FUNCTION.
17861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
17862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // If you see an error about overriding the following function or
17863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // about it being private, you have mis-spelled SetUp() as Setup().
17864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  struct Setup_should_be_spelled_SetUp {};
17865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
17866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We disallow copying Tests.
17868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
17869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertypedef internal::TimeInMillis TimeInMillis;
17872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A copyable object representing a user specified test property which can be
17874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// output as a key/value string pair.
17875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't inherit from TestProperty as its destructor is not virtual.
17877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestProperty {
17878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // C'tor.  TestProperty does NOT have a default constructor.
17880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Always use this constructor (with parameters) to create a
17881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TestProperty object.
17882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestProperty(const std::string& a_key, const std::string& a_value) :
17883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    key_(a_key), value_(a_value) {
17884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the user supplied key.
17887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* key() const {
17888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return key_.c_str();
17889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the user supplied value.
17892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* value() const {
17893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return value_.c_str();
17894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets a new value, overriding the one supplied in the constructor.
17897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void SetValue(const std::string& new_value) {
17898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    value_ = new_value;
17899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The key supplied by the user.
17903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string key_;
17904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The value supplied by the user.
17905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string value_;
17906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
17907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The result of a single Test.  This includes a list of
17909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestPartResults, a list of TestProperties, a count of how many
17910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// death tests there are in the Test, and how much time it took to run
17911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the Test.
17912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
17913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestResult is not copyable.
17914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TestResult {
17915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
17916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates an empty TestResult.
17917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestResult();
17918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // D'tor.  Do not inherit from TestResult.
17920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~TestResult();
17921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of all test parts.  This is the sum of the number
17923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // of successful test parts and the number of failed test parts.
17924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int total_part_count() const;
17925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the number of the test properties.
17927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int test_property_count() const;
17928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test passed (i.e. no test part failed).
17930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool Passed() const { return !Failed(); }
17931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test failed.
17933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool Failed() const;
17934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test fatally failed.
17936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool HasFatalFailure() const;
17937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test has a non-fatal failure.
17939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool HasNonfatalFailure() const;
17940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the elapsed time, in milliseconds.
17942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TimeInMillis elapsed_time() const { return elapsed_time_; }
17943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the i-th test part result among all the results. i can range
17945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // from 0 to test_property_count() - 1. If i is not in that range, aborts
17946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the program.
17947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestPartResult& GetTestPartResult(int i) const;
17948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the i-th test property. i can range from 0 to
17950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test_property_count() - 1. If i is not in that range, aborts the
17951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // program.
17952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestProperty& GetTestProperty(int i) const;
17953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
17955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class TestInfo;
17956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class TestCase;
17957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class UnitTest;
17958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::DefaultGlobalTestPartResultReporter;
17959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::ExecDeathTest;
17960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::TestResultAccessor;
17961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::UnitTestImpl;
17962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::WindowsDeathTest;
17963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the vector of TestPartResults.
17965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::vector<TestPartResult>& test_part_results() const {
17966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_part_results_;
17967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the vector of TestProperties.
17970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::vector<TestProperty>& test_properties() const {
17971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_properties_;
17972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
17973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets the elapsed time.
17975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
17976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds a test property to the list. The property is validated and may add
17978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
17979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // key names). If a property is already recorded for the same key, the
17980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // value will be updated, rather than storing multiple values for the same
17981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // key.  xml_element specifies the element for which the property is being
17982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // recorded and is used for validation.
17983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void RecordProperty(const std::string& xml_element,
17984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      const TestProperty& test_property);
17985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds a failure if the key is a reserved attribute of Google Test
17987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // testcase tags.  Returns true if the property is valid.
17988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TODO(russr): Validate attribute names are legal and human readable.
17989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool ValidateTestProperty(const std::string& xml_element,
17990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                   const TestProperty& test_property);
17991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds a test part result to the list.
17993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AddTestPartResult(const TestPartResult& test_part_result);
17994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the death test count.
17996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int death_test_count() const { return death_test_count_; }
17997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
17998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Increments the death test count, returning the new count.
17999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int increment_death_test_count() { return ++death_test_count_; }
18000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Clears the test part results.
18002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void ClearTestPartResults();
18003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Clears the object.
18005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Clear();
18006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Protects mutable state of the property vector and of owned
18008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // properties, whose values may be updated.
18009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::Mutex test_properites_mutex_;
18010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The vector of TestPartResults
18012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::vector<TestPartResult> test_part_results_;
18013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The vector of TestProperties
18014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::vector<TestProperty> test_properties_;
18015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Running count of death tests.
18016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int death_test_count_;
18017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The elapsed time, in milliseconds.
18018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TimeInMillis elapsed_time_;
18019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We disallow copying TestResult.
18021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
18022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};  // class TestResult
18023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A TestInfo object stores the following information about a test:
18025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Test case name
18027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Test name
18028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Whether the test should be run
18029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   A function pointer that creates the test object when invoked
18030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Test result
18031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The constructor of TestInfo registers itself with the UnitTest
18033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// singleton such that the RUN_ALL_TESTS() macro knows which tests to
18034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// run.
18035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TestInfo {
18036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Destructs a TestInfo object.  This function is not virtual, so
18038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // don't inherit from TestInfo.
18039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~TestInfo();
18040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the test case name.
18042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* test_case_name() const { return test_case_name_.c_str(); }
18043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the test name.
18045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* name() const { return name_.c_str(); }
18046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the name of the parameter type, or NULL if this is not a typed
18048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // or a type-parameterized test.
18049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* type_param() const {
18050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (type_param_.get() != NULL)
18051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return type_param_->c_str();
18052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return NULL;
18053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the text representation of the value parameter, or NULL if this
18056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // is not a value-parameterized test.
18057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* value_param() const {
18058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (value_param_.get() != NULL)
18059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return value_param_->c_str();
18060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return NULL;
18061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if this test should run, that is if the test is not
18064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // disabled (or it is disabled but the also_run_disabled_tests flag has
18065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // been specified) and its full name matches the user-specified filter.
18066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Google Test allows the user to filter the tests by their full names.
18068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The full name of a test Bar in test case Foo is defined as
18069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // "Foo.Bar".  Only the tests that match the filter will run.
18070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // A filter is a colon-separated list of glob (not regex) patterns,
18072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // optionally followed by a '-' and a colon-separated list of
18073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // negative patterns (tests to exclude).  A test is run if it
18074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // matches one of the positive patterns and does not match any of
18075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the negative patterns.
18076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // For example, *A*:Foo.* is a filter that matches any string that
18078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // contains the character 'A' or starts with "Foo.".
18079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool should_run() const { return should_run_; }
18080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff this test will appear in the XML report.
18082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool is_reportable() const {
18083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // For now, the XML report includes all tests matching the filter.
18084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // In the future, we may trim tests that are excluded because of
18085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // sharding.
18086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return matches_filter_;
18087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the result of the test.
18090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestResult* result() const { return &result_; }
18091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
18093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST
18094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::DefaultDeathTestFactory;
18095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_DEATH_TEST
18096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class Test;
18097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class TestCase;
18098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::UnitTestImpl;
18099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::StreamingListenerTest;
18100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend TestInfo* internal::MakeAndRegisterTestInfo(
18101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* test_case_name,
18102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* name,
18103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* type_param,
18104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* value_param,
18105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      internal::TypeId fixture_class_id,
18106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Test::SetUpTestCaseFunc set_up_tc,
18107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Test::TearDownTestCaseFunc tear_down_tc,
18108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      internal::TestFactoryBase* factory);
18109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructs a TestInfo object. The newly constructed instance assumes
18111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ownership of the factory object.
18112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestInfo(const std::string& test_case_name,
18113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           const std::string& name,
18114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           const char* a_type_param,   // NULL if not a type-parameterized test
18115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           const char* a_value_param,  // NULL if not a value-parameterized test
18116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           internal::TypeId fixture_class_id,
18117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           internal::TestFactoryBase* factory);
18118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Increments the number of death tests encountered in this test so
18120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // far.
18121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int increment_death_test_count() {
18122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return result_.increment_death_test_count();
18123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates the test object, runs it, records its result, and then
18126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // deletes it.
18127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Run();
18128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void ClearTestResult(TestInfo* test_info) {
18130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    test_info->result_.Clear();
18131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // These fields are immutable properties of the test.
18134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::string test_case_name_;     // Test case name
18135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::string name_;               // Test name
18136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Name of the parameter type, or NULL if this is not a typed or a
18137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // type-parameterized test.
18138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::scoped_ptr<const ::std::string> type_param_;
18139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Text representation of the value parameter, or NULL if this is not a
18140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // value-parameterized test.
18141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::scoped_ptr<const ::std::string> value_param_;
18142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
18143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool should_run_;                 // True iff this test should run
18144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool is_disabled_;                // True iff this test is disabled
18145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool matches_filter_;             // True if this test matches the
18146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                    // user-specified filter.
18147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::TestFactoryBase* const factory_;  // The factory that creates
18148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              // the test object
18149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This field is mutable and needs to be reset before running the
18151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // test for the second time.
18152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestResult result_;
18153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
18155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A test case, which consists of a vector of TestInfos.
18158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestCase is not copyable.
18160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TestCase {
18161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates a TestCase with the given name.
18163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TestCase does NOT have a default constructor.  Always use this
18165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // constructor to create a TestCase object.
18166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Arguments:
18168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   name:         name of the test case
18170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   a_type_param: the name of the test's type parameter, or NULL if
18171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //                 this is not a type-parameterized test.
18172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   set_up_tc:    pointer to the function that sets up the test case
18173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //   tear_down_tc: pointer to the function that tears down the test case
18174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestCase(const char* name, const char* a_type_param,
18175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           Test::SetUpTestCaseFunc set_up_tc,
18176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter           Test::TearDownTestCaseFunc tear_down_tc);
18177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Destructor of TestCase.
18179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~TestCase();
18180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the name of the TestCase.
18182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* name() const { return name_.c_str(); }
18183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the name of the parameter type, or NULL if this is not a
18185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // type-parameterized test case.
18186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* type_param() const {
18187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    if (type_param_.get() != NULL)
18188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return type_param_->c_str();
18189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return NULL;
18190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if any test in this test case should run.
18193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool should_run() const { return should_run_; }
18194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of successful tests in this test case.
18196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int successful_test_count() const;
18197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of failed tests in this test case.
18199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int failed_test_count() const;
18200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of disabled tests that will be reported in the XML report.
18202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int reportable_disabled_test_count() const;
18203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of disabled tests in this test case.
18205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int disabled_test_count() const;
18206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of tests to be printed in the XML report.
18208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int reportable_test_count() const;
18209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Get the number of tests in this test case that should run.
18211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int test_to_run_count() const;
18212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of all tests in this test case.
18214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int total_test_count() const;
18215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test case passed.
18217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool Passed() const { return !Failed(); }
18218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test case failed.
18220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool Failed() const { return failed_test_count() > 0; }
18221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the elapsed time, in milliseconds.
18223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TimeInMillis elapsed_time() const { return elapsed_time_; }
18224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the i-th test among all the tests. i can range from 0 to
18226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // total_test_count() - 1. If i is not in that range, returns NULL.
18227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestInfo* GetTestInfo(int i) const;
18228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the TestResult that holds test properties recorded during
18230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // execution of SetUpTestCase and TearDownTestCase.
18231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
18232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
18234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class Test;
18235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::UnitTestImpl;
18236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the (mutable) vector of TestInfos in this TestCase.
18238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
18239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the (immutable) vector of TestInfos in this TestCase.
18241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const std::vector<TestInfo*>& test_info_list() const {
18242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info_list_;
18243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the i-th test among all the tests. i can range from 0 to
18246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // total_test_count() - 1. If i is not in that range, returns NULL.
18247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestInfo* GetMutableTestInfo(int i);
18248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets the should_run member.
18250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void set_should_run(bool should) { should_run_ = should; }
18251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
18253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // destruction of the TestCase object.
18254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AddTestInfo(TestInfo * test_info);
18255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Clears the results of all tests in this test case.
18257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void ClearResult();
18258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Clears the results of all tests in the given test case.
18260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void ClearTestCaseResult(TestCase* test_case) {
18261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    test_case->ClearResult();
18262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Runs every test in this TestCase.
18265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Run();
18266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
18268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // for catching exceptions thrown from SetUpTestCase().
18269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void RunSetUpTestCase() { (*set_up_tc_)(); }
18270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Runs TearDownTestCase() for this TestCase.  This wrapper is
18272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // needed for catching exceptions thrown from TearDownTestCase().
18273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void RunTearDownTestCase() { (*tear_down_tc_)(); }
18274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff test passed.
18276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool TestPassed(const TestInfo* test_info) {
18277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info->should_run() && test_info->result()->Passed();
18278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff test failed.
18281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool TestFailed(const TestInfo* test_info) {
18282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info->should_run() && test_info->result()->Failed();
18283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the test is disabled and will be reported in the XML
18286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // report.
18287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool TestReportableDisabled(const TestInfo* test_info) {
18288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info->is_reportable() && test_info->is_disabled_;
18289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff test is disabled.
18292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool TestDisabled(const TestInfo* test_info) {
18293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info->is_disabled_;
18294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff this test will appear in the XML report.
18297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool TestReportable(const TestInfo* test_info) {
18298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info->is_reportable();
18299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true if the given test should run.
18302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static bool ShouldRunTest(const TestInfo* test_info) {
18303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return test_info->should_run();
18304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Shuffles the tests in this test case.
18307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void ShuffleTests(internal::Random* random);
18308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Restores the test order to before the first shuffle.
18310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void UnshuffleTests();
18311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Name of the test case.
18313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::string name_;
18314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Name of the parameter type, or NULL if this is not a typed or a
18315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // type-parameterized test.
18316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::scoped_ptr<const ::std::string> type_param_;
18317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The vector of TestInfos in their original order.  It owns the
18318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // elements in the vector.
18319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::vector<TestInfo*> test_info_list_;
18320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Provides a level of indirection for the test list to allow easy
18321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // shuffling and restoring the test order.  The i-th element in this
18322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // vector is the index of the i-th test in the shuffled test list.
18323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  std::vector<int> test_indices_;
18324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Pointer to the function that sets up the test case.
18325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Test::SetUpTestCaseFunc set_up_tc_;
18326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Pointer to the function that tears down the test case.
18327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Test::TearDownTestCaseFunc tear_down_tc_;
18328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // True iff any test in this test case should run.
18329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool should_run_;
18330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Elapsed time, in milliseconds.
18331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TimeInMillis elapsed_time_;
18332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Holds test properties recorded during execution of SetUpTestCase and
18333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TearDownTestCase.
18334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestResult ad_hoc_test_result_;
18335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We disallow copying TestCases.
18337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
18338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// An Environment object is capable of setting up and tearing down an
18341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// environment.  The user should subclass this to define his own
18342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// environment(s).
18343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// An Environment object does the set-up and tear-down in virtual
18345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// methods SetUp() and TearDown() instead of the constructor and the
18346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// destructor, as:
18347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   1. You cannot safely throw from a destructor.  This is a problem
18349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      as in some cases Google Test is used where exceptions are enabled, and
18350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      we may want to implement ASSERT_* using exceptions where they are
18351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      available.
18352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   2. You cannot use ASSERT_* directly in a constructor or
18353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//      destructor.
18354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass Environment {
18355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The d'tor is virtual as we need to subclass Environment.
18357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~Environment() {}
18358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Override this to define how to set up the environment.
18360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void SetUp() {}
18361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Override this to define how to tear down the environment.
18363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void TearDown() {}
18364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
18365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // If you see an error about overriding the following function or
18366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // about it being private, you have mis-spelled SetUp() as Setup().
18367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  struct Setup_should_be_spelled_SetUp {};
18368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
18369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The interface for tracing execution of tests. The methods are organized in
18372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the order the corresponding events are fired.
18373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestEventListener {
18374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~TestEventListener() {}
18376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired before any test activity starts.
18378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
18379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired before each iteration of tests starts.  There may be more than
18381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
18382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // index, starting from 0.
18383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestIterationStart(const UnitTest& unit_test,
18384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                    int iteration) = 0;
18385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired before environment set-up for each iteration of tests starts.
18387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
18388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after environment set-up for each iteration of tests ends.
18390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
18391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired before the test case starts.
18393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
18394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired before the test starts.
18396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestStart(const TestInfo& test_info) = 0;
18397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after a failed assertion or a SUCCEED() invocation.
18399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
18400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after the test ends.
18402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestEnd(const TestInfo& test_info) = 0;
18403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after the test case ends.
18405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
18406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired before environment tear-down for each iteration of tests starts.
18408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
18409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after environment tear-down for each iteration of tests ends.
18411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
18412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after each iteration of tests finishes.
18414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestIterationEnd(const UnitTest& unit_test,
18415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  int iteration) = 0;
18416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Fired after all test activities have ended.
18418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
18419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The convenience class for users who need to override just one or two
18422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// methods and are not concerned that a possible change to a signature of
18423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the methods they override will not be caught during the build.  For
18424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// comments about each method please see the definition of TestEventListener
18425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// above.
18426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass EmptyTestEventListener : public TestEventListener {
18427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
18429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
18430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                    int /*iteration*/) {}
18431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
18432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
18433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
18434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
18435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
18436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
18437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
18438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
18439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
18440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
18441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  int /*iteration*/) {}
18442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
18443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestEventListeners lets users add listeners to track events in Google Test.
18446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ TestEventListeners {
18447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListeners();
18449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~TestEventListeners();
18450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Appends an event listener to the end of the list. Google Test assumes
18452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the ownership of the listener (i.e. it will delete the listener when
18453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the test program finishes).
18454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void Append(TestEventListener* listener);
18455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Removes the given event listener from the list and returns it.  It then
18457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // becomes the caller's responsibility to delete the listener. Returns
18458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NULL if the listener is not found in the list.
18459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListener* Release(TestEventListener* listener);
18460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the standard listener responsible for the default console
18462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // output.  Can be removed from the listeners list to shut down default
18463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // console output.  Note that removing this object from the listener list
18464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // with Release transfers its ownership to the caller and makes this
18465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // function return NULL the next time.
18466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListener* default_result_printer() const {
18467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return default_result_printer_;
18468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the standard listener responsible for the default XML output
18471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // controlled by the --gtest_output=xml flag.  Can be removed from the
18472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // listeners list by users who want to shut down the default XML output
18473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // controlled by this flag and substitute it with custom one.  Note that
18474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // removing this object from the listener list with Release transfers its
18475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // ownership to the caller and makes this function return NULL the next
18476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // time.
18477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListener* default_xml_generator() const {
18478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return default_xml_generator_;
18479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
18482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class TestCase;
18483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class TestInfo;
18484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::DefaultGlobalTestPartResultReporter;
18485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::NoExecDeathTest;
18486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::TestEventListenersAccessor;
18487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::UnitTestImpl;
18488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns repeater that broadcasts the TestEventListener events to all
18490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // subscribers.
18491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListener* repeater();
18492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets the default_result_printer attribute to the provided listener.
18494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The listener is also added to the listener list and previous
18495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // default_result_printer is removed from it and deleted. The listener can
18496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // also be NULL in which case it will not be added to the list. Does
18497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // nothing if the previous and the current listener objects are the same.
18498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void SetDefaultResultPrinter(TestEventListener* listener);
18499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets the default_xml_generator attribute to the provided listener.  The
18501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // listener is also added to the listener list and previous
18502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // default_xml_generator is removed from it and deleted. The listener can
18503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // also be NULL in which case it will not be added to the list. Does
18504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // nothing if the previous and the current listener objects are the same.
18505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void SetDefaultXmlGenerator(TestEventListener* listener);
18506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Controls whether events will be forwarded by the repeater to the
18508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // listeners in the list.
18509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool EventForwardingEnabled() const;
18510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void SuppressEventForwarding();
18511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The actual list of listeners.
18513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::TestEventRepeater* repeater_;
18514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Listener responsible for the standard result output.
18515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListener* default_result_printer_;
18516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Listener responsible for the creation of the XML output file.
18517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListener* default_xml_generator_;
18518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We disallow copying TestEventListeners.
18520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
18521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A UnitTest consists of a vector of TestCases.
18524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is a singleton class.  The only instance of UnitTest is
18526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// created when UnitTest::GetInstance() is first called.  This
18527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instance is never deleted.
18528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UnitTest is not copyable.
18530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class is thread-safe as long as the methods are called
18532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// according to their specification.
18533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ UnitTest {
18534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the singleton UnitTest object.  The first time this method
18536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // is called, a UnitTest object is constructed and returned.
18537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Consecutive calls will return the same object.
18538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static UnitTest* GetInstance();
18539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Runs all tests in this UnitTest object and prints the result.
18541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns 0 if successful, or 1 otherwise.
18542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This method can only be called from the main thread.
18544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int Run() GTEST_MUST_USE_RESULT_;
18547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the working directory when the first TEST() or TEST_F()
18549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // was executed.  The UnitTest object owns the string.
18550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const char* original_working_dir() const;
18551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the TestCase object for the test that's currently running,
18553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // or NULL if no test is running.
18554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestCase* current_test_case() const
18555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(mutex_);
18556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the TestInfo object for the test that's currently running,
18558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // or NULL if no test is running.
18559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestInfo* current_test_info() const
18560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(mutex_);
18561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the random seed used at the start of the current test run.
18563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int random_seed() const;
18564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
18566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the ParameterizedTestCaseRegistry object used to keep track of
18567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // value-parameterized tests and instantiate and register them.
18568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
18571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(mutex_);
18572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
18573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of successful test cases.
18575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int successful_test_case_count() const;
18576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of failed test cases.
18578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int failed_test_case_count() const;
18579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of all test cases.
18581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int total_test_case_count() const;
18582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of all test cases that contain at least one test
18584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // that should run.
18585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int test_case_to_run_count() const;
18586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of successful tests.
18588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int successful_test_count() const;
18589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of failed tests.
18591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int failed_test_count() const;
18592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of disabled tests that will be reported in the XML report.
18594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int reportable_disabled_test_count() const;
18595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of disabled tests.
18597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int disabled_test_count() const;
18598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of tests to be printed in the XML report.
18600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int reportable_test_count() const;
18601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of all tests.
18603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int total_test_count() const;
18604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the number of tests that should run.
18606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  int test_to_run_count() const;
18607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the time of the test program start, in ms from the start of the
18609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // UNIX epoch.
18610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TimeInMillis start_timestamp() const;
18611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the elapsed time, in milliseconds.
18613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TimeInMillis elapsed_time() const;
18614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the unit test passed (i.e. all test cases passed).
18616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool Passed() const;
18617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns true iff the unit test failed (i.e. some test case failed
18619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // or something outside of all tests failed).
18620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  bool Failed() const;
18621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the i-th test case among all the test cases. i can range from 0 to
18623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // total_test_case_count() - 1. If i is not in that range, returns NULL.
18624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestCase* GetTestCase(int i) const;
18625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the TestResult containing information on test failures and
18627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // properties logged outside of individual test cases.
18628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const TestResult& ad_hoc_test_result() const;
18629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Returns the list of event listeners that can be used to track events
18631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // inside Google Test.
18632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestEventListeners& listeners();
18633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
18635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Registers and returns a global test environment.  When a test
18636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // program is run, all global test environments will be set-up in
18637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the order they were registered.  After all tests in the program
18638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // have finished, all global test environments will be torn-down in
18639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the *reverse* order they were registered.
18640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The UnitTest object takes ownership of the given environment.
18642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This method can only be called from the main thread.
18644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  Environment* AddEnvironment(Environment* env);
18645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds a TestPartResult to the current TestResult object.  All
18647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
18648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // eventually call this to report their results.  The user code
18649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // should use the assertion macros instead of calling this directly.
18650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void AddTestPartResult(TestPartResult::Type result_type,
18651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                         const char* file_name,
18652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                         int line_number,
18653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                         const std::string& message,
18654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                         const std::string& os_stack_trace)
18655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(mutex_);
18656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Adds a TestProperty to the current TestResult object when invoked from
18658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
18659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // from SetUpTestCase or TearDownTestCase, or to the global property set
18660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // when invoked elsewhere.  If the result already contains a property with
18661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the same key, the value will be updated.
18662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void RecordProperty(const std::string& key, const std::string& value);
18663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Gets the i-th test case among all the test cases. i can range from 0 to
18665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // total_test_case_count() - 1. If i is not in that range, returns NULL.
18666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  TestCase* GetMutableTestCase(int i);
18667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Accessors for the implementation object.
18669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::UnitTestImpl* impl() { return impl_; }
18670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const internal::UnitTestImpl* impl() const { return impl_; }
18671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // These classes and funcions are friends as they need to access private
18673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // members of UnitTest.
18674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class Test;
18675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::AssertHelper;
18676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::ScopedTrace;
18677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::StreamingListenerTest;
18678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend class internal::UnitTestRecordPropertyTestHelper;
18679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend Environment* AddGlobalTestEnvironment(Environment* env);
18680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
18681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  friend void internal::ReportFailureInUnknownLocation(
18682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      TestPartResult::Type result_type,
18683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const std::string& message);
18684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Creates an empty UnitTest.
18686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  UnitTest();
18687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // D'tor
18689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~UnitTest();
18690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
18692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Google Test trace stack.
18693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void PushGTestTrace(const internal::TraceInfo& trace)
18694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(mutex_);
18695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Pops a trace from the per-thread Google Test trace stack.
18697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void PopGTestTrace()
18698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      GTEST_LOCK_EXCLUDED_(mutex_);
18699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Protects mutable state in *impl_.  This is mutable as some const
18701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // methods need to lock it too.
18702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  mutable internal::Mutex mutex_;
18703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Opaque implementation object.  This field is never changed once
18705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // the object is constructed.  We don't mark it as const here, as
18706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // doing so will cause a warning in the constructor of UnitTest.
18707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Mutable state in *impl_ is protected by mutex_.
18708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  internal::UnitTestImpl* impl_;
18709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We disallow copying UnitTest.
18711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
18712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A convenient wrapper for adding an environment for the test
18715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// program.
18716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// You should call this before RUN_ALL_TESTS() is called, probably in
18718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// main().  If you use gtest_main, you need to call this before main()
18719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// starts for it to take effect.  For example, you can define a global
18720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// variable like this:
18721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   testing::Environment* const foo_env =
18723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//       testing::AddGlobalTestEnvironment(new FooEnvironment);
18724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// However, we strongly recommend you to write your own main() and
18726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// call AddGlobalTestEnvironment() there, as relying on initialization
18727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of global variables makes the code harder to read and may cause
18728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// problems when you register multiple environments from different
18729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// translation units and the environments have dependencies among them
18730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (remember that the compiler doesn't guarantee the order in which
18731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// global variables from different translation units are initialized).
18732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline Environment* AddGlobalTestEnvironment(Environment* env) {
18733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return UnitTest::GetInstance()->AddEnvironment(env);
18734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
18735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Initializes Google Test.  This must be called before calling
18737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// RUN_ALL_TESTS().  In particular, it parses a command line for the
18738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// flags that Google Test recognizes.  Whenever a Google Test flag is
18739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// seen, it is removed from argv, and *argc is decremented.
18740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// No value is returned.  Instead, the Google Test flag variables are
18742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// updated.
18743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Calling the function for the second time has no user-visible effect.
18745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void InitGoogleTest(int* argc, char** argv);
18746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This overloaded version can be used in Windows programs compiled in
18748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UNICODE mode.
18749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
18750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
18752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
18754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value of type ToPrint that is an operand of a comparison assertion
18755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
18756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the comparison, and is used to help determine the best way to
18757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// format the value.  In particular, when the value is a C string
18758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (char pointer) and the other operand is an STL string object, we
18759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// want to format the C string as a string, since we know it is
18760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// compared by value with the string object.  If the value is a char
18761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// pointer but the other operand is not an STL string object, we don't
18762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// know whether the pointer is supposed to point to a NUL-terminated
18763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// string, and thus want to print it as a pointer to be safe.
18764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The default case.
18768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename ToPrint, typename OtherOperand>
18769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FormatForComparison {
18770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static ::std::string Format(const ToPrint& value) {
18772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return ::testing::PrintToString(value);
18773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Array.
18777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename ToPrint, size_t N, typename OtherOperand>
18778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass FormatForComparison<ToPrint[N], OtherOperand> {
18779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static ::std::string Format(const ToPrint* value) {
18781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
18782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// By default, print C string as pointers to be safe, as we don't know
18786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// whether they actually point to a NUL-terminated string.
18787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
18789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename OtherOperand>                                      \
18790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class FormatForComparison<CharType*, OtherOperand> {                  \
18791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:                                                              \
18792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    static ::std::string Format(CharType* value) {                      \
18793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return ::testing::PrintToString(static_cast<const void*>(value)); \
18794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }                                                                   \
18795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
18798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
18799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
18800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
18801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
18803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If a C string is compared with an STL string object, we know it's meant
18805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to point to a NUL-terminated string, and thus can print it as a string.
18806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
18808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <>                                                           \
18809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  class FormatForComparison<CharType*, OtherStringType> {               \
18810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   public:                                                              \
18811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    static ::std::string Format(CharType* value) {                      \
18812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      return ::testing::PrintToString(value);                           \
18813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    }                                                                   \
18814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
18817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
18818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_STRING
18820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
18821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
18822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
18823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_GLOBAL_WSTRING
18825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
18826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
18827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
18828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STD_WSTRING
18830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
18831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
18832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
18833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
18835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
18837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// operand to be used in a failure message.  The type (but not value)
18838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of the other operand may affect the format.  This allows us to
18839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// print a char* as a raw pointer when it is compared against another
18840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// char* or void*, and print it as a C string when it is compared
18841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// against an std::string object, for example.
18842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
18845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstd::string FormatForComparisonFailureMessage(
18846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const T1& value, const T2& /* other_operand */) {
18847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return FormatForComparison<T1, T2>::Format(value);
18848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
18849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The helper function for {ASSERT|EXPECT}_EQ.
18851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
18852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult CmpHelperEQ(const char* expected_expression,
18853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            const char* actual_expression,
18854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            const T1& expected,
18855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            const T2& actual) {
18856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
18857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(push)          // Saves the current warning state.
18858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(disable:4389)  // Temporarily disables warning on
18859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                // signed/unsigned mismatch.
18860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
18861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (expected == actual) {
18863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return AssertionSuccess();
18864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifdef _MSC_VER
18867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# pragma warning(pop)          // Restores the warning state.
18868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
18869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return EqFailure(expected_expression,
18871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   actual_expression,
18872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   FormatForComparisonFailureMessage(expected, actual),
18873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   FormatForComparisonFailureMessage(actual, expected),
18874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   false);
18875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
18876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// With this overloaded version, we allow anonymous enums to be used
18878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
18879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can be implicitly cast to BiggestInt.
18880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
18881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                       const char* actual_expression,
18882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                       BiggestInt expected,
18883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                       BiggestInt actual);
18884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
18886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
18887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is a null pointer literal.  The following default implementation is
18888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// for lhs_is_null_literal being false.
18889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <bool lhs_is_null_literal>
18890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass EqHelper {
18891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This templatized version is for the general case.
18893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2>
18894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static AssertionResult Compare(const char* expected_expression,
18895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                 const char* actual_expression,
18896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                 const T1& expected,
18897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                 const T2& actual) {
18898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CmpHelperEQ(expected_expression, actual_expression, expected,
18899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       actual);
18900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // With this overloaded version, we allow anonymous enums to be used
18903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
18904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // enums can be implicitly cast to BiggestInt.
18905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  //
18906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Even though its body looks the same as the above version, we
18907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // cannot merge the two, as it will make anonymous enums unhappy.
18908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static AssertionResult Compare(const char* expected_expression,
18909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                 const char* actual_expression,
18910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                 BiggestInt expected,
18911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                 BiggestInt actual) {
18912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CmpHelperEQ(expected_expression, actual_expression, expected,
18913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       actual);
18914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This specialization is used when the first argument to ASSERT_EQ()
18918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is a null pointer literal, like NULL, false, or 0.
18919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <>
18920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass EqHelper<true> {
18921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
18922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We define two overloaded versions of Compare().  The first
18923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // version will be picked when the second argument to ASSERT_EQ() is
18924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
18925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // EXPECT_EQ(false, a_bool).
18926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T1, typename T2>
18927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static AssertionResult Compare(
18928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* expected_expression,
18929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* actual_expression,
18930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const T1& expected,
18931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const T2& actual,
18932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // The following line prevents this overload from being considered if T2
18933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
18934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
18935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // to match the Secret* in the other overload, which would otherwise make
18936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // this template match better.
18937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
18938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CmpHelperEQ(expected_expression, actual_expression, expected,
18939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       actual);
18940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // This version will be picked when the second argument to ASSERT_EQ() is a
18943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
18944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <typename T>
18945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static AssertionResult Compare(
18946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* expected_expression,
18947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      const char* actual_expression,
18948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // We used to have a second template parameter instead of Secret*.  That
18949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // template parameter would deduce to 'long', making this a better match
18950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // than the first overload even without the first overload's EnableIf.
18951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
18952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // non-pointer argument" (even a deduced integral argument), so the old
18953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      // implementation caused warnings in user code.
18954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      Secret* /* expected (NULL) */,
18955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter      T* actual) {
18956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    // We already know that 'expected' is a null pointer.
18957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return CmpHelperEQ(expected_expression, actual_expression,
18958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                       static_cast<T*>(NULL), actual);
18959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
18960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
18961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A macro for implementing the helper functions needed to implement
18963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
18964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of similar code.
18965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For each templatized helper function, we also define an overloaded
18967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// version for BiggestInt in order to reduce code bloat and allow
18968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
18969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// with gcc 4.
18970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
18971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
18973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>\
18974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
18975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                   const T1& val1, const T2& val2) {\
18976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (val1 op val2) {\
18977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return AssertionSuccess();\
18978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  } else {\
18979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return AssertionFailure() \
18980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        << "Expected: (" << expr1 << ") " #op " (" << expr2\
18981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
18982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
18983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }\
18984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}\
18985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelper##op_name(\
18986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
18987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
18990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements the helper function for {ASSERT|EXPECT}_NE
18991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_CMP_HELPER_(NE, !=);
18992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements the helper function for {ASSERT|EXPECT}_LE
18993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_CMP_HELPER_(LE, <=);
18994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements the helper function for {ASSERT|EXPECT}_LT
18995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_CMP_HELPER_(LT, <);
18996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements the helper function for {ASSERT|EXPECT}_GE
18997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_CMP_HELPER_(GE, >=);
18998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements the helper function for {ASSERT|EXPECT}_GT
18999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_IMPL_CMP_HELPER_(GT, >);
19000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#undef GTEST_IMPL_CMP_HELPER_
19002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The helper function for {ASSERT|EXPECT}_STREQ.
19004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
19007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* actual_expression,
19008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* expected,
19009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* actual);
19010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
19012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
19015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              const char* actual_expression,
19016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              const char* expected,
19017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              const char* actual);
19018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The helper function for {ASSERT|EXPECT}_STRNE.
19020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
19023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* s2_expression,
19024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* s1,
19025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* s2);
19026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The helper function for {ASSERT|EXPECT}_STRCASENE.
19028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
19031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              const char* s2_expression,
19032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              const char* s1,
19033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                              const char* s2);
19034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for *_STREQ on wide strings.
19037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
19040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* actual_expression,
19041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const wchar_t* expected,
19042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const wchar_t* actual);
19043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for *_STRNE on wide strings.
19045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
19048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const char* s2_expression,
19049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const wchar_t* s1,
19050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                          const wchar_t* s2);
19051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
19053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// IsSubstring() and IsNotSubstring() are intended to be used as the
19055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
19056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// themselves.  They check whether needle is a substring of haystack
19057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (NULL is considered a substring of itself only), and return an
19058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// appropriate error message when they fail.
19059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The {needle,haystack}_expr arguments are the stringified
19061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expressions that generated the two real arguments.
19062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsSubstring(
19063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle, const char* haystack);
19065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsSubstring(
19066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const wchar_t* needle, const wchar_t* haystack);
19068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsNotSubstring(
19069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle, const char* haystack);
19071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsNotSubstring(
19072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const wchar_t* needle, const wchar_t* haystack);
19074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsSubstring(
19075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::std::string& needle, const ::std::string& haystack);
19077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsNotSubstring(
19078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::std::string& needle, const ::std::string& haystack);
19080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_STD_WSTRING
19082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsSubstring(
19083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::std::wstring& needle, const ::std::wstring& haystack);
19085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult IsNotSubstring(
19086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* needle_expr, const char* haystack_expr,
19087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const ::std::wstring& needle, const ::std::wstring& haystack);
19088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_STD_WSTRING
19089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal {
19091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper template function for comparing floating-points.
19093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Template parameter:
19095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   RawType: the raw floating-point type (either float or double)
19097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename RawType>
19100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
19101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                         const char* actual_expression,
19102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                         RawType expected,
19103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                         RawType actual) {
19104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const FloatingPoint<RawType> lhs(expected), rhs(actual);
19105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (lhs.AlmostEquals(rhs)) {
19107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return AssertionSuccess();
19108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
19109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::std::stringstream expected_ss;
19111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
19112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              << expected;
19113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::std::stringstream actual_ss;
19115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
19116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter            << actual;
19117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return EqFailure(expected_expression,
19119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   actual_expression,
19120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   StringStreamToString(&expected_ss),
19121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   StringStreamToString(&actual_ss),
19122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                   false);
19123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for implementing ASSERT_NEAR.
19126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
19129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                const char* expr2,
19130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                const char* abs_error_expr,
19131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                double val1,
19132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                double val2,
19133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                                double abs_error);
19134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
19136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A class that enables one to stream messages to assertion macros
19137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ AssertHelper {
19138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
19139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Constructor.
19140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  AssertHelper(TestPartResult::Type type,
19141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter               const char* file,
19142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter               int line,
19143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter               const char* message);
19144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ~AssertHelper();
19145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Message assignment is a semantic trick to enable assertion
19147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // streaming; see the GTEST_MESSAGE_ macro below.
19148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  void operator=(const Message& message) const;
19149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
19151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // We put our data in a struct so that the size of the AssertHelper class can
19152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // be as small as possible.  This is important because gcc is incapable of
19153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // re-using stack space even for temporary variables, so every EXPECT_EQ
19154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // reserves stack space for another AssertHelper.
19155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  struct AssertHelperData {
19156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    AssertHelperData(TestPartResult::Type t,
19157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                     const char* srcfile,
19158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                     int line_num,
19159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                     const char* msg)
19160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        : type(t), file(srcfile), line(line_num), message(msg) { }
19161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    TestPartResult::Type const type;
19163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    const char* const file;
19164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    int const line;
19165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    std::string const message;
19166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter   private:
19168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
19169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  };
19170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  AssertHelperData* const data_;
19172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
19174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
19175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace internal
19177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST
19179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The pure interface class that all value-parameterized tests inherit from.
19180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A value-parameterized class must inherit from both ::testing::Test and
19181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::testing::WithParamInterface. In most cases that just means inheriting
19182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// from ::testing::TestWithParam, but more complicated test hierarchies
19183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// may need to inherit from Test and WithParamInterface at different levels.
19184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This interface has support for accessing the test parameter value via
19186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the GetParam() method.
19187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Use it with one of the parameter generator defining functions, like Range(),
19189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Values(), ValuesIn(), Bool(), and Combine().
19190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// class FooTest : public ::testing::TestWithParam<int> {
19192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//  protected:
19193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   FooTest() {
19194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     // Can use GetParam() here.
19195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
19196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   virtual ~FooTest() {
19197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     // Can use GetParam() here.
19198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
19199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   virtual void SetUp() {
19200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     // Can use GetParam() here.
19201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
19202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   virtual void TearDown {
19203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     // Can use GetParam() here.
19204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
19205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// };
19206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TEST_P(FooTest, DoesBar) {
19207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   // Can use GetParam() method here.
19208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Foo foo;
19209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_TRUE(foo.DoesBar(GetParam()));
19210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// }
19211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
19212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
19214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass WithParamInterface {
19215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public:
19216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  typedef T ParamType;
19217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  virtual ~WithParamInterface() {}
19218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // The current parameter value. Is also available in the test fixture's
19220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // constructor. This member function is non-static, even though it only
19221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // references static data, to reduce the opportunity for incorrect uses
19222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
19223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // uses a fixture whose parameter type is int.
19224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  const ParamType& GetParam() const {
19225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_CHECK_(parameter_ != NULL)
19226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        << "GetParam() can only be called inside a value-parameterized test "
19227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter        << "-- did you intend to write TEST_P instead of TEST_F?";
19228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    return *parameter_;
19229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
19230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private:
19232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Sets parameter value. The caller is responsible for making sure the value
19233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // remains alive and unchanged throughout the current test.
19234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static void SetParam(const ParamType* parameter) {
19235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    parameter_ = parameter;
19236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  }
19237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // Static value used for accessing parameter during a test lifetime.
19239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  static const ParamType* parameter_;
19240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  // TestClass must be a subclass of WithParamInterface<T> and Test.
19242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  template <class TestClass> friend class internal::ParameterizedTestFactory;
19243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
19244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
19246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst T* WithParamInterface<T>::parameter_ = NULL;
19247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Most value-parameterized classes can ignore the existence of
19249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// WithParamInterface, and can just inherit from ::testing::TestWithParam.
19250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T>
19252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestWithParam : public Test, public WithParamInterface<T> {
19253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter};
19254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_HAS_PARAM_TEST
19256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for indicating success/failure in test code.
19258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ADD_FAILURE unconditionally adds a failure to the current test.
19260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SUCCEED generates a success - it doesn't automatically make the
19261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// current test successful, as a test is only successful when it has
19262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// no failure.
19263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// EXPECT_* verifies that a certain condition is satisfied.  If not,
19265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it behaves like ADD_FAILURE.  In particular:
19266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_TRUE  verifies that a Boolean condition is true.
19268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_FALSE verifies that a Boolean condition is false.
19269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
19271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// that they will also abort the current function on failure.  People
19272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
19273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// writing data-driven tests often find themselves using ADD_FAILURE
19274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and EXPECT_* more.
19275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates a nonfatal failure with a generic message.
19277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
19278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates a nonfatal failure at the given source file location with
19280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a generic message.
19281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ADD_FAILURE_AT(file, line) \
19282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_MESSAGE_AT_(file, line, "Failed", \
19283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                    ::testing::TestPartResult::kNonFatalFailure)
19284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates a fatal failure with a generic message.
19286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
19287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Define this macro to 1 to omit the definition of FAIL(), which is a
19289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// generic name and clashes with some other libraries.
19290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_FAIL
19291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define FAIL() GTEST_FAIL()
19292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Generates a success with a generic message.
19295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
19296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Define this macro to 1 to omit the definition of SUCCEED(), which
19298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is a generic name and clashes with some other libraries.
19299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_SUCCEED
19300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define SUCCEED() GTEST_SUCCEED()
19301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for testing exceptions.
19304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
19306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         Tests that the statement throws the expected exception.
19307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_NO_THROW(statement):
19308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         Tests that the statement doesn't throw any exception.
19309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_ANY_THROW(statement):
19310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         Tests that the statement throws an exception.
19311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_THROW(statement, expected_exception) \
19313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
19314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_NO_THROW(statement) \
19315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
19316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_ANY_THROW(statement) \
19317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
19318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_THROW(statement, expected_exception) \
19319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
19320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_NO_THROW(statement) \
19321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
19322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_ANY_THROW(statement) \
19323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
19324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Boolean assertions. Condition can be either a Boolean expression or an
19326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// AssertionResult. For more information on how to use AssertionResult with
19327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// these macros see comments on that class.
19328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_TRUE(condition) \
19329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
19330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      GTEST_NONFATAL_FAILURE_)
19331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_FALSE(condition) \
19332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
19333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      GTEST_NONFATAL_FAILURE_)
19334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_TRUE(condition) \
19335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
19336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      GTEST_FATAL_FAILURE_)
19337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_FALSE(condition) \
19338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
19339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      GTEST_FATAL_FAILURE_)
19340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Includes the auto-generated header that implements a family of
19342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// generic predicate assertion macros.
19343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2006, Google Inc.
19344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved.
19345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without
19347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are
19348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met:
19349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions of source code must retain the above copyright
19351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer.
19352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Redistributions in binary form must reproduce the above
19353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer
19354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the
19355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution.
19356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     * Neither the name of Google Inc. nor the names of its
19357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from
19358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission.
19359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
19368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
19370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
19373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
19374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Implements a family of generic predicate assertion macros.
19376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Makes sure this header is not included before gtest.h.
19381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
19382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
19383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
19384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This header implements a family of generic predicate assertion
19386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macros:
19387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_PRED_FORMAT1(pred_format, v1)
19389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
19390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ...
19391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// where pred_format is a function or functor that takes n (in the
19393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// case of ASSERT_PRED_FORMATn) values and their source expression
19394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// text, and returns a testing::AssertionResult.  See the definition
19395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of ASSERT_EQ in gtest.h for an example.
19396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If you don't care about formatting, you can use the more
19398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// restrictive version:
19399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_PRED1(pred, v1)
19401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_PRED2(pred, v1, v2)
19402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ...
19403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// where pred is an n-ary function or functor that returns bool,
19405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and the values v1, v2, ..., must support the << operator for
19406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// streaming to std::ostream.
19407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We also define the EXPECT_* variations.
19409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For now we only support predicates whose arity is at most 5.
19411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Please email googletestframework@googlegroups.com if you need
19412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// support for higher arities.
19413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_ASSERT_ is the basic statement to which all of the assertions
19415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in this file reduce.  Don't use this in your code.
19416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_(expression, on_failure) \
19418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
19419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (const ::testing::AssertionResult gtest_ar = (expression)) \
19420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ; \
19421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  else \
19422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    on_failure(gtest_ar.failure_message())
19423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
19426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Pred,
19428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T1>
19429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult AssertPred1Helper(const char* pred_text,
19430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e1,
19431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  Pred pred,
19432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T1& v1) {
19433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (pred(v1)) return AssertionSuccess();
19434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return AssertionFailure() << pred_text << "("
19436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e1 << ") evaluates to false, where"
19437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e1 << " evaluates to " << v1;
19438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
19441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't use this in your code.
19442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
19443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(pred_format(#v1, v1), \
19444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                on_failure)
19445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
19447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED1_(pred, v1, on_failure)\
19449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
19450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v1, \
19451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             pred, \
19452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v1), on_failure)
19453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Unary predicate assertion macros.
19455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED_FORMAT1(pred_format, v1) \
19456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
19457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED1(pred, v1) \
19458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
19459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED_FORMAT1(pred_format, v1) \
19460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
19461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED1(pred, v1) \
19462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
19463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
19467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Pred,
19469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T1,
19470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T2>
19471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult AssertPred2Helper(const char* pred_text,
19472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e1,
19473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e2,
19474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  Pred pred,
19475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T1& v1,
19476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T2& v2) {
19477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (pred(v1, v2)) return AssertionSuccess();
19478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return AssertionFailure() << pred_text << "("
19480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e1 << ", "
19481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e2 << ") evaluates to false, where"
19482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e1 << " evaluates to " << v1
19483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e2 << " evaluates to " << v2;
19484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
19487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't use this in your code.
19488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
19489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
19490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                on_failure)
19491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
19493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED2_(pred, v1, v2, on_failure)\
19495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
19496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v1, \
19497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v2, \
19498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             pred, \
19499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v1, \
19500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v2), on_failure)
19501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Binary predicate assertion macros.
19503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
19504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
19505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED2(pred, v1, v2) \
19506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
19507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
19508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
19509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED2(pred, v1, v2) \
19510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
19511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
19515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Pred,
19517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T1,
19518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T2,
19519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T3>
19520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult AssertPred3Helper(const char* pred_text,
19521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e1,
19522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e2,
19523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e3,
19524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  Pred pred,
19525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T1& v1,
19526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T2& v2,
19527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T3& v3) {
19528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (pred(v1, v2, v3)) return AssertionSuccess();
19529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return AssertionFailure() << pred_text << "("
19531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e1 << ", "
19532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e2 << ", "
19533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e3 << ") evaluates to false, where"
19534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e1 << " evaluates to " << v1
19535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e2 << " evaluates to " << v2
19536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e3 << " evaluates to " << v3;
19537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
19540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't use this in your code.
19541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
19542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
19543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                on_failure)
19544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
19546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
19548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
19549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v1, \
19550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v2, \
19551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v3, \
19552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             pred, \
19553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v1, \
19554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v2, \
19555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v3), on_failure)
19556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Ternary predicate assertion macros.
19558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
19559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
19560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED3(pred, v1, v2, v3) \
19561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
19562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
19563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
19564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED3(pred, v1, v2, v3) \
19565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
19566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
19570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Pred,
19572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T1,
19573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T2,
19574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T3,
19575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T4>
19576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult AssertPred4Helper(const char* pred_text,
19577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e1,
19578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e2,
19579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e3,
19580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e4,
19581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  Pred pred,
19582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T1& v1,
19583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T2& v2,
19584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T3& v3,
19585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T4& v4) {
19586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
19587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return AssertionFailure() << pred_text << "("
19589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e1 << ", "
19590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e2 << ", "
19591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e3 << ", "
19592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e4 << ") evaluates to false, where"
19593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e1 << " evaluates to " << v1
19594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e2 << " evaluates to " << v2
19595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e3 << " evaluates to " << v3
19596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e4 << " evaluates to " << v4;
19597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
19600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't use this in your code.
19601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
19602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
19603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                on_failure)
19604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
19606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
19608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
19609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v1, \
19610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v2, \
19611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v3, \
19612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v4, \
19613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             pred, \
19614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v1, \
19615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v2, \
19616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v3, \
19617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v4), on_failure)
19618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 4-ary predicate assertion macros.
19620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
19621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
19622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
19623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
19624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
19625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
19626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
19627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
19628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
19632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Pred,
19634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T1,
19635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T2,
19636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T3,
19637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T4,
19638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter          typename T5>
19639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterAssertionResult AssertPred5Helper(const char* pred_text,
19640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e1,
19641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e2,
19642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e3,
19643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e4,
19644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const char* e5,
19645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  Pred pred,
19646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T1& v1,
19647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T2& v2,
19648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T3& v3,
19649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T4& v4,
19650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                  const T5& v5) {
19651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
19652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return AssertionFailure() << pred_text << "("
19654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e1 << ", "
19655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e2 << ", "
19656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e3 << ", "
19657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e4 << ", "
19658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << e5 << ") evaluates to false, where"
19659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e1 << " evaluates to " << v1
19660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e2 << " evaluates to " << v2
19661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e3 << " evaluates to " << v3
19662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e4 << " evaluates to " << v4
19663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                            << "\n" << e5 << " evaluates to " << v5;
19664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
19667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't use this in your code.
19668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
19669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
19670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                on_failure)
19671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
19673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this in your code.
19674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
19675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
19676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v1, \
19677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v2, \
19678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v3, \
19679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v4, \
19680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             #v5, \
19681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             pred, \
19682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v1, \
19683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v2, \
19684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v3, \
19685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v4, \
19686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                             v5), on_failure)
19687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 5-ary predicate assertion macros.
19689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
19690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
19691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
19692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
19693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
19694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
19695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
19696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
19697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for testing equalities and inequalities.
19703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
19705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
19706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
19707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
19708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
19709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
19710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When they are not, Google Test prints both the tested expressions and
19712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// their actual values.  The values must be compatible built-in types,
19713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// or you will get a compiler error.  By "compatible" we mean that the
19714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// values can be compared by the respective operator.
19715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note:
19717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   1. It is possible to make a user-defined type work with
19719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   {ASSERT|EXPECT}_??(), but that requires overloading the
19720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   comparison operators and is thus discouraged by the Google C++
19721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   Usage Guide.  Therefore, you are advised to use the
19722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
19723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   equal.
19724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
19726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   pointers (in particular, C strings).  Therefore, if you use it
19727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   with two C strings, you are testing how their locations in memory
19728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   are related, not how their content is related.  To compare two C
19729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   strings by content, use {ASSERT|EXPECT}_STR*().
19730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
19732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
19733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   what the actual value is when it fails, and similarly for the
19734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   other comparisons.
19735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
19737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   evaluate their arguments, which is undefined.
19738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   5. These macros evaluate their arguments exactly once.
19740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Examples:
19742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_NE(5, Foo());
19744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_EQ(NULL, a_pointer);
19745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_LT(i, array_size);
19746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_GT(records.size(), 0) << "There is no record left.";
19747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_EQ(expected, actual) \
19749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal:: \
19750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
19751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      expected, actual)
19752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_NE(expected, actual) \
19753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
19754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_LE(val1, val2) \
19755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
19756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_LT(val1, val2) \
19757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
19758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_GE(val1, val2) \
19759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
19760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_GT(val1, val2) \
19761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
19762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_EQ(expected, actual) \
19764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal:: \
19765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
19766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      expected, actual)
19767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_NE(val1, val2) \
19768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
19769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_LE(val1, val2) \
19770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
19771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_LT(val1, val2) \
19772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
19773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_GE(val1, val2) \
19774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
19775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_ASSERT_GT(val1, val2) \
19776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
19777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
19779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ASSERT_XY(), which clashes with some users' own code.
19780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_ASSERT_EQ
19782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
19783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_ASSERT_NE
19786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
19787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_ASSERT_LE
19790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
19791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_ASSERT_LT
19794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
19795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_ASSERT_GE
19798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
19799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_ASSERT_GT
19802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
19803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
19804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// C-string Comparisons.  All tests treat NULL and any non-NULL string
19806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as different.  Two NULLs are equal.
19807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
19809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
19810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
19811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
19812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// For wide or narrow string objects, you can use the
19814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// {ASSERT|EXPECT}_??() macros.
19815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Don't depend on the order in which the arguments are evaluated,
19817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// which is undefined.
19818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// These macros evaluate their arguments exactly once.
19820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_STREQ(expected, actual) \
19822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_STRNE(s1, s2) \
19824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_STRCASEEQ(expected, actual) \
19826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_STRCASENE(s1, s2)\
19828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_STREQ(expected, actual) \
19831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_STRNE(s1, s2) \
19833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_STRCASEEQ(expected, actual) \
19835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_STRCASENE(s1, s2)\
19837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros for comparing floating-point numbers.
19840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
19842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         Tests that two float values are almost equal.
19843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
19844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         Tests that two double values are almost equal.
19845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
19846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//         Tests that v1 and v2 are within the given distance to each other.
19847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test uses ULP-based comparison to automatically pick a default
19849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// error bound that is appropriate for the operands.  See the
19850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// FloatingPoint template class in gtest-internal.h if you are
19851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// interested in the implementation details.
19852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_FLOAT_EQ(expected, actual)\
19854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      expected, actual)
19856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_DOUBLE_EQ(expected, actual)\
19858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      expected, actual)
19860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_FLOAT_EQ(expected, actual)\
19862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      expected, actual)
19864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_DOUBLE_EQ(expected, actual)\
19866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      expected, actual)
19868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_NEAR(val1, val2, abs_error)\
19870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      val1, val2, abs_error)
19872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_NEAR(val1, val2, abs_error)\
19874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                      val1, val2, abs_error)
19876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// These predicate format functions work on floating-point values, and
19878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
19879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
19881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Asserts that val1 is less than, or almost equal to, val2.  Fails
19883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// otherwise.  In particular, it fails if either val1 or val2 is NaN.
19884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
19885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                   float val1, float val2);
19886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
19887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter                                    double val1, double val2);
19888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS
19891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros that test for HRESULT failure and success, these are only useful
19893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// on Windows, and rely on Windows SDK macros and APIs to compile.
19894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
19896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When expr unexpectedly fails or succeeds, Google Test prints the
19898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expected result and the actual result with both a human-readable
19899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// string representation of the error, if available, as well as the
19900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// hex result code.
19901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define EXPECT_HRESULT_SUCCEEDED(expr) \
19902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
19903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_HRESULT_SUCCEEDED(expr) \
19905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
19906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define EXPECT_HRESULT_FAILED(expr) \
19908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
19909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define ASSERT_HRESULT_FAILED(expr) \
19911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
19912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_OS_WINDOWS
19914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Macros that execute statement and check that it doesn't generate new fatal
19916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// failures in the current thread.
19917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
19919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Examples:
19921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   EXPECT_NO_FATAL_FAILURE(Process());
19923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
19924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define ASSERT_NO_FATAL_FAILURE(statement) \
19926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
19927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define EXPECT_NO_FATAL_FAILURE(statement) \
19928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
19929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Causes a trace (including the source file path, the current line
19931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// number, and the given message) to be included in every test failure
19932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// message generated by code in the current scope.  The effect is
19933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// undone when the control leaves the current scope.
19934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The message argument can be anything streamable to std::ostream.
19936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In the implementation, we include the current line number as part
19938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
19939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to appear in the same block - as long as they are on different
19940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// lines.
19941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define SCOPED_TRACE(message) \
19942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
19943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter    __FILE__, __LINE__, ::testing::Message() << (message))
19944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Compile-time assertion for type equality.
19946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
19947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the same type.  The value it returns is not interesting.
19948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Instead of making StaticAssertTypeEq a class template, we make it a
19950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function template that invokes a helper class template.  This
19951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
19952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// defining objects of that type.
19953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// CAVEAT:
19955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// When used inside a method of a class template,
19957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
19958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// instantiated.  For example, given:
19959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   template <typename T> class Foo {
19961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    public:
19962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
19963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   };
19964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the code:
19966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void Test1() { Foo<bool> foo; }
19968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will NOT generate a compiler error, as Foo<bool>::Bar() is never
19970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// actually instantiated.  Instead, you need:
19971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   void Test2() { Foo<bool> foo; foo.Bar(); }
19973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to cause a compiler error.
19975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T1, typename T2>
19976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool StaticAssertTypeEq() {
19977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
19978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return true;
19979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
19980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines a test.
19982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The first parameter is the name of the test case, and the second
19984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parameter is the name of the test within the test case.
19985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The convention is to end the test case name with "Test".  For
19987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// example, a test case for the Foo class can be named FooTest.
19988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The user should put his test code between braces after using this
19990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// macro.  Example:
19991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
19992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TEST(FooTest, InitializesCorrectly) {
19993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Foo foo;
19994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     EXPECT_TRUE(foo.StatusIsOK());
19995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
19996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
19997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Note that we call GetTestTypeId() instead of GetTypeId<
19998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::testing::Test>() here to get the type ID of testing::Test.  This
19999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is to work around a suspected linker bug when using Google Test as
20000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// a framework on Mac OS X.  The bug causes GetTypeId<
20001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// ::testing::Test>() to return different values depending on whether
20002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the call is from the Google Test framework itself or from user test
20003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// code.  GetTestTypeId() is guaranteed to always return the same
20004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// value, as it always calls GetTypeId<>() from the Google Test
20005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// framework.
20006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_TEST(test_case_name, test_name)\
20007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_(test_case_name, test_name, \
20008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              ::testing::Test, ::testing::internal::GetTestTypeId())
20009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Define this macro to 1 to omit the definition of TEST(), which
20011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is a generic name and clashes with some other libraries.
20012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_DONT_DEFINE_TEST
20013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
20014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif
20015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Defines a test that uses a test fixture.
20017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The first parameter is the name of the test fixture class, which
20019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// also doubles as the test case name.  The second parameter is the
20020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// name of the test within the test case.
20021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A test fixture class must be declared earlier.  The user should put
20023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// his test code between braces after using this macro.  Example:
20024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   class FooTest : public testing::Test {
20026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//    protected:
20027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     virtual void SetUp() { b_.AddElement(3); }
20028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Foo a_;
20030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     Foo b_;
20031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   };
20032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TEST_F(FooTest, InitializesCorrectly) {
20034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     EXPECT_TRUE(a_.StatusIsOK());
20035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
20036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
20038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     EXPECT_EQ(0, a_.size());
20039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//     EXPECT_EQ(1, b_.size());
20040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//   }
20041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define TEST_F(test_fixture, test_name)\
20043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  GTEST_TEST_(test_fixture, test_name, test_fixture, \
20044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter              ::testing::internal::GetTypeId<test_fixture>())
20045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}  // namespace testing
20047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Use this function in main() to run all tests.  It returns 0 if all
20049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// tests are successful, or 1 otherwise.
20050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// RUN_ALL_TESTS() should be invoked after the command line has been
20052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// parsed by InitGoogleTest().
20053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter//
20054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This function was formerly a macro; thus, it is in the global
20055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// namespace and has an all-caps name.
20056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterint RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
20057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int RUN_ALL_TESTS() {
20059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter  return ::testing::UnitTest::GetInstance()->Run();
20060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}
20061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter
20062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
20063