1233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Google C++ Testing Framework (Google Test)
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file defines the public API for Google Test.  It should be
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan// included by any test program that uses Google Test.
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan// leave some internal implementation details in this header file.
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan// They are clearly marked by comments like this:
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Such code is NOT meant to be used by a user directly, and is subject
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan// program!
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Acknowledgment: Google Test borrowed the idea of automatic test
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan// easyUnit framework.
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_H_
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits>
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <ostream>
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <vector>
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Google C++ Testing Framework (Google Test)
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file declares functions and macros used internally by
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test.  They are subject to change without notice.
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Authors: wan@google.com (Zhanyong Wan)
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Low-level types and utilities for porting Google Test to various
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan// platforms.  They are subject to change without notice.  DO NOT USE
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEM IN USER CODE.
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file is fundamental to Google Test.  All other Google Test source
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan// files are expected to #include this.  Therefore, it cannot #include
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan// any other Google Test header.
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user can define the following macros in the build script to
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan// control Google Test's behavior.  If the user doesn't define a macro
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in this list, Google Test will define it.
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              is/isn't available.
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              are enabled.
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              is/isn't available (some systems define
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              ::string, which is different to std::string).
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              is/isn't available (some systems define
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              ::wstring, which is different to std::wstring).
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              expressions are/aren't available.
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              is/isn't available.
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              enabled.
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              std::wstring does/doesn't work (Google Test can
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              be used where std::wstring is unavailable).
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              is/isn't available.
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              compiler supports Microsoft's "Structured
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              Exception Handling".
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_STREAM_REDIRECTION
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            - Define it to 1/0 to indicate whether the
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              platform supports I/O stream redirection using
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              dup() and dup2().
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              Test's own tr1 tuple implementation should be
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              used.  Unused when the user sets
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              GTEST_HAS_TR1_TUPLE to 0.
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              is building in C++11/C++98 mode.
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_LINKED_AS_SHARED_LIBRARY
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            - Define to 1 when compiling tests that use
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              Google Test as a shared library (known as
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              DLL on Windows).
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_CREATE_SHARED_LIBRARY
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            - Define to 1 when compiling Google Test itself
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              as a shared library.
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header defines the following utilities:
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros indicating the current platform (defined to 1 if compiled on
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the given platform; otherwise undefined):
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_AIX      - IBM AIX
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_CYGWIN   - Cygwin
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_HPUX     - HP-UX
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_LINUX    - Linux
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_OS_LINUX_ANDROID - Google Android
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_MAC      - Mac OS X
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_OS_IOS    - iOS
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       GTEST_OS_IOS_SIMULATOR - iOS simulator
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_NACL     - Google Native Client (NaCl)
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_OPENBSD  - OpenBSD
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_QNX      - QNX
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_SOLARIS  - Sun Solaris
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_SYMBIAN  - Symbian
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_OS_WINDOWS_MINGW    - MinGW
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_OS_ZOS      - z/OS
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan// most stable support.  Since core members of the Google Test project
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan// don't have access to other platforms, support for them may be less
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan// stable.  If you notice any problems on your platform, please notify
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan// googletestframework@googlegroups.com (patches for fixing them are
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan// even more welcome!).
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note that it is possible that none of the GTEST_OS_* macros are defined.
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros indicating available Google Test features (defined to 1 if
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the corresponding feature is supported; otherwise undefined):
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            tests)
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_DEATH_TEST   - death tests
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_TYPED_TEST   - typed tests
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            GTEST_HAS_POSIX_RE (see above) which users can
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            define themselves.
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            the above two are mutually exclusive.
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for basic C++ coding:
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                              variable don't have to be used.
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Synchronization:
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                  - synchronization primitives.
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         synchronization primitives have real implementations
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         and Google Test is thread-safe; or 0 otherwise.
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Template meta programming:
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   IteratorTraits - partial implementation of std::iterator_traits, which
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                    is not available in libCstd when compiled with Sun C++.
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Smart pointers:
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   scoped_ptr     - as in TR2.
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Regular expressions:
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   RE             - a simple regular expression class using the POSIX
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                    Extended Regular Expression syntax on UNIX-like
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                    platforms, or a reduced regular exception syntax on
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                    other platforms, including Windows.
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Logging:
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_LOG_()   - logs messages at the specified severity level.
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   LogToStderr()  - directs all log messages to stderr.
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   FlushInfoLog() - flushes informational log messages.
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Stdout and stderr capturing:
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   CaptureStdout()     - starts capturing stdout.
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GetCapturedStdout() - stops capturing stdout and returns the captured
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         string.
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   CaptureStderr()     - starts capturing stderr.
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GetCapturedStderr() - stops capturing stderr and returns the captured
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         string.
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Integer types:
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TypeWithSize   - maps an integer to a int type.
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Int32, UInt32, Int64, UInt64, TimeInMillis
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                  - integers of known sizes.
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   BiggestInt     - the biggest signed integer type.
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Command-line utilities:
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_FLAG()       - references a flag.
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_DECLARE_*()  - declares a flag.
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_DEFINE_*()   - defines a flag.
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GetInjectableArgvs() - returns the command line as a vector of strings.
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Environment variable utilities:
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GetEnv()             - gets the value of an environment variable.
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   BoolFromGTestEnv()   - parses a bool environment variable.
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Int32FromGTestEnv()  - parses an Int32 environment variable.
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   StringFromGTestEnv() - parses a string environment variable.
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <ctype.h>   // for isspace, etc
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stddef.h>  // for ptrdiff_t
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h>
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h>
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h>
297233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef _WIN32_WCE
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <sys/types.h>
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <sys/stat.h>
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // !_WIN32_WCE
301233d2500723e5594f3e7c70896ffeeef32b9c950ywan
302233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined __APPLE__
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <AvailabilityMacros.h>
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <TargetConditionals.h>
305233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <iostream>  // NOLINT
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <sstream>  // NOLINT
309233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string>  // NOLINT
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan
311233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
312233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_FLAG_PREFIX_ "gtest_"
313233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
314233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
315233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_NAME_ "Google Test"
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan
318233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines the version of gcc that is used to compile this.
319233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __GNUC__
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 40302 means version 4.3.2.
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_GCC_VER_ \
322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // __GNUC__
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan
325233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines the platform on which Google Test is compiled.
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __CYGWIN__
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_CYGWIN 1
328233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __SYMBIAN32__
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_SYMBIAN 1
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined _WIN32
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_WINDOWS 1
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan# ifdef _WIN32_WCE
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_OS_WINDOWS_MOBILE 1
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__MINGW__) || defined(__MINGW32__)
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_OS_WINDOWS_MINGW 1
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_OS_WINDOWS_DESKTOP 1
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // _WIN32_WCE
339233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __APPLE__
340233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_MAC 1
341233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if TARGET_OS_IPHONE
342233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_OS_IOS 1
343233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  if TARGET_IPHONE_SIMULATOR
344233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_OS_IOS_SIMULATOR 1
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __linux__
348233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_LINUX 1
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if defined __ANDROID__
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_OS_LINUX_ANDROID 1
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
352233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __MVS__
353233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_ZOS 1
354233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(__sun) && defined(__SVR4)
355233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_SOLARIS 1
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(_AIX)
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_AIX 1
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(__hpux)
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_HPUX 1
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __native_client__
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_NACL 1
362233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __OpenBSD__
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_OPENBSD 1
364233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined __QNX__
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_OS_QNX 1
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // __CYGWIN__
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_LANG_CXX11
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value for __cplusplus, and recent versions of clang, gcc, and
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan// probably other compilers set that too in C++11 mode.
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
374233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Compiling in at least C++11 mode.
375233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_LANG_CXX11 1
376233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_LANG_CXX11 0
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Brings in definitions for functions used in the testing::internal::posix
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan// namespace (read, write, close, chdir, isatty, stat). We do not currently
383233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use them on Windows Mobile.
384233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_OS_WINDOWS
385233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This assumes that non-Windows OSes provide unistd.h. For OSes where this
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is not the case, we need to include headers that provide the functions
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan// mentioned above.
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <unistd.h>
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <strings.h>
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif !GTEST_OS_WINDOWS_MOBILE
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <direct.h>
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <io.h>
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_LINUX_ANDROID
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used to define __ANDROID_API__ matching the target NDK API level.
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  include <android/api-level.h>  // NOLINT
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan
400233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines this to true iff Google Test can use POSIX regular expressions.
401233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_POSIX_RE
402233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_OS_LINUX_ANDROID
403233d2500723e5594f3e7c70896ffeeef32b9c950ywan// On Android, <regex.h> is only available starting with Gingerbread.
404233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
405233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
408233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
409233d2500723e5594f3e7c70896ffeeef32b9c950ywan
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_POSIX_RE
411233d2500723e5594f3e7c70896ffeeef32b9c950ywan
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan// On some platforms, <regex.h> needs someone to define size_t, and
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan// won't compile otherwise.  We can #include it here as we already
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan// included <stdlib.h>, which is guaranteed to define size_t through
415233d2500723e5594f3e7c70896ffeeef32b9c950ywan// <stddef.h>.
416233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <regex.h>  // NOLINT
417233d2500723e5594f3e7c70896ffeeef32b9c950ywan
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_USES_POSIX_RE 1
419233d2500723e5594f3e7c70896ffeeef32b9c950ywan
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif GTEST_OS_WINDOWS
421233d2500723e5594f3e7c70896ffeeef32b9c950ywan
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan// <regex.h> is not available on Windows.  Use our own simple regex
423233d2500723e5594f3e7c70896ffeeef32b9c950ywan// implementation instead.
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_USES_SIMPLE_RE 1
425233d2500723e5594f3e7c70896ffeeef32b9c950ywan
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
427233d2500723e5594f3e7c70896ffeeef32b9c950ywan
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan// <regex.h> may not be available on this platform.  Use our own
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan// simple regex implementation instead.
430233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_USES_SIMPLE_RE 1
431233d2500723e5594f3e7c70896ffeeef32b9c950ywan
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_POSIX_RE
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
434233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_EXCEPTIONS
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us whether exceptions are enabled, so we need
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to figure it out.
437233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if defined(_MSC_VER) || defined(__BORLANDC__)
438233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
439233d2500723e5594f3e7c70896ffeeef32b9c950ywan// macro to enable exceptions, so we'll do the same.
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Assumes that exceptions are enabled by default.
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  ifndef _HAS_EXCEPTIONS
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define _HAS_EXCEPTIONS 1
443233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif  // _HAS_EXCEPTIONS
444233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
445233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__GNUC__) && __EXCEPTIONS
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
447233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_EXCEPTIONS 1
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__SUNPRO_CC)
449233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Sun Pro CC supports exceptions.  However, there is no compile-time way of
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan// detecting whether they are enabled or not.  Therefore, we assume that
451233d2500723e5594f3e7c70896ffeeef32b9c950ywan// they are enabled unless the user tells us otherwise.
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_EXCEPTIONS 1
453233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__IBMCPP__) && __EXCEPTIONS
454233d2500723e5594f3e7c70896ffeeef32b9c950ywan// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
455233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_EXCEPTIONS 1
456233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__HP_aCC)
457233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Exception handling is in effect by default in HP aCC compiler. It has to
458233d2500723e5594f3e7c70896ffeeef32b9c950ywan// be turned of by +noeh compiler option if desired.
459233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_EXCEPTIONS 1
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
461233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For other compilers, we assume exceptions are disabled to be
462233d2500723e5594f3e7c70896ffeeef32b9c950ywan// conservative.
463233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_EXCEPTIONS 0
464233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
465233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_EXCEPTIONS
466233d2500723e5594f3e7c70896ffeeef32b9c950ywan
467233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !defined(GTEST_HAS_STD_STRING)
468233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Even though we don't use this macro any longer, we keep it in case
469233d2500723e5594f3e7c70896ffeeef32b9c950ywan// some clients still depend on it.
470233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_STD_STRING 1
471233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif !GTEST_HAS_STD_STRING
472233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user told us that ::std::string isn't available.
473233d2500723e5594f3e7c70896ffeeef32b9c950ywan# error "Google Test cannot be used where ::std::string isn't available."
474233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // !defined(GTEST_HAS_STD_STRING)
475233d2500723e5594f3e7c70896ffeeef32b9c950ywan
476233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_GLOBAL_STRING
477233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us whether ::string is available, so we need
478233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to figure it out.
479233d2500723e5594f3e7c70896ffeeef32b9c950ywan
480233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_GLOBAL_STRING 0
481233d2500723e5594f3e7c70896ffeeef32b9c950ywan
482233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_STRING
483233d2500723e5594f3e7c70896ffeeef32b9c950ywan
484233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_STD_WSTRING
485233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us whether ::std::wstring is available, so we need
486233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to figure it out.
487233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
488233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   is available.
489233d2500723e5594f3e7c70896ffeeef32b9c950ywan
490233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Cygwin 1.7 and below doesn't support ::std::wstring.
491233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Solaris' libc++ doesn't support it either.  Android has
492233d2500723e5594f3e7c70896ffeeef32b9c950ywan// no support for it at least as recent as Froyo (2.2).
493233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_STD_WSTRING \
494233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
495233d2500723e5594f3e7c70896ffeeef32b9c950ywan
496233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_STD_WSTRING
497233d2500723e5594f3e7c70896ffeeef32b9c950ywan
498233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_GLOBAL_WSTRING
499233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us whether ::wstring is available, so we need
500233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to figure it out.
501233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_GLOBAL_WSTRING \
502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
503233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_WSTRING
504233d2500723e5594f3e7c70896ffeeef32b9c950ywan
505233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether RTTI is available.
506233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_RTTI
507233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us whether RTTI is enabled, so we need to
508233d2500723e5594f3e7c70896ffeeef32b9c950ywan// figure it out.
509233d2500723e5594f3e7c70896ffeeef32b9c950ywan
510233d2500723e5594f3e7c70896ffeeef32b9c950ywan# ifdef _MSC_VER
511233d2500723e5594f3e7c70896ffeeef32b9c950ywan
512233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
513233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_HAS_RTTI 1
514233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
515233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_HAS_RTTI 0
516233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif
517233d2500723e5594f3e7c70896ffeeef32b9c950ywan
518233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
519233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
520233d2500723e5594f3e7c70896ffeeef32b9c950ywan
521233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  ifdef __GXX_RTTI
522233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When building against STLport with the Android NDK and with
523233d2500723e5594f3e7c70896ffeeef32b9c950ywan// -frtti -fno-exceptions, the build fails at link time with undefined
524233d2500723e5594f3e7c70896ffeeef32b9c950ywan// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
525233d2500723e5594f3e7c70896ffeeef32b9c950ywan// so disable RTTI when detected.
526233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
527233d2500723e5594f3e7c70896ffeeef32b9c950ywan       !defined(__EXCEPTIONS)
528233d2500723e5594f3e7c70896ffeeef32b9c950ywan#    define GTEST_HAS_RTTI 0
529233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   else
530233d2500723e5594f3e7c70896ffeeef32b9c950ywan#    define GTEST_HAS_RTTI 1
531233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
532233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
533233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_HAS_RTTI 0
534233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif  // __GXX_RTTI
535233d2500723e5594f3e7c70896ffeeef32b9c950ywan
536233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
537233d2500723e5594f3e7c70896ffeeef32b9c950ywan// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
538233d2500723e5594f3e7c70896ffeeef32b9c950ywan// first version with C++ support.
539233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__clang__)
540233d2500723e5594f3e7c70896ffeeef32b9c950ywan
541233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
542233d2500723e5594f3e7c70896ffeeef32b9c950ywan
543233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
544233d2500723e5594f3e7c70896ffeeef32b9c950ywan// both the typeid and dynamic_cast features are present.
545233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
546233d2500723e5594f3e7c70896ffeeef32b9c950ywan
547233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  ifdef __RTTI_ALL__
548233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_HAS_RTTI 1
549233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
550233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_HAS_RTTI 0
551233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif
552233d2500723e5594f3e7c70896ffeeef32b9c950ywan
553233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
554233d2500723e5594f3e7c70896ffeeef32b9c950ywan
555233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For all other compilers, we assume RTTI is enabled.
556233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_RTTI 1
557233d2500723e5594f3e7c70896ffeeef32b9c950ywan
558233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // _MSC_VER
559233d2500723e5594f3e7c70896ffeeef32b9c950ywan
560233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_RTTI
561233d2500723e5594f3e7c70896ffeeef32b9c950ywan
562233d2500723e5594f3e7c70896ffeeef32b9c950ywan// It's this header's responsibility to #include <typeinfo> when RTTI
563233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is enabled.
564233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_RTTI
565233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <typeinfo>
566233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
567233d2500723e5594f3e7c70896ffeeef32b9c950ywan
568233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether Google Test can use the pthreads library.
569233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_PTHREAD
570233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us explicitly, so we assume pthreads support is
571233d2500723e5594f3e7c70896ffeeef32b9c950ywan// available on Linux and Mac.
572233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
573233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
574233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to your compiler flags.
575233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
576233d2500723e5594f3e7c70896ffeeef32b9c950ywan    || GTEST_OS_QNX)
577233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_PTHREAD
578233d2500723e5594f3e7c70896ffeeef32b9c950ywan
579233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PTHREAD
580233d2500723e5594f3e7c70896ffeeef32b9c950ywan// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
581233d2500723e5594f3e7c70896ffeeef32b9c950ywan// true.
582233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <pthread.h>  // NOLINT
583233d2500723e5594f3e7c70896ffeeef32b9c950ywan
584233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For timespec and nanosleep, used below.
585233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <time.h>  // NOLINT
586233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
587233d2500723e5594f3e7c70896ffeeef32b9c950ywan
588233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether Google Test can use tr1/tuple.  You can define
589233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this macro to 0 to prevent Google Test from using tuple (any
590233d2500723e5594f3e7c70896ffeeef32b9c950ywan// feature depending on tuple with be disabled in this mode).
591233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_TR1_TUPLE
592233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
593233d2500723e5594f3e7c70896ffeeef32b9c950ywan// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
594233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_TR1_TUPLE 0
595233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
596233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us not to do it, so we assume it's OK.
597233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_TR1_TUPLE 1
598233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
599233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TR1_TUPLE
600233d2500723e5594f3e7c70896ffeeef32b9c950ywan
601233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether Google Test's own tr1 tuple implementation
602233d2500723e5594f3e7c70896ffeeef32b9c950ywan// should be used.
603233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_USE_OWN_TR1_TUPLE
604233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us, so we need to figure it out.
605233d2500723e5594f3e7c70896ffeeef32b9c950ywan
606233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We use our own TR1 tuple if we aren't sure the user has an
607233d2500723e5594f3e7c70896ffeeef32b9c950ywan// implementation of it already.  At this time, libstdc++ 4.0.0+ and
608233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC 2010 are the only mainstream standard libraries that come
609233d2500723e5594f3e7c70896ffeeef32b9c950ywan// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
610233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pretends to be GCC by defining __GNUC__ and friends, but cannot
611233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
612233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tuple in a 323 MB Feature Pack download, which we cannot assume the
613233d2500723e5594f3e7c70896ffeeef32b9c950ywan// user has.  QNX's QCC compiler is a modified GCC but it doesn't
614233d2500723e5594f3e7c70896ffeeef32b9c950ywan// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
615233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and it can be used with some compilers that define __GNUC__.
616233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
617233d2500723e5594f3e7c70896ffeeef32b9c950ywan      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
618233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
619233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
620233d2500723e5594f3e7c70896ffeeef32b9c950ywan
621233d2500723e5594f3e7c70896ffeeef32b9c950ywan// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
622233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
623233d2500723e5594f3e7c70896ffeeef32b9c950ywan// can build with clang but need to use gcc4.2's libstdc++).
624233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
625233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_ENV_HAS_STD_TUPLE_ 1
626233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
627233d2500723e5594f3e7c70896ffeeef32b9c950ywan
628233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
629233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_USE_OWN_TR1_TUPLE 0
630233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
631233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_USE_OWN_TR1_TUPLE 1
632233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
633233d2500723e5594f3e7c70896ffeeef32b9c950ywan
634233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_USE_OWN_TR1_TUPLE
635233d2500723e5594f3e7c70896ffeeef32b9c950ywan
636233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To avoid conditional compilation everywhere, we make it
637233d2500723e5594f3e7c70896ffeeef32b9c950ywan// gtest-port.h's responsibility to #include the header implementing
638233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tr1/tuple.
639233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TR1_TUPLE
640233d2500723e5594f3e7c70896ffeeef32b9c950ywan
641233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_USE_OWN_TR1_TUPLE
642233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file was GENERATED by command:
643233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     pump.py gtest-tuple.h.pump
644233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DO NOT EDIT BY HAND!!!
645233d2500723e5594f3e7c70896ffeeef32b9c950ywan
646233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2009 Google Inc.
647233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All Rights Reserved.
648233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
649233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
650233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
651233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
652233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
653233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
654233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
655233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
656233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
657233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
658233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
659233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
660233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
661233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
662233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
663233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
664233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
665233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
666233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
667233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
668233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
669233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
670233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
671233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
672233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
673233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
674233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
675233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
676233d2500723e5594f3e7c70896ffeeef32b9c950ywan
677233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
678233d2500723e5594f3e7c70896ffeeef32b9c950ywan
679233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
680233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
681233d2500723e5594f3e7c70896ffeeef32b9c950ywan
682233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <utility>  // For ::std::pair.
683233d2500723e5594f3e7c70896ffeeef32b9c950ywan
684233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The compiler used in Symbian has a bug that prevents us from declaring the
685233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tuple template as a friend (it complains that tuple is redefined).  This
686233d2500723e5594f3e7c70896ffeeef32b9c950ywan// hack bypasses the bug by declaring the members that should otherwise be
687233d2500723e5594f3e7c70896ffeeef32b9c950ywan// private as public.
688233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Sun Studio versions < 12 also have the above bug.
689233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
690233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
691233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
692233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
693233d2500723e5594f3e7c70896ffeeef32b9c950ywan    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
694233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
695233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
696233d2500723e5594f3e7c70896ffeeef32b9c950ywan
697233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GTEST_n_TUPLE_(T) is the type of an n-tuple.
698233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_0_TUPLE_(T) tuple<>
699233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
700233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
701233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
702233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
703233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
704233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
705233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
706233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
707233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
709233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
710233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
711233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void, void, void>
713233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
714233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T##7, void, void>
715233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
716233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T##7, T##8, void>
717233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
718233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T##7, T##8, T##9>
719233d2500723e5594f3e7c70896ffeeef32b9c950ywan
720233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
721233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_0_TYPENAMES_(T)
722233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_1_TYPENAMES_(T) typename T##0
723233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
724233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
725233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
726233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3
727233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
728233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3, typename T##4
729233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
730233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3, typename T##4, typename T##5
731233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
732233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3, typename T##4, typename T##5, typename T##6
733233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
734233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
735233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
736233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3, typename T##4, typename T##5, typename T##6, \
737233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##7, typename T##8
738233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
739233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##3, typename T##4, typename T##5, typename T##6, \
740233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T##7, typename T##8, typename T##9
741233d2500723e5594f3e7c70896ffeeef32b9c950ywan
742233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In theory, defining stuff in the ::std namespace is undefined
743233d2500723e5594f3e7c70896ffeeef32b9c950ywan// behavior.  We can do this as we are playing the role of a standard
744233d2500723e5594f3e7c70896ffeeef32b9c950ywan// library vendor.
745233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace std {
746233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace tr1 {
747233d2500723e5594f3e7c70896ffeeef32b9c950ywan
748233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T0 = void, typename T1 = void, typename T2 = void,
749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T3 = void, typename T4 = void, typename T5 = void,
750233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6 = void, typename T7 = void, typename T8 = void,
751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T9 = void>
752233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass tuple;
753233d2500723e5594f3e7c70896ffeeef32b9c950ywan
754233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Anything in namespace gtest_internal is Google Test's INTERNAL
755233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
756233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace gtest_internal {
757233d2500723e5594f3e7c70896ffeeef32b9c950ywan
758233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
759233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
760233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct ByRef { typedef const T& type; };  // NOLINT
761233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
762233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct ByRef<T&> { typedef T& type; };  // NOLINT
763233d2500723e5594f3e7c70896ffeeef32b9c950ywan
764233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A handy wrapper for ByRef.
765233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
766233d2500723e5594f3e7c70896ffeeef32b9c950ywan
767233d2500723e5594f3e7c70896ffeeef32b9c950ywan// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
768233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is the same as tr1::add_reference<T>::type.
769233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
770233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct AddRef { typedef T& type; };  // NOLINT
771233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
772233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct AddRef<T&> { typedef T& type; };  // NOLINT
773233d2500723e5594f3e7c70896ffeeef32b9c950ywan
774233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A handy wrapper for AddRef.
775233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
776233d2500723e5594f3e7c70896ffeeef32b9c950ywan
777233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A helper for implementing get<k>().
778233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <int k> class Get;
779233d2500723e5594f3e7c70896ffeeef32b9c950ywan
780233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A helper for implementing tuple_element<k, T>.  kIndexValid is true
781233d2500723e5594f3e7c70896ffeeef32b9c950ywan// iff k < the number of fields in tuple type T.
782233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <bool kIndexValid, int kIndex, class Tuple>
783233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement;
784233d2500723e5594f3e7c70896ffeeef32b9c950ywan
785233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
786233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
787233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T0 type;
788233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
789233d2500723e5594f3e7c70896ffeeef32b9c950ywan
790233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
791233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
792233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 type;
793233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
794233d2500723e5594f3e7c70896ffeeef32b9c950ywan
795233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
796233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
797233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T2 type;
798233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
799233d2500723e5594f3e7c70896ffeeef32b9c950ywan
800233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
801233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
802233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T3 type;
803233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
804233d2500723e5594f3e7c70896ffeeef32b9c950ywan
805233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
806233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
807233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T4 type;
808233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
809233d2500723e5594f3e7c70896ffeeef32b9c950ywan
810233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
811233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
812233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T5 type;
813233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
814233d2500723e5594f3e7c70896ffeeef32b9c950ywan
815233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
816233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
817233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T6 type;
818233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
819233d2500723e5594f3e7c70896ffeeef32b9c950ywan
820233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
821233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
822233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T7 type;
823233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
824233d2500723e5594f3e7c70896ffeeef32b9c950ywan
825233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
826233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
827233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T8 type;
828233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
829233d2500723e5594f3e7c70896ffeeef32b9c950ywan
830233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
831233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
832233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T9 type;
833233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
834233d2500723e5594f3e7c70896ffeeef32b9c950ywan
835233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace gtest_internal
836233d2500723e5594f3e7c70896ffeeef32b9c950ywan
837233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
838233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass tuple<> {
839233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() {}
841233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& /* t */)  {}
842233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& /* t */) { return *this; }
843233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
844233d2500723e5594f3e7c70896ffeeef32b9c950ywan
845233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_1_TYPENAMES_(T)>
846233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_1_TUPLE_(T) {
847233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
848233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
849233d2500723e5594f3e7c70896ffeeef32b9c950ywan
850233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_() {}
851233d2500723e5594f3e7c70896ffeeef32b9c950ywan
852233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
853233d2500723e5594f3e7c70896ffeeef32b9c950ywan
854233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_) {}
855233d2500723e5594f3e7c70896ffeeef32b9c950ywan
856233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_1_TYPENAMES_(U)>
857233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
858233d2500723e5594f3e7c70896ffeeef32b9c950ywan
859233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
860233d2500723e5594f3e7c70896ffeeef32b9c950ywan
861233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_1_TYPENAMES_(U)>
862233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
863233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
864233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
865233d2500723e5594f3e7c70896ffeeef32b9c950ywan
866233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
867233d2500723e5594f3e7c70896ffeeef32b9c950ywan
868233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_1_TYPENAMES_(U)>
869233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
870233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
871233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
872233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
873233d2500723e5594f3e7c70896ffeeef32b9c950ywan
874233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
875233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
876233d2500723e5594f3e7c70896ffeeef32b9c950ywan
877233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_2_TYPENAMES_(T)>
878233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_2_TUPLE_(T) {
879233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
880233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
881233d2500723e5594f3e7c70896ffeeef32b9c950ywan
882233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_() {}
883233d2500723e5594f3e7c70896ffeeef32b9c950ywan
884233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
885233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f1_(f1) {}
886233d2500723e5594f3e7c70896ffeeef32b9c950ywan
887233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
888233d2500723e5594f3e7c70896ffeeef32b9c950ywan
889233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_2_TYPENAMES_(U)>
890233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U0, typename U1>
892233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
893233d2500723e5594f3e7c70896ffeeef32b9c950ywan
894233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
895233d2500723e5594f3e7c70896ffeeef32b9c950ywan
896233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_2_TYPENAMES_(U)>
897233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
898233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
899233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
900233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U0, typename U1>
901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const ::std::pair<U0, U1>& p) {
902233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = p.first;
903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = p.second;
904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
905233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
906233d2500723e5594f3e7c70896ffeeef32b9c950ywan
907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
908233d2500723e5594f3e7c70896ffeeef32b9c950ywan
909233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_2_TYPENAMES_(U)>
910233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
912233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
913233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
914233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
915233d2500723e5594f3e7c70896ffeeef32b9c950ywan
916233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
917233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
918233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
919233d2500723e5594f3e7c70896ffeeef32b9c950ywan
920233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_3_TYPENAMES_(T)>
921233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_3_TUPLE_(T) {
922233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
923233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
924233d2500723e5594f3e7c70896ffeeef32b9c950ywan
925233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_() {}
926233d2500723e5594f3e7c70896ffeeef32b9c950ywan
927233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
928233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
929233d2500723e5594f3e7c70896ffeeef32b9c950ywan
930233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
931233d2500723e5594f3e7c70896ffeeef32b9c950ywan
932233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_3_TYPENAMES_(U)>
933233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
934233d2500723e5594f3e7c70896ffeeef32b9c950ywan
935233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
936233d2500723e5594f3e7c70896ffeeef32b9c950ywan
937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_3_TYPENAMES_(U)>
938233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
939233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
941233d2500723e5594f3e7c70896ffeeef32b9c950ywan
942233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
943233d2500723e5594f3e7c70896ffeeef32b9c950ywan
944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_3_TYPENAMES_(U)>
945233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
948233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
949233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
950233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
951233d2500723e5594f3e7c70896ffeeef32b9c950ywan
952233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
953233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
954233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
955233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
956233d2500723e5594f3e7c70896ffeeef32b9c950ywan
957233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_4_TYPENAMES_(T)>
958233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_4_TUPLE_(T) {
959233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
960233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
961233d2500723e5594f3e7c70896ffeeef32b9c950ywan
962233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_() {}
963233d2500723e5594f3e7c70896ffeeef32b9c950ywan
964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
965233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
966233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(f3) {}
967233d2500723e5594f3e7c70896ffeeef32b9c950ywan
968233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
969233d2500723e5594f3e7c70896ffeeef32b9c950ywan
970233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_4_TYPENAMES_(U)>
971233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
972233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_) {}
973233d2500723e5594f3e7c70896ffeeef32b9c950ywan
974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
975233d2500723e5594f3e7c70896ffeeef32b9c950ywan
976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_4_TYPENAMES_(U)>
977233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
978233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
979233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
980233d2500723e5594f3e7c70896ffeeef32b9c950ywan
981233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
982233d2500723e5594f3e7c70896ffeeef32b9c950ywan
983233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_4_TYPENAMES_(U)>
984233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
985233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
986233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
987233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
988233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
989233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
990233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
991233d2500723e5594f3e7c70896ffeeef32b9c950ywan
992233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
993233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
994233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
995233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
996233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
997233d2500723e5594f3e7c70896ffeeef32b9c950ywan
998233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_5_TYPENAMES_(T)>
999233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_5_TUPLE_(T) {
1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1001233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f4_(t.f4_) {}
1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_5_TYPENAMES_(U)>
1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_), f4_(t.f4_) {}
1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_5_TYPENAMES_(U)>
1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
1021233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1025233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_5_TYPENAMES_(U)>
1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f4_ = t.f4_;
1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1035233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T4 f4_;
1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1042233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_6_TYPENAMES_(T)>
1043233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_6_TUPLE_(T) {
1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1045233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1049233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f5_(f5) {}
1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f4_(t.f4_), f5_(t.f5_) {}
1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1057233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_6_TYPENAMES_(U)>
1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1059233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_6_TYPENAMES_(U)>
1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_6_TYPENAMES_(U)>
1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
1073233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f4_ = t.f4_;
1077233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f5_ = t.f5_;
1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T4 f4_;
1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T5 f5_;
1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1089233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_7_TYPENAMES_(T)>
1090233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_7_TUPLE_(T) {
1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
1095233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1097233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_7_TYPENAMES_(U)>
1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1106233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_7_TYPENAMES_(U)>
1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
1116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_7_TYPENAMES_(U)>
1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
1119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f4_ = t.f4_;
1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f5_ = t.f5_;
1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f6_ = t.f6_;
1126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T4 f4_;
1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T5 f5_;
1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T6 f6_;
1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1138233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_8_TYPENAMES_(T)>
1139233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_8_TUPLE_(T) {
1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1146233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f5_(f5), f6_(f6), f7_(f7) {}
1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_8_TYPENAMES_(U)>
1155233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1159233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_8_TYPENAMES_(U)>
1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
1166233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_8_TYPENAMES_(U)>
1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f4_ = t.f4_;
1174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f5_ = t.f5_;
1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f6_ = t.f6_;
1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f7_ = t.f7_;
1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1179233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
1184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T4 f4_;
1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T5 f5_;
1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T6 f6_;
1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T7 f7_;
1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1190233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_9_TYPENAMES_(T)>
1191233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_9_TUPLE_(T) {
1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1198233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
1202233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1204233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
1205233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1206233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_9_TYPENAMES_(U)>
1207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1208233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
1209233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1211233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_9_TYPENAMES_(U)>
1213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
1214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
1215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1216233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
1218233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_9_TYPENAMES_(U)>
1220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
1221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
1222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
1223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
1224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
1225233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f4_ = t.f4_;
1226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f5_ = t.f5_;
1227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f6_ = t.f6_;
1228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f7_ = t.f7_;
1229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f8_ = t.f8_;
1230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
1231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1232233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
1234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
1235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
1236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
1237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T4 f4_;
1238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T5 f5_;
1239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T6 f6_;
1240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T7 f7_;
1241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T8 f8_;
1242233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1243233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1244233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
1245233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass tuple {
1246233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1247233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <int k> friend class gtest_internal::Get;
1248233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
1250233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f9_() {}
1251233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1252233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
1253233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
1254233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
1255233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
1256233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
1257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
1259233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
1260233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_10_TYPENAMES_(U)>
1262233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
1263233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
1264233d2500723e5594f3e7c70896ffeeef32b9c950ywan      f9_(t.f9_) {}
1265233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1267233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_10_TYPENAMES_(U)>
1269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
1270233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CopyFrom(t);
1271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1272233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DECLARE_TUPLE_AS_FRIEND_
1274233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1275233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <GTEST_10_TYPENAMES_(U)>
1276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
1277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f0_ = t.f0_;
1278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f1_ = t.f1_;
1279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f2_ = t.f2_;
1280233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f3_ = t.f3_;
1281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f4_ = t.f4_;
1282233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f5_ = t.f5_;
1283233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f6_ = t.f6_;
1284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f7_ = t.f7_;
1285233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f8_ = t.f8_;
1286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    f9_ = t.f9_;
1287233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
1288233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1289233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T0 f0_;
1291233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T1 f1_;
1292233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T2 f2_;
1293233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T3 f3_;
1294233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T4 f4_;
1295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T5 f5_;
1296233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T6 f6_;
1297233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T7 f7_;
1298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T8 f8_;
1299233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T9 f9_;
1300233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1301233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1302233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 6.1.3.2 Tuple creation functions.
1303233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1304233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Known limitations: we don't support passing an
1305233d2500723e5594f3e7c70896ffeeef32b9c950ywan// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
1306233d2500723e5594f3e7c70896ffeeef32b9c950ywan// implement tie().
1307233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1308233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline tuple<> make_tuple() { return tuple<>(); }
1309233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1310233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_1_TYPENAMES_(T)>
1311233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
1312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_1_TUPLE_(T)(f0);
1313233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1314233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1315233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_2_TYPENAMES_(T)>
1316233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
1317233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_2_TUPLE_(T)(f0, f1);
1318233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1319233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1320233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_3_TYPENAMES_(T)>
1321233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
1322233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_3_TUPLE_(T)(f0, f1, f2);
1323233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1324233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1325233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_4_TYPENAMES_(T)>
1326233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3) {
1328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
1329233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1330233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1331233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_5_TYPENAMES_(T)>
1332233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3, const T4& f4) {
1334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
1335233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1336233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1337233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_6_TYPENAMES_(T)>
1338233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3, const T4& f4, const T5& f5) {
1340233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
1341233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1342233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1343233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_7_TYPENAMES_(T)>
1344233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
1346233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
1347233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1348233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1349233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_8_TYPENAMES_(T)>
1350233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1351233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
1352233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
1353233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1354233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1355233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_9_TYPENAMES_(T)>
1356233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
1358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T8& f8) {
1359233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
1360233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1361233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1362233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
1363233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
1364233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
1365233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T8& f8, const T9& f9) {
1366233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
1367233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1368233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1369233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 6.1.3.3 Tuple helper classes.
1370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1371233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Tuple> struct tuple_size;
1372233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1373233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_0_TYPENAMES_(T)>
1374233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_0_TUPLE_(T) > {
1375233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 0;
1376233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1377233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1378233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_1_TYPENAMES_(T)>
1379233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_1_TUPLE_(T) > {
1380233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 1;
1381233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1382233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1383233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_2_TYPENAMES_(T)>
1384233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_2_TUPLE_(T) > {
1385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 2;
1386233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1387233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1388233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_3_TYPENAMES_(T)>
1389233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_3_TUPLE_(T) > {
1390233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 3;
1391233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1392233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1393233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_4_TYPENAMES_(T)>
1394233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_4_TUPLE_(T) > {
1395233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 4;
1396233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1397233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1398233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_5_TYPENAMES_(T)>
1399233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_5_TUPLE_(T) > {
1400233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 5;
1401233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1402233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1403233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_6_TYPENAMES_(T)>
1404233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_6_TUPLE_(T) > {
1405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 6;
1406233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1407233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1408233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_7_TYPENAMES_(T)>
1409233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_7_TUPLE_(T) > {
1410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 7;
1411233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1412233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1413233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_8_TYPENAMES_(T)>
1414233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_8_TUPLE_(T) > {
1415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 8;
1416233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1417233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1418233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_9_TYPENAMES_(T)>
1419233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_9_TUPLE_(T) > {
1420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 9;
1421233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1422233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1423233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T)>
1424233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_size<GTEST_10_TUPLE_(T) > {
1425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int value = 10;
1426233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1427233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1428233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <int k, class Tuple>
1429233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct tuple_element {
1430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename gtest_internal::TupleElement<
1431233d2500723e5594f3e7c70896ffeeef32b9c950ywan      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
1432233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1434233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
1435233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1436233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 6.1.3.4 Element access.
1437233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1438233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace gtest_internal {
1439233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1440233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1441233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<0> {
1442233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1443233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
1445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f0_; }  // NOLINT
1446233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1447233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
1449233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f0_; }
1450233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1451233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1452233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1453233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<1> {
1454233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
1457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f1_; }  // NOLINT
1458233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1459233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
1461233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f1_; }
1462233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1463233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1464233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1465233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<2> {
1466233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1467233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1468233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
1469233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f2_; }  // NOLINT
1470233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
1473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f2_; }
1474233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1475233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1476233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1477233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<3> {
1478233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1479233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1480233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
1481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f3_; }  // NOLINT
1482233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1484233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
1485233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f3_; }
1486233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1487233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1488233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1489233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<4> {
1490233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1491233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
1493233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f4_; }  // NOLINT
1494233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1495233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1496233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
1497233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f4_; }
1498233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1500233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1501233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<5> {
1502233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1504233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
1505233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f5_; }  // NOLINT
1506233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1508233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
1509233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f5_; }
1510233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1511233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1512233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1513233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<6> {
1514233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1516233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
1517233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f6_; }  // NOLINT
1518233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
1521233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f6_; }
1522233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1523233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1524233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1525233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<7> {
1526233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1527233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
1529233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f7_; }  // NOLINT
1530233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1531233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1532233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
1533233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f7_; }
1534233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1535233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1536233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1537233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<8> {
1538233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1539233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1540233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
1541233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f8_; }  // NOLINT
1542233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1543233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1544233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
1545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f8_; }
1546233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1547233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1548233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1549233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Get<9> {
1550233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1551233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1552233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
1553233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Field(Tuple& t) { return t.f9_; }  // NOLINT
1554233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1555233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple>
1556233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
1557233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstField(const Tuple& t) { return t.f9_; }
1558233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1559233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1560233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace gtest_internal
1561233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1562233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <int k, GTEST_10_TYPENAMES_(T)>
1563233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
1564233d2500723e5594f3e7c70896ffeeef32b9c950ywanget(GTEST_10_TUPLE_(T)& t) {
1565233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return gtest_internal::Get<k>::Field(t);
1566233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1567233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1568233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <int k, GTEST_10_TYPENAMES_(T)>
1569233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
1570233d2500723e5594f3e7c70896ffeeef32b9c950ywanget(const GTEST_10_TUPLE_(T)& t) {
1571233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return gtest_internal::Get<k>::ConstField(t);
1572233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1573233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1574233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 6.1.3.5 Relational operators
1575233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1576233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We only implement == and !=, as we don't have a need for the rest yet.
1577233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1578233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace gtest_internal {
1579233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1580233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
1581233d2500723e5594f3e7c70896ffeeef32b9c950ywan// first k fields of t1 equals the first k fields of t2.
1582233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
1583233d2500723e5594f3e7c70896ffeeef32b9c950ywan// k1 != k2.
1584233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <int kSize1, int kSize2>
1585233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct SameSizeTuplePrefixComparator;
1586233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1587233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
1588233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct SameSizeTuplePrefixComparator<0, 0> {
1589233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple1, class Tuple2>
1590233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
1591233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return true;
1592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1593233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1594233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1595233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <int k>
1596233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct SameSizeTuplePrefixComparator<k, k> {
1597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class Tuple1, class Tuple2>
1598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
1599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
1600233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
1601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1602233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1603233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1604233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace gtest_internal
1605233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1606233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
1607233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool operator==(const GTEST_10_TUPLE_(T)& t,
1608233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       const GTEST_10_TUPLE_(U)& u) {
1609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return gtest_internal::SameSizeTuplePrefixComparator<
1610233d2500723e5594f3e7c70896ffeeef32b9c950ywan      tuple_size<GTEST_10_TUPLE_(T) >::value,
1611233d2500723e5594f3e7c70896ffeeef32b9c950ywan      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
1612233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1613233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1614233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
1615233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool operator!=(const GTEST_10_TUPLE_(T)& t,
1616233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
1617233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1618233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 6.1.4 Pairs.
1619233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Unimplemented.
1620233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1621233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace tr1
1622233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace std
1623233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1624233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_0_TUPLE_
1625233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_1_TUPLE_
1626233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_2_TUPLE_
1627233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_3_TUPLE_
1628233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_4_TUPLE_
1629233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_5_TUPLE_
1630233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_6_TUPLE_
1631233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_7_TUPLE_
1632233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_8_TUPLE_
1633233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_9_TUPLE_
1634233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_10_TUPLE_
1635233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1636233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_0_TYPENAMES_
1637233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_1_TYPENAMES_
1638233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_2_TYPENAMES_
1639233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_3_TYPENAMES_
1640233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_4_TYPENAMES_
1641233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_5_TYPENAMES_
1642233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_6_TYPENAMES_
1643233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_7_TYPENAMES_
1644233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_8_TYPENAMES_
1645233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_9_TYPENAMES_
1646233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_10_TYPENAMES_
1647233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1648233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
1649233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_BY_REF_
1650233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_ADD_REF_
1651233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_TUPLE_ELEMENT_
1652233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1653233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
1654233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif GTEST_ENV_HAS_STD_TUPLE_
1655233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  include <tuple>
1656233d2500723e5594f3e7c70896ffeeef32b9c950ywan// C++11 puts its tuple into the ::std namespace rather than
1657233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
1658233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This causes undefined behavior, but supported compilers react in
1659233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the way we intend.
1660233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace std {
1661233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace tr1 {
1662233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::get;
1663233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::make_tuple;
1664233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::tuple;
1665233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::tuple_element;
1666233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing ::std::tuple_size;
1667233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1668233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1669233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1670233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif GTEST_OS_SYMBIAN
1671233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1672233d2500723e5594f3e7c70896ffeeef32b9c950ywan// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
1673233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use STLport's tuple implementation, which unfortunately doesn't
1674233d2500723e5594f3e7c70896ffeeef32b9c950ywan// work as the copy of STLport distributed with Symbian is incomplete.
1675233d2500723e5594f3e7c70896ffeeef32b9c950ywan// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
1676233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use its own tuple implementation.
1677233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  ifdef BOOST_HAS_TR1_TUPLE
1678233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   undef BOOST_HAS_TR1_TUPLE
1679233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif  // BOOST_HAS_TR1_TUPLE
1680233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1681233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This prevents <boost/tr1/detail/config.hpp>, which defines
1682233d2500723e5594f3e7c70896ffeeef32b9c950ywan// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
1683233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
1684233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  include <tuple>
1685233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1686233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
1687233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
1688233d2500723e5594f3e7c70896ffeeef32b9c950ywan// not conform to the TR1 spec, which requires the header to be <tuple>.
1689233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1690233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
1691233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
1692233d2500723e5594f3e7c70896ffeeef32b9c950ywan// which is #included by <tr1/tuple>, to not compile when RTTI is
1693233d2500723e5594f3e7c70896ffeeef32b9c950ywan// disabled.  _TR1_FUNCTIONAL is the header guard for
1694233d2500723e5594f3e7c70896ffeeef32b9c950ywan// <tr1/functional>.  Hence the following #define is a hack to prevent
1695233d2500723e5594f3e7c70896ffeeef32b9c950ywan// <tr1/functional> from being included.
1696233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define _TR1_FUNCTIONAL 1
1697233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   include <tr1/tuple>
1698233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   undef _TR1_FUNCTIONAL  // Allows the user to #include
1699233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        // <tr1/functional> if he chooses to.
1700233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
1701233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   include <tr1/tuple>  // NOLINT
1702233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
1703233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1704233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
1705233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If the compiler is not GCC 4.0+, we assume the user is using a
1706233d2500723e5594f3e7c70896ffeeef32b9c950ywan// spec-conforming TR1 implementation.
1707233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  include <tuple>  // NOLINT
1708233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_USE_OWN_TR1_TUPLE
1709233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1710233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TR1_TUPLE
1711233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1712233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether clone(2) is supported.
1713233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Usually it will only be available on Linux, excluding
1714233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Linux on the Itanium architecture.
1715233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Also see http://linux.die.net/man/2/clone.
1716233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_CLONE
1717233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us, so we need to figure it out.
1718233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1719233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_OS_LINUX && !defined(__ia64__)
1720233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  if GTEST_OS_LINUX_ANDROID
1721233d2500723e5594f3e7c70896ffeeef32b9c950ywan// On Android, clone() is only available on ARM starting with Gingerbread.
1722233d2500723e5594f3e7c70896ffeeef32b9c950ywan#    if defined(__arm__) && __ANDROID_API__ >= 9
1723233d2500723e5594f3e7c70896ffeeef32b9c950ywan#     define GTEST_HAS_CLONE 1
1724233d2500723e5594f3e7c70896ffeeef32b9c950ywan#    else
1725233d2500723e5594f3e7c70896ffeeef32b9c950ywan#     define GTEST_HAS_CLONE 0
1726233d2500723e5594f3e7c70896ffeeef32b9c950ywan#    endif
1727233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
1728233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   define GTEST_HAS_CLONE 1
1729233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif
1730233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
1731233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_CLONE 0
1732233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_OS_LINUX && !defined(__ia64__)
1733233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1734233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_CLONE
1735233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1736233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether to support stream redirection. This is used to test
1737233d2500723e5594f3e7c70896ffeeef32b9c950ywan// output correctness and to implement death tests.
1738233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_STREAM_REDIRECTION
1739233d2500723e5594f3e7c70896ffeeef32b9c950ywan// By default, we assume that stream redirection is supported on all
1740233d2500723e5594f3e7c70896ffeeef32b9c950ywan// platforms except known mobile ones.
1741233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
1742233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_STREAM_REDIRECTION 0
1743233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
1744233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_STREAM_REDIRECTION 1
1745233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
1746233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_STREAM_REDIRECTION
1747233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1748233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether to support death tests.
1749233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test does not support death tests for VC 7.1 and earlier as
1750233d2500723e5594f3e7c70896ffeeef32b9c950ywan// abort() in a VC 7.1 application compiled as GUI in debug config
1751233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pops up a dialog window that cannot be suppressed programmatically.
1752233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
1753233d2500723e5594f3e7c70896ffeeef32b9c950ywan     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
1754233d2500723e5594f3e7c70896ffeeef32b9c950ywan     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
1755233d2500723e5594f3e7c70896ffeeef32b9c950ywan     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
1756233d2500723e5594f3e7c70896ffeeef32b9c950ywan     GTEST_OS_OPENBSD || GTEST_OS_QNX)
1757233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_DEATH_TEST 1
1758233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <vector>  // NOLINT
1759233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1760233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1761233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
1762233d2500723e5594f3e7c70896ffeeef32b9c950ywan// all the compilers we care about are adequate for supporting
1763233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value-parameterized tests.
1764233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_HAS_PARAM_TEST 1
1765233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1766233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether to support type-driven tests.
1767233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1768233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
1769233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Sun Pro CC, IBM Visual Age, and HP aCC support.
1770233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
1771233d2500723e5594f3e7c70896ffeeef32b9c950ywan    defined(__IBMCPP__) || defined(__HP_aCC)
1772233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_TYPED_TEST 1
1773233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_TYPED_TEST_P 1
1774233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1775233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1776233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether to support Combine(). This only makes sense when
1777233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value-parameterized tests are enabled.  The implementation doesn't
1778233d2500723e5594f3e7c70896ffeeef32b9c950ywan// work on Sun Studio since it doesn't understand templated conversion
1779233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operators.
1780233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
1781233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_COMBINE 1
1782233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1783233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1784233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether the system compiler uses UTF-16 for encoding wide strings.
1785233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_WIDE_STRING_USES_UTF16_ \
1786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
1787233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1788233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determines whether test results can be streamed to a socket.
1789233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_LINUX
1790233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_CAN_STREAM_RESULTS_ 1
1791233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1792233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1793233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines some utility macros.
1794233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1795233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The GNU compiler emits a warning if nested "if" statements are followed by
1796233d2500723e5594f3e7c70896ffeeef32b9c950ywan// an "else" statement and braces are not used to explicitly disambiguate the
1797233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "else" binding.  This leads to problems with code like:
1798233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1799233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   if (gate)
1800233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     ASSERT_*(condition) << "Some message";
1801233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1802233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The "switch (0) case 0:" idiom is used to suppress this.
1803233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __INTEL_COMPILER
1804233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
1805233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1806233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
1807233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1808233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1809233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Use this annotation at the end of a struct/class definition to
1810233d2500723e5594f3e7c70896ffeeef32b9c950ywan// prevent the compiler from optimizing away instances that are never
1811233d2500723e5594f3e7c70896ffeeef32b9c950ywan// used.  This is useful when all interesting logic happens inside the
1812233d2500723e5594f3e7c70896ffeeef32b9c950ywan// c'tor and / or d'tor.  Example:
1813233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1814233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   struct Foo {
1815233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Foo() { ... }
1816233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   } GTEST_ATTRIBUTE_UNUSED_;
1817233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1818233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Also use it after a variable or parameter declaration to tell the
1819233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compiler the variable/parameter does not have to be used.
1820233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__GNUC__) && !defined(COMPILER_ICC)
1821233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
1822233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1823233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_ATTRIBUTE_UNUSED_
1824233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1825233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1826233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A macro to disallow operator=
1827233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This should be used in the private: declarations for a class.
1828233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DISALLOW_ASSIGN_(type)\
1829233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(type const &)
1830233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1831233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A macro to disallow copy constructor and operator=
1832233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This should be used in the private: declarations for a class.
1833233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
1834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  type(type const &);\
1835233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_ASSIGN_(type)
1836233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1837233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Tell the compiler to warn about unused return values for functions declared
1838233d2500723e5594f3e7c70896ffeeef32b9c950ywan// with this macro.  The macro should be used on function declarations
1839233d2500723e5594f3e7c70896ffeeef32b9c950ywan// following the argument list:
1840233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1841233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
1842233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
1843233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
1844233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1845233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_MUST_USE_RESULT_
1846233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
1847233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1848233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Determine whether the compiler supports Microsoft's Structured Exception
1849233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Handling.  This is supported by several Windows compilers but generally
1850233d2500723e5594f3e7c70896ffeeef32b9c950ywan// does not exist on any other system.
1851233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_HAS_SEH
1852233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user didn't tell us, so we need to figure it out.
1853233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1854233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if defined(_MSC_VER) || defined(__BORLANDC__)
1855233d2500723e5594f3e7c70896ffeeef32b9c950ywan// These two compilers are known to support SEH.
1856233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_SEH 1
1857233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
1858233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Assume no SEH.
1859233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_HAS_SEH 0
1860233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
1861233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1862233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_SEH
1863233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1864233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
1865233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1866233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_LINKED_AS_SHARED_LIBRARY
1867233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_API_ __declspec(dllimport)
1868233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif GTEST_CREATE_SHARED_LIBRARY
1869233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_API_ __declspec(dllexport)
1870233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
1871233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1872233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // _MSC_VER
1873233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1874233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_API_
1875233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_API_
1876233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1877233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1878233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __GNUC__
1879233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Ask the compiler to never inline a given function.
1880233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_NO_INLINE_ __attribute__((noinline))
1881233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1882233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_NO_INLINE_
1883233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1884233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1885233d2500723e5594f3e7c70896ffeeef32b9c950ywan// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
1886233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
1887233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_CXXABI_H_ 1
1888233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1889233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_CXXABI_H_ 0
1890233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1891233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1892233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
1893233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1894233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Message;
1895233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1896233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
1897233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1898233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A secret type that Google Test users don't know about.  It has no
1899233d2500723e5594f3e7c70896ffeeef32b9c950ywan// definition on purpose.  Therefore it's impossible to create a
1900233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Secret object, which is what we want.
1901233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Secret;
1902233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1903233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
1904233d2500723e5594f3e7c70896ffeeef32b9c950ywan// expression is true. For example, you could use it to verify the
1905233d2500723e5594f3e7c70896ffeeef32b9c950ywan// size of a static array:
1906233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1907233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
1908233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         content_type_names_incorrect_size);
1909233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1910233d2500723e5594f3e7c70896ffeeef32b9c950ywan// or to make sure a struct is smaller than a certain size:
1911233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1912233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
1913233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1914233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The second argument to the macro is the name of the variable. If
1915233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the expression is false, most compilers will issue a warning/error
1916233d2500723e5594f3e7c70896ffeeef32b9c950ywan// containing the name of the variable.
1917233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1918233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <bool>
1919233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct CompileAssert {
1920233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
1921233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1922233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_COMPILE_ASSERT_(expr, msg) \
1923233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
1924233d2500723e5594f3e7c70896ffeeef32b9c950ywan      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
1925233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1926233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implementation details of GTEST_COMPILE_ASSERT_:
1927233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1928233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
1929233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   elements (and thus is invalid) when the expression is false.
1930233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1931233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - The simpler definition
1932233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1933233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
1934233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1935233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   does not work, as gcc supports variable-length arrays whose sizes
1936233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   are determined at run-time (this is gcc's extension and not part
1937233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   of the C++ standard).  As a result, gcc fails to reject the
1938233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   following code with the simple definition:
1939233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1940233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     int foo;
1941233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
1942233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                                      // not a compile-time constant.
1943233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1944233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - By using the type CompileAssert<(bool(expr))>, we ensures that
1945233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   expr is a compile-time constant.  (Template arguments must be
1946233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   determined at compile-time.)
1947233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1948233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
1949233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
1950233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1951233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     CompileAssert<bool(expr)>
1952233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1953233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   instead, these compilers will refuse to compile
1954233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1955233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
1956233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1957233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   (They seem to think the ">" in "5 > 0" marks the end of the
1958233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   template argument list.)
1959233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1960233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - The array size is (bool(expr) ? 1 : -1), instead of simply
1961233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1962233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     ((expr) ? 1 : -1).
1963233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1964233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   This is to avoid running into a bug in MS VC 7.1, which
1965233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
1966233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1967233d2500723e5594f3e7c70896ffeeef32b9c950ywan// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
1968233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
1969233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This template is declared, but intentionally undefined.
1970233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
1971233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct StaticAssertTypeEqHelper;
1972233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1973233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
1974233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct StaticAssertTypeEqHelper<T, T> {};
1975233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1976233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_STRING
1977233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef ::string string;
1978233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1979233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef ::std::string string;
1980233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_STRING
1981233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1982233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_WSTRING
1983233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef ::wstring wstring;
1984233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif GTEST_HAS_STD_WSTRING
1985233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef ::std::wstring wstring;
1986233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_WSTRING
1987233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1988233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A helper for suppressing warnings on constant condition.  It just
1989233d2500723e5594f3e7c70896ffeeef32b9c950ywan// returns 'condition'.
1990233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ bool IsTrue(bool condition);
1991233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1992233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines scoped_ptr.
1993233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1994233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This implementation of scoped_ptr is PARTIAL - it only contains
1995233d2500723e5594f3e7c70896ffeeef32b9c950ywan// enough stuff to satisfy Google Test's need.
1996233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
1997233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass scoped_ptr {
1998233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
1999233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T element_type;
2000233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2001233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
2002233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~scoped_ptr() { reset(); }
2003233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2004233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T& operator*() const { return *ptr_; }
2005233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* operator->() const { return ptr_; }
2006233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* get() const { return ptr_; }
2007233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2008233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* release() {
2009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T* const ptr = ptr_;
2010233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ptr_ = NULL;
2011233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ptr;
2012233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2013233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2014233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void reset(T* p = NULL) {
2015233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (p != ptr_) {
2016233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
2017233d2500723e5594f3e7c70896ffeeef32b9c950ywan        delete ptr_;
2018233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
2019233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ptr_ = p;
2020233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
2021233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2022233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2023233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2024233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* ptr_;
2025233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2026233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
2027233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2028233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2029233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines RE.
2030233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2031233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
2032233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Regular Expression syntax.
2033233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ RE {
2034233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2035233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A copy constructor is required by the Standard to initialize object
2036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // references from r-values.
2037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RE(const RE& other) { Init(other.pattern()); }
2038233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2039233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructs an RE from a string.
2040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
2041233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2042233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_STRING
2043233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2044233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
2045233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2046233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_STRING
2047233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2048233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RE(const char* regex) { Init(regex); }  // NOLINT
2049233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~RE();
2050233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2051233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the string representation of the regex.
2052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* pattern() const { return pattern_; }
2053233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2054233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // FullMatch(str, re) returns true iff regular expression re matches
2055233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the entire str.
2056233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // PartialMatch(str, re) returns true iff regular expression re
2057233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // matches a substring of str (including str itself).
2058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
2059233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TODO(wan@google.com): make FullMatch() and PartialMatch() work
2060233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // when str contains NUL characters.
2061233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool FullMatch(const ::std::string& str, const RE& re) {
2062233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return FullMatch(str.c_str(), re);
2063233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2064233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool PartialMatch(const ::std::string& str, const RE& re) {
2065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return PartialMatch(str.c_str(), re);
2066233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2067233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2068233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_STRING
2069233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2070233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool FullMatch(const ::string& str, const RE& re) {
2071233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return FullMatch(str.c_str(), re);
2072233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2073233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool PartialMatch(const ::string& str, const RE& re) {
2074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return PartialMatch(str.c_str(), re);
2075233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2076233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2077233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_STRING
2078233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool FullMatch(const char* str, const RE& re);
2080233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool PartialMatch(const char* str, const RE& re);
2081233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2082233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2083233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Init(const char* regex);
2084233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2085233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We use a const char* instead of an std::string, as Google Test used to be
2086233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // used where std::string is not available.  TODO(wan@google.com): change to
2087233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // std::string.
2088233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* pattern_;
2089233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool is_valid_;
2090233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2091233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_USES_POSIX_RE
2092233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2093233d2500723e5594f3e7c70896ffeeef32b9c950ywan  regex_t full_regex_;     // For FullMatch().
2094233d2500723e5594f3e7c70896ffeeef32b9c950ywan  regex_t partial_regex_;  // For PartialMatch().
2095233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2096233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else  // GTEST_USES_SIMPLE_RE
2097233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2098233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* full_pattern_;  // For FullMatch();
2099233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2100233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2101233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_ASSIGN_(RE);
2103233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2105233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Formats a source file path and a line number as they would appear
2106233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in an error message from the compiler used to compile this code.
2107233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
2108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2109233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Formats a file location for compiler-independent XML output.
2110233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Although this function is not platform dependent, we put it next to
2111233d2500723e5594f3e7c70896ffeeef32b9c950ywan// FormatFileLocation in order to contrast the two functions.
2112233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
2113233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                               int line);
2114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2115233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines logging utilities:
2116233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
2117233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                          message itself is streamed into the macro.
2118233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   LogToStderr()  - directs all log messages to stderr.
2119233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   FlushInfoLog() - flushes informational log messages.
2120233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2121233d2500723e5594f3e7c70896ffeeef32b9c950ywanenum GTestLogSeverity {
2122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_INFO,
2123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_WARNING,
2124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ERROR,
2125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_FATAL
2126233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2128233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Formats log entry severity, provides a stream object for streaming the
2129233d2500723e5594f3e7c70896ffeeef32b9c950ywan// log message, and terminates the message with a newline when going out of
2130233d2500723e5594f3e7c70896ffeeef32b9c950ywan// scope.
2131233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ GTestLog {
2132233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTestLog(GTestLogSeverity severity, const char* file, int line);
2134233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
2136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~GTestLog();
2137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::std::ostream& GetStream() { return ::std::cerr; }
2139233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2140233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const GTestLogSeverity severity_;
2142233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
2144233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2145233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2146233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_LOG_(severity) \
2147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
2148233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  __FILE__, __LINE__).GetStream()
2149233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2150233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void LogToStderr() {}
2151233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void FlushInfoLog() { fflush(NULL); }
2152233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2153233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE.
2154233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2155233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
2156233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is not satisfied.
2157233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  Synopsys:
2158233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    GTEST_CHECK_(boolean_condition);
2159233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     or
2160233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    GTEST_CHECK_(boolean_condition) << "Additional message";
2161233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2162233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    This checks the condition and if the condition is not satisfied
2163233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    it prints message about the condition violation, including the
2164233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    condition itself, plus additional message streamed into it, if any,
2165233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    and then it aborts the program. It aborts the program irrespective of
2166233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    whether it is built in the debug mode or not.
2167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_CHECK_(condition) \
2168233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
2169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (::testing::internal::IsTrue(condition)) \
2170233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ; \
2171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else \
2172233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
2173233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2174233d2500723e5594f3e7c70896ffeeef32b9c950ywan// An all-mode assert to verify that the given POSIX-style function
2175233d2500723e5594f3e7c70896ffeeef32b9c950ywan// call returns 0 (indicating success).  Known limitation: this
2176233d2500723e5594f3e7c70896ffeeef32b9c950ywan// doesn't expand to a balanced 'if' statement, so enclose the macro
2177233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in {} if you need to use it as the only statement in an 'if'
2178233d2500723e5594f3e7c70896ffeeef32b9c950ywan// branch.
2179233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
2180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (const int gtest_error = (posix_call)) \
2181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
2182233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      << gtest_error
2183233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2184233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2185233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2186233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Use ImplicitCast_ as a safe version of static_cast for upcasting in
2187233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
2188233d2500723e5594f3e7c70896ffeeef32b9c950ywan// const Foo*).  When you use ImplicitCast_, the compiler checks that
2189233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the cast is safe.  Such explicit ImplicitCast_s are necessary in
2190233d2500723e5594f3e7c70896ffeeef32b9c950ywan// surprisingly many situations where C++ demands an exact type match
2191233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instead of an argument type convertable to a target type.
2192233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2193233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The syntax for using ImplicitCast_ is the same as for static_cast:
2194233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2195233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ImplicitCast_<ToType>(expr)
2196233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2197233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ImplicitCast_ would have been part of the C++ standard library,
2198233d2500723e5594f3e7c70896ffeeef32b9c950ywan// but the proposal was submitted too late.  It will probably make
2199233d2500723e5594f3e7c70896ffeeef32b9c950ywan// its way into the language in the future.
2200233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2201233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This relatively ugly name is intentional. It prevents clashes with
2202233d2500723e5594f3e7c70896ffeeef32b9c950ywan// similar functions users may have (e.g., implicit_cast). The internal
2203233d2500723e5594f3e7c70896ffeeef32b9c950ywan// namespace alone is not enough because the function can be found by ADL.
2204233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename To>
2205233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline To ImplicitCast_(To x) { return x; }
2206233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2207233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When you upcast (that is, cast a pointer from type Foo to type
2208233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
2209233d2500723e5594f3e7c70896ffeeef32b9c950ywan// always succeed.  When you downcast (that is, cast a pointer from
2210233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
2211233d2500723e5594f3e7c70896ffeeef32b9c950ywan// how do you know the pointer is really of type SubclassOfFoo?  It
2212233d2500723e5594f3e7c70896ffeeef32b9c950ywan// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
2213233d2500723e5594f3e7c70896ffeeef32b9c950ywan// when you downcast, you should use this macro.  In debug mode, we
2214233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use dynamic_cast<> to double-check the downcast is legal (we die
2215233d2500723e5594f3e7c70896ffeeef32b9c950ywan// if it's not).  In normal mode, we do the efficient static_cast<>
2216233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instead.  Thus, it's important to test in debug mode to make sure
2217233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the cast is legal!
2218233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    This is the only place in the code we should use dynamic_cast<>.
2219233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In particular, you SHOULDN'T be using dynamic_cast<> in order to
2220233d2500723e5594f3e7c70896ffeeef32b9c950ywan// do RTTI (eg code like this:
2221233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
2222233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
2223233d2500723e5594f3e7c70896ffeeef32b9c950ywan// You should design the code some other way not to need this.
2224233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2225233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This relatively ugly name is intentional. It prevents clashes with
2226233d2500723e5594f3e7c70896ffeeef32b9c950ywan// similar functions users may have (e.g., down_cast). The internal
2227233d2500723e5594f3e7c70896ffeeef32b9c950ywan// namespace alone is not enough because the function can be found by ADL.
2228233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename To, typename From>  // use like this: DownCast_<T*>(foo);
2229233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline To DownCast_(From* f) {  // so we only accept pointers
2230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Ensures that To is a sub-type of From *.  This test is here only
2231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // for compile-time type checking, and has no overhead in an
2232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // optimized build at run-time, as it will be optimized away
2233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // completely.
2234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (false) {
2235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const To to = NULL;
2236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::internal::ImplicitCast_<From*>(to);
2237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2238233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2239233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_RTTI
2240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // RTTI: debug mode only!
2241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
2242233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2243233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return static_cast<To>(f);
2244233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2245233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2246233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Downcasts the pointer of type Base to Derived.
2247233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Derived must be a subclass of Base. The parameter MUST
2248233d2500723e5594f3e7c70896ffeeef32b9c950ywan// point to a class of type Derived, not any subclass of it.
2249233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When RTTI is available, the function performs a runtime
2250233d2500723e5594f3e7c70896ffeeef32b9c950ywan// check to enforce this.
2251233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Derived, class Base>
2252233d2500723e5594f3e7c70896ffeeef32b9c950ywanDerived* CheckedDowncastToActualType(Base* base) {
2253233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_RTTI
2254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_CHECK_(typeid(*base) == typeid(Derived));
2255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return dynamic_cast<Derived*>(base);  // NOLINT
2256233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2257233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return static_cast<Derived*>(base);  // Poor man's downcast.
2258233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2259233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2260233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2261233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_STREAM_REDIRECTION
2262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2263233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines the stderr capturer:
2264233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   CaptureStdout     - starts capturing stdout.
2265233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GetCapturedStdout - stops capturing stdout and returns the captured string.
2266233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   CaptureStderr     - starts capturing stderr.
2267233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GetCapturedStderr - stops capturing stderr and returns the captured string.
2268233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2269233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void CaptureStdout();
2270233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ std::string GetCapturedStdout();
2271233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void CaptureStderr();
2272233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ std::string GetCapturedStderr();
2273233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2274233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_STREAM_REDIRECTION
2275233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2276233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2277233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_DEATH_TEST
2278233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2279233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst ::std::vector<testing::internal::string>& GetInjectableArgvs();
2280233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid SetInjectableArgvs(const ::std::vector<testing::internal::string>*
2281233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             new_argvs);
2282233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2283233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A copy of all command line arguments.  Set by InitGoogleTest().
2284233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern ::std::vector<testing::internal::string> g_argvs;
2285233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2286233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_DEATH_TEST
2287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2288233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines synchronization primitives.
2289233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2290233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PTHREAD
2291233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2292233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Sleeps for (roughly) n milli-seconds.  This function is only for
2293233d2500723e5594f3e7c70896ffeeef32b9c950ywan// testing Google Test's own constructs.  Don't use it in user tests,
2294233d2500723e5594f3e7c70896ffeeef32b9c950ywan// either directly or indirectly.
2295233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void SleepMilliseconds(int n) {
2296233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const timespec time = {
2297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    0,                  // 0 seconds.
2298233d2500723e5594f3e7c70896ffeeef32b9c950ywan    n * 1000L * 1000L,  // And n ms.
2299233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
2300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  nanosleep(&time, NULL);
2301233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2302233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2303233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Allows a controller thread to pause execution of newly created
2304233d2500723e5594f3e7c70896ffeeef32b9c950ywan// threads until notified.  Instances of this class must be created
2305233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and destroyed in the controller thread.
2306233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2307233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This class is only for testing Google Test's own constructs. Do not
2308233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use it in user tests, either directly or indirectly.
2309233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Notification {
2310233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2311233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Notification() : notified_(false) {
2312233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
2313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~Notification() {
2315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pthread_mutex_destroy(&mutex_);
2316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2317233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Notifies all threads created with this notification to start. Must
2319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // be called from the controller thread.
2320233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Notify() {
2321233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pthread_mutex_lock(&mutex_);
2322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    notified_ = true;
2323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pthread_mutex_unlock(&mutex_);
2324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2325233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Blocks until the controller thread notifies. Must be called from a test
2327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // thread.
2328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void WaitForNotification() {
2329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (;;) {
2330233d2500723e5594f3e7c70896ffeeef32b9c950ywan      pthread_mutex_lock(&mutex_);
2331233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const bool notified = notified_;
2332233d2500723e5594f3e7c70896ffeeef32b9c950ywan      pthread_mutex_unlock(&mutex_);
2333233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (notified)
2334233d2500723e5594f3e7c70896ffeeef32b9c950ywan        break;
2335233d2500723e5594f3e7c70896ffeeef32b9c950ywan      SleepMilliseconds(10);
2336233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
2337233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2338233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2339233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2340233d2500723e5594f3e7c70896ffeeef32b9c950ywan  pthread_mutex_t mutex_;
2341233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool notified_;
2342233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2343233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
2344233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2345233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2346233d2500723e5594f3e7c70896ffeeef32b9c950ywan// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
2347233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Consequently, it cannot select a correct instantiation of ThreadWithParam
2348233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in order to call its Run(). Introducing ThreadWithParamBase as a
2349233d2500723e5594f3e7c70896ffeeef32b9c950ywan// non-templated base class for ThreadWithParam allows us to bypass this
2350233d2500723e5594f3e7c70896ffeeef32b9c950ywan// problem.
2351233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ThreadWithParamBase {
2352233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2353233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~ThreadWithParamBase() {}
2354233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void Run() = 0;
2355233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2356233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2357233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pthread_create() accepts a pointer to a function type with the C linkage.
2358233d2500723e5594f3e7c70896ffeeef32b9c950ywan// According to the Standard (7.5/1), function types with different linkages
2359233d2500723e5594f3e7c70896ffeeef32b9c950ywan// are different even if they are otherwise identical.  Some compilers (for
2360233d2500723e5594f3e7c70896ffeeef32b9c950ywan// example, SunStudio) treat them as different types.  Since class methods
2361233d2500723e5594f3e7c70896ffeeef32b9c950ywan// cannot be defined with C-linkage we need to define a free C-function to
2362233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pass into pthread_create().
2363233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
2364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static_cast<ThreadWithParamBase*>(thread)->Run();
2365233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return NULL;
2366233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2367233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2368233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper class for testing Google Test's multi-threading constructs.
2369233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To use it, write:
2370233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2371233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void ThreadFunc(int param) { /* Do things with param */ }
2372233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Notification thread_can_start;
2373233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ...
2374233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // The thread_can_start parameter is optional; you can supply NULL.
2375233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
2376233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   thread_can_start.Notify();
2377233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2378233d2500723e5594f3e7c70896ffeeef32b9c950ywan// These classes are only for testing Google Test's own constructs. Do
2379233d2500723e5594f3e7c70896ffeeef32b9c950ywan// not use them in user tests, either directly or indirectly.
2380233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2381233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ThreadWithParam : public ThreadWithParamBase {
2382233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2383233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef void (*UserThreadFunc)(T);
2384233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ThreadWithParam(
2386233d2500723e5594f3e7c70896ffeeef32b9c950ywan      UserThreadFunc func, T param, Notification* thread_can_start)
2387233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : func_(func),
2388233d2500723e5594f3e7c70896ffeeef32b9c950ywan        param_(param),
2389233d2500723e5594f3e7c70896ffeeef32b9c950ywan        thread_can_start_(thread_can_start),
2390233d2500723e5594f3e7c70896ffeeef32b9c950ywan        finished_(false) {
2391233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ThreadWithParamBase* const base = this;
2392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // The thread can be created only after all fields except thread_
2393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // have been initialized.
2394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(
2395233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
2396233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2397233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~ThreadWithParam() { Join(); }
2398233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2399233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Join() {
2400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!finished_) {
2401233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
2402233d2500723e5594f3e7c70896ffeeef32b9c950ywan      finished_ = true;
2403233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
2404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2405233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2406233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void Run() {
2407233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (thread_can_start_ != NULL)
2408233d2500723e5594f3e7c70896ffeeef32b9c950ywan      thread_can_start_->WaitForNotification();
2409233d2500723e5594f3e7c70896ffeeef32b9c950ywan    func_(param_);
2410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2411233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2412233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const UserThreadFunc func_;  // User-supplied thread function.
2414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T param_;  // User-supplied parameter to the thread function.
2415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // When non-NULL, used to block execution until the controller thread
2416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // notifies.
2417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Notification* const thread_can_start_;
2418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool finished_;  // true iff we know that the thread function has finished.
2419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  pthread_t thread_;  // The native thread object.
2420233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
2422233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2423233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2424233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MutexBase and Mutex implement mutex on pthreads-based platforms. They
2425233d2500723e5594f3e7c70896ffeeef32b9c950ywan// are used in conjunction with class MutexLock:
2426233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2427233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Mutex mutex;
2428233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ...
2429233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
2430233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                            // of the current scope.
2431233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2432233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MutexBase implements behavior for both statically and dynamically
2433233d2500723e5594f3e7c70896ffeeef32b9c950ywan// allocated mutexes.  Do not use MutexBase directly.  Instead, write
2434233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the following to define a static mutex:
2435233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2436233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
2437233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2438233d2500723e5594f3e7c70896ffeeef32b9c950ywan// You can forward declare a static mutex like this:
2439233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2440233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
2441233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2442233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To create a dynamic mutex, just define an object of type Mutex.
2443233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass MutexBase {
2444233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Acquires this mutex.
2446233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Lock() {
2447233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
2448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    owner_ = pthread_self();
2449233d2500723e5594f3e7c70896ffeeef32b9c950ywan    has_owner_ = true;
2450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2451233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Releases this mutex.
2453233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Unlock() {
2454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Since the lock is being released the owner_ field should no longer be
2455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // considered valid. We don't protect writing to has_owner_ here, as it's
2456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // the caller's responsibility to ensure that the current thread holds the
2457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // mutex when this is called.
2458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    has_owner_ = false;
2459233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
2460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2461233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2462233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Does nothing if the current thread holds the mutex. Otherwise, crashes
2463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // with high probability.
2464233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AssertHeld() const {
2465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
2466233d2500723e5594f3e7c70896ffeeef32b9c950ywan        << "The current thread is not holding the mutex @" << this;
2467233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2468233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2469233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A static mutex may be used before main() is entered.  It may even
2470233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // be used before the dynamic initialization stage.  Therefore we
2471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // must be able to initialize a static mutex object at link time.
2472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This means MutexBase has to be a POD and its member variables
2473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // have to be public.
2474233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2475233d2500723e5594f3e7c70896ffeeef32b9c950ywan  pthread_mutex_t mutex_;  // The underlying pthread mutex.
2476233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // has_owner_ indicates whether the owner_ field below contains a valid thread
2477233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
2478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // accesses to the owner_ field should be protected by a check of this field.
2479233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // An alternative might be to memset() owner_ to all zeros, but there's no
2480233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // guarantee that a zero'd pthread_t is necessarily invalid or even different
2481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // from pthread_self().
2482233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool has_owner_;
2483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  pthread_t owner_;  // The thread holding the mutex.
2484233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2485233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2486233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Forward-declares a static mutex.
2487233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
2488233d2500723e5594f3e7c70896ffeeef32b9c950ywan    extern ::testing::internal::MutexBase mutex
2489233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2490233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines and statically (i.e. at link time) initializes a static mutex.
2491233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The initialization list here does not explicitly initialize each field,
2492233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instead relying on default initialization for the unspecified fields. In
2493233d2500723e5594f3e7c70896ffeeef32b9c950ywan// particular, the owner_ field (a pthread_t) is not explicitly initialized.
2494233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This allows initialization to work whether pthread_t is a scalar or struct.
2495233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The flag -Wmissing-field-initializers must not be specified for this to work.
2496233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
2497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
2498233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2499233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Mutex class can only be used for mutexes created at runtime. It
2500233d2500723e5594f3e7c70896ffeeef32b9c950ywan// shares its API with MutexBase otherwise.
2501233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Mutex : public MutexBase {
2502233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Mutex() {
2504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
2505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    has_owner_ = false;
2506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~Mutex() {
2508233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
2509233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2510233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2511233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2512233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
2513233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2514233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2515233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We cannot name this class MutexLock as the ctor declaration would
2516233d2500723e5594f3e7c70896ffeeef32b9c950ywan// conflict with a macro named MutexLock, which is defined on some
2517233d2500723e5594f3e7c70896ffeeef32b9c950ywan// platforms.  Hence the typedef trick below.
2518233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTestMutexLock {
2519233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit GTestMutexLock(MutexBase* mutex)
2521233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : mutex_(mutex) { mutex_->Lock(); }
2522233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2523233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~GTestMutexLock() { mutex_->Unlock(); }
2524233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2525233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2526233d2500723e5594f3e7c70896ffeeef32b9c950ywan  MutexBase* const mutex_;
2527233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
2529233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2530233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2531233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef GTestMutexLock MutexLock;
2532233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2533233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helpers for ThreadLocal.
2534233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2535233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pthread_key_create() requires DeleteThreadLocalValue() to have
2536233d2500723e5594f3e7c70896ffeeef32b9c950ywan// C-linkage.  Therefore it cannot be templatized to access
2537233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ThreadLocal<T>.  Hence the need for class
2538233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ThreadLocalValueHolderBase.
2539233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ThreadLocalValueHolderBase {
2540233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2541233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~ThreadLocalValueHolderBase() {}
2542233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2543233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2544233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Called by pthread to delete thread-local data stored by
2545233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pthread_setspecific().
2546233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" inline void DeleteThreadLocalValue(void* value_holder) {
2547233d2500723e5594f3e7c70896ffeeef32b9c950ywan  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
2548233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2549233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2550233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements thread-local storage on pthreads-based systems.
2551233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2552233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Thread 1
2553233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
2554233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2555233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Thread 2
2556233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   tl.set(150);  // Changes the value for thread 2 only.
2557233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(150, tl.get());
2558233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2559233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Thread 1
2560233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
2561233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   tl.set(200);
2562233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(200, tl.get());
2563233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2564233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The template type argument T must have a public copy constructor.
2565233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In addition, the default ThreadLocal constructor requires T to have
2566233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a public default constructor.
2567233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2568233d2500723e5594f3e7c70896ffeeef32b9c950ywan// An object managed for a thread by a ThreadLocal instance is deleted
2569233d2500723e5594f3e7c70896ffeeef32b9c950ywan// when the thread exits.  Or, if the ThreadLocal instance dies in
2570233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that thread, when the ThreadLocal dies.  It's the user's
2571233d2500723e5594f3e7c70896ffeeef32b9c950ywan// responsibility to ensure that all other threads using a ThreadLocal
2572233d2500723e5594f3e7c70896ffeeef32b9c950ywan// have exited when it dies, or the per-thread objects for those
2573233d2500723e5594f3e7c70896ffeeef32b9c950ywan// threads will not be deleted.
2574233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2575233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test only uses global ThreadLocal objects.  That means they
2576233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will die after main() has returned.  Therefore, no per-thread
2577233d2500723e5594f3e7c70896ffeeef32b9c950ywan// object managed by Google Test will be leaked as long as all threads
2578233d2500723e5594f3e7c70896ffeeef32b9c950ywan// using Google Test have exited when main() returns.
2579233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2580233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ThreadLocal {
2581233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ThreadLocal() : key_(CreateKey()),
2583233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  default_() {}
2584233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ThreadLocal(const T& value) : key_(CreateKey()),
2585233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         default_(value) {}
2586233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~ThreadLocal() {
2588233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Destroys the managed object for the current thread, if any.
2589233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DeleteThreadLocalValue(pthread_getspecific(key_));
2590233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2591233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Releases resources associated with the key.  This will *not*
2592233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // delete managed objects for other threads.
2593233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
2594233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2595233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2596233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* pointer() { return GetOrCreateValue(); }
2597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T* pointer() const { return GetOrCreateValue(); }
2598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T& get() const { return *pointer(); }
2599233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void set(const T& value) { *pointer() = value; }
2600233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2601233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2602233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Holds a value of type T.
2603233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class ValueHolder : public ThreadLocalValueHolderBase {
2604233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
2605233d2500723e5594f3e7c70896ffeeef32b9c950ywan    explicit ValueHolder(const T& value) : value_(value) {}
2606233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2607233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T* pointer() { return &value_; }
2608233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2609233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
2610233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T value_;
2611233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
2612233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
2613233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2614233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static pthread_key_t CreateKey() {
2615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pthread_key_t key;
2616233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // When a thread exits, DeleteThreadLocalValue() will be called on
2617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // the object managed for that thread.
2618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(
2619233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pthread_key_create(&key, &DeleteThreadLocalValue));
2620233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return key;
2621233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2622233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2623233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* GetOrCreateValue() const {
2624233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ThreadLocalValueHolderBase* const holder =
2625233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
2626233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (holder != NULL) {
2627233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
2628233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
2629233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2630233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ValueHolder* const new_holder = new ValueHolder(default_);
2631233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ThreadLocalValueHolderBase* const holder_base = new_holder;
2632233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
2633233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new_holder->pointer();
2634233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
2635233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2636233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A key pthreads uses for looking up per-thread values.
2637233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const pthread_key_t key_;
2638233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T default_;  // The default value for each thread.
2639233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
2641233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2642233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2643233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_IS_THREADSAFE 1
2644233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2645233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else  // GTEST_HAS_PTHREAD
2646233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2647233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A dummy implementation of synchronization primitives (mutex, lock,
2648233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and thread-local variable).  Necessary for compiling Google Test where
2649233d2500723e5594f3e7c70896ffeeef32b9c950ywan// mutex is not supported - using Google Test in multiple threads is not
2650233d2500723e5594f3e7c70896ffeeef32b9c950ywan// supported on such platforms.
2651233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2652233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Mutex {
2653233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2654233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Mutex() {}
2655233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Lock() {}
2656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Unlock() {}
2657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AssertHeld() const {}
2658233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2659233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2660233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
2661233d2500723e5594f3e7c70896ffeeef32b9c950ywan  extern ::testing::internal::Mutex mutex
2662233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2663233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
2664233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2665233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTestMutexLock {
2666233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2667233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit GTestMutexLock(Mutex*) {}  // NOLINT
2668233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2669233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2670233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef GTestMutexLock MutexLock;
2671233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2672233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2673233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ThreadLocal {
2674233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2675233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ThreadLocal() : value_() {}
2676233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ThreadLocal(const T& value) : value_(value) {}
2677233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* pointer() { return &value_; }
2678233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T* pointer() const { return &value_; }
2679233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T& get() const { return value_; }
2680233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void set(const T& value) { value_ = value; }
2681233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
2682233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T value_;
2683233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2684233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2685233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The above synchronization primitives have dummy implementations.
2686233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Therefore Google Test is not thread-safe.
2687233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_IS_THREADSAFE 0
2688233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2689233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_PTHREAD
2690233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2691233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns the number of threads running in the process, or 0 to indicate that
2692233d2500723e5594f3e7c70896ffeeef32b9c950ywan// we cannot detect it.
2693233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ size_t GetThreadCount();
2694233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2695233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Passing non-POD classes through ellipsis (...) crashes the ARM
2696233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compiler and generates a warning in Sun Studio.  The Nokia Symbian
2697233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and the IBM XL C/C++ compiler try to instantiate a copy constructor
2698233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for objects passed through ellipsis (...), failing for uncopyable
2699233d2500723e5594f3e7c70896ffeeef32b9c950ywan// objects.  We define this to ensure that only POD is passed through
2700233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ellipsis on these systems.
2701233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
2702233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We lose support for NULL detection where the compiler doesn't like
2703233d2500723e5594f3e7c70896ffeeef32b9c950ywan// passing non-POD classes through ellipsis (...).
2704233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_ELLIPSIS_NEEDS_POD_ 1
2705233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2706233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_CAN_COMPARE_NULL 1
2707233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2708233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2709233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
2710233d2500723e5594f3e7c70896ffeeef32b9c950ywan// const T& and const T* in a function template.  These compilers
2711233d2500723e5594f3e7c70896ffeeef32b9c950ywan// _can_ decide between class template specializations for T and T*,
2712233d2500723e5594f3e7c70896ffeeef32b9c950ywan// so a tr1::type_traits-like is_pointer works.
2713233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
2714233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_NEEDS_IS_POINTER_ 1
2715233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2716233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2717233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <bool bool_value>
2718233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct bool_constant {
2719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef bool_constant<bool_value> type;
2720233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const bool value = bool_value;
2721233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2722233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <bool bool_value> const bool bool_constant<bool_value>::value;
2723233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2724233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef bool_constant<false> false_type;
2725233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef bool_constant<true> true_type;
2726233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2727233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2728233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct is_pointer : public false_type {};
2729233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2730233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2731233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct is_pointer<T*> : public true_type {};
2732233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2733233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Iterator>
2734233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct IteratorTraits {
2735233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename Iterator::value_type value_type;
2736233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2737233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2738233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2739233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct IteratorTraits<T*> {
2740233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T value_type;
2741233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2742233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2743233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
2744233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct IteratorTraits<const T*> {
2745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T value_type;
2746233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2747233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2748233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS
2749233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_PATH_SEP_ "\\"
2750233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_ALT_PATH_SEP_ 1
2751233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The biggest signed integer type the compiler supports.
2752233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef __int64 BiggestInt;
2753233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2754233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_PATH_SEP_ "/"
2755233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_HAS_ALT_PATH_SEP_ 0
2756233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef long long BiggestInt;  // NOLINT
2757233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_WINDOWS
2758233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2759233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Utilities for char.
2760233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2761233d2500723e5594f3e7c70896ffeeef32b9c950ywan// isspace(int ch) and friends accept an unsigned char or EOF.  char
2762233d2500723e5594f3e7c70896ffeeef32b9c950ywan// may be signed, depending on the compiler (or compiler flags).
2763233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Therefore we need to cast a char to unsigned char before calling
2764233d2500723e5594f3e7c70896ffeeef32b9c950ywan// isspace(), etc.
2765233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2766233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsAlpha(char ch) {
2767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return isalpha(static_cast<unsigned char>(ch)) != 0;
2768233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2769233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsAlNum(char ch) {
2770233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return isalnum(static_cast<unsigned char>(ch)) != 0;
2771233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2772233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsDigit(char ch) {
2773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return isdigit(static_cast<unsigned char>(ch)) != 0;
2774233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2775233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsLower(char ch) {
2776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return islower(static_cast<unsigned char>(ch)) != 0;
2777233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2778233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsSpace(char ch) {
2779233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return isspace(static_cast<unsigned char>(ch)) != 0;
2780233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2781233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsUpper(char ch) {
2782233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return isupper(static_cast<unsigned char>(ch)) != 0;
2783233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2784233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsXDigit(char ch) {
2785233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return isxdigit(static_cast<unsigned char>(ch)) != 0;
2786233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2787233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsXDigit(wchar_t ch) {
2788233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const unsigned char low_byte = static_cast<unsigned char>(ch);
2789233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ch == low_byte && isxdigit(low_byte) != 0;
2790233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2791233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2792233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline char ToLower(char ch) {
2793233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
2794233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2795233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline char ToUpper(char ch) {
2796233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
2797233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2798233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2799233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The testing::internal::posix namespace holds wrappers for common
2800233d2500723e5594f3e7c70896ffeeef32b9c950ywan// POSIX functions.  These wrappers hide the differences between
2801233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Windows/MSVC and POSIX systems.  Since some compilers define these
2802233d2500723e5594f3e7c70896ffeeef32b9c950ywan// standard functions as macros, the wrapper cannot have the same name
2803233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as the wrapped function.
2804233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2805233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace posix {
2806233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2807233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Functions with a different name on Windows.
2808233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2809233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS
2810233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2811233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct _stat StatStruct;
2812233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2813233d2500723e5594f3e7c70896ffeeef32b9c950ywan# ifdef __BORLANDC__
2814233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int IsATTY(int fd) { return isatty(fd); }
2815233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int StrCaseCmp(const char* s1, const char* s2) {
2816233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return stricmp(s1, s2);
2817233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2818233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline char* StrDup(const char* src) { return strdup(src); }
2819233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else  // !__BORLANDC__
2820233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  if GTEST_OS_WINDOWS_MOBILE
2821233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int IsATTY(int /* fd */) { return 0; }
2822233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
2823233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int IsATTY(int fd) { return _isatty(fd); }
2824233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif  // GTEST_OS_WINDOWS_MOBILE
2825233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int StrCaseCmp(const char* s1, const char* s2) {
2826233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return _stricmp(s1, s2);
2827233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2828233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline char* StrDup(const char* src) { return _strdup(src); }
2829233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // __BORLANDC__
2830233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2831233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_OS_WINDOWS_MOBILE
2832233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
2833233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
2834233d2500723e5594f3e7c70896ffeeef32b9c950ywan// time and thus not defined there.
2835233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
2836233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int FileNo(FILE* file) { return _fileno(file); }
2837233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
2838233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int RmDir(const char* dir) { return _rmdir(dir); }
2839233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsDir(const StatStruct& st) {
2840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return (_S_IFDIR & st.st_mode) != 0;
2841233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2842233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_OS_WINDOWS_MOBILE
2843233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2844233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2845233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2846233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct stat StatStruct;
2847233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2848233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int FileNo(FILE* file) { return fileno(file); }
2849233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int IsATTY(int fd) { return isatty(fd); }
2850233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
2851233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int StrCaseCmp(const char* s1, const char* s2) {
2852233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return strcasecmp(s1, s2);
2853233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2854233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline char* StrDup(const char* src) { return strdup(src); }
2855233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int RmDir(const char* dir) { return rmdir(dir); }
2856233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
2857233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2858233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_WINDOWS
2859233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2860233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Functions deprecated by MSVC 8.0.
2861233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2862233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
2863233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Temporarily disable warning 4996 (deprecated function).
2864233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(push)
2865233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(disable:4996)
2866233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2867233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2868233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline const char* StrNCpy(char* dest, const char* src, size_t n) {
2869233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return strncpy(dest, src, n);
2870233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2871233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2872233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
2873233d2500723e5594f3e7c70896ffeeef32b9c950ywan// StrError() aren't needed on Windows CE at this time and thus not
2874233d2500723e5594f3e7c70896ffeeef32b9c950ywan// defined there.
2875233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2876233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_OS_WINDOWS_MOBILE
2877233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int ChDir(const char* dir) { return chdir(dir); }
2878233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2879233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline FILE* FOpen(const char* path, const char* mode) {
2880233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return fopen(path, mode);
2881233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2882233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_OS_WINDOWS_MOBILE
2883233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
2884233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return freopen(path, mode, stream);
2885233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2886233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
2887233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2888233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int FClose(FILE* fp) { return fclose(fp); }
2889233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_OS_WINDOWS_MOBILE
2890233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int Read(int fd, void* buf, unsigned int count) {
2891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return static_cast<int>(read(fd, buf, count));
2892233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2893233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int Write(int fd, const void* buf, unsigned int count) {
2894233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return static_cast<int>(write(fd, buf, count));
2895233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2896233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int Close(int fd) { return close(fd); }
2897233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline const char* StrError(int errnum) { return strerror(errnum); }
2898233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2899233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline const char* GetEnv(const char* name) {
2900233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS_MOBILE
2901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We are on Windows CE, which has no environment variables.
2902233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return NULL;
2903233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
2904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Environment variables which we programmatically clear will be set to the
2905233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // empty string rather than unset (NULL).  Handle that case.
2906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* const env = getenv(name);
2907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return (env != NULL && env[0] != '\0') ? env : NULL;
2908233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2909233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return getenv(name);
2910233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2911233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
2912233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2913233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
2914233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(pop)  // Restores the warning state.
2915233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2916233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2917233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS_MOBILE
2918233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Windows CE has no C library. The abort() function is used in
2919233d2500723e5594f3e7c70896ffeeef32b9c950ywan// several places in Google Test. This implementation provides a reasonable
2920233d2500723e5594f3e7c70896ffeeef32b9c950ywan// imitation of standard behaviour.
2921233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid Abort();
2922233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2923233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void Abort() { abort(); }
2924233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_WINDOWS_MOBILE
2925233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2926233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace posix
2927233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2928233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
2929233d2500723e5594f3e7c70896ffeeef32b9c950ywan// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
2930233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
2931233d2500723e5594f3e7c70896ffeeef32b9c950ywan// function in order to achieve that.  We use macro definition here because
2932233d2500723e5594f3e7c70896ffeeef32b9c950ywan// snprintf is a variadic function.
2933233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
2934233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC 2005 and above support variadic macros.
2935233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_SNPRINTF_(buffer, size, format, ...) \
2936233d2500723e5594f3e7c70896ffeeef32b9c950ywan     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
2937233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(_MSC_VER)
2938233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
2939233d2500723e5594f3e7c70896ffeeef32b9c950ywan// complain about _snprintf.
2940233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_SNPRINTF_ _snprintf
2941233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
2942233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_SNPRINTF_ snprintf
2943233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
2944233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2945233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The maximum number a BiggestInt can represent.  This definition
2946233d2500723e5594f3e7c70896ffeeef32b9c950ywan// works no matter BiggestInt is represented in one's complement or
2947233d2500723e5594f3e7c70896ffeeef32b9c950ywan// two's complement.
2948233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2949233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We cannot rely on numeric_limits in STL, as __int64 and long long
2950233d2500723e5594f3e7c70896ffeeef32b9c950ywan// are not part of standard C++ and numeric_limits doesn't need to be
2951233d2500723e5594f3e7c70896ffeeef32b9c950ywan// defined for them.
2952233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst BiggestInt kMaxBiggestInt =
2953233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
2954233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2955233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This template class serves as a compile-time function from size to
2956233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type.  It maps a size in bytes to a primitive type with that
2957233d2500723e5594f3e7c70896ffeeef32b9c950ywan// size. e.g.
2958233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2959233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TypeWithSize<4>::UInt
2960233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2961233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is typedef-ed to be unsigned int (unsigned integer made up of 4
2962233d2500723e5594f3e7c70896ffeeef32b9c950ywan// bytes).
2963233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2964233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Such functionality should belong to STL, but I cannot find it
2965233d2500723e5594f3e7c70896ffeeef32b9c950ywan// there.
2966233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2967233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test uses this class in the implementation of floating-point
2968233d2500723e5594f3e7c70896ffeeef32b9c950ywan// comparison.
2969233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
2970233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For now it only handles UInt (unsigned int) as that's all Google Test
2971233d2500723e5594f3e7c70896ffeeef32b9c950ywan// needs.  Other types can be easily added in the future if need
2972233d2500723e5594f3e7c70896ffeeef32b9c950ywan// arises.
2973233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <size_t size>
2974233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeWithSize {
2975233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This prevents the user from using TypeWithSize<N> with incorrect
2977233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // values of N.
2978233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef void UInt;
2979233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2980233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2981233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The specialization for size 4.
2982233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
2983233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeWithSize<4> {
2984233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2985233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // unsigned int has size 4 in both gcc and MSVC.
2986233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
2987233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // As base/basictypes.h doesn't compile on Windows, we cannot use
2988233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // uint32, uint64, and etc here.
2989233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef int Int;
2990233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef unsigned int UInt;
2991233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
2992233d2500723e5594f3e7c70896ffeeef32b9c950ywan
2993233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The specialization for size 8.
2994233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
2995233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeWithSize<8> {
2996233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
2997233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS
2998233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef __int64 Int;
2999233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef unsigned __int64 UInt;
3000233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
3001233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef long long Int;  // NOLINT
3002233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef unsigned long long UInt;  // NOLINT
3003233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_WINDOWS
3004233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3005233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3006233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Integer types of known sizes.
3007233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef TypeWithSize<4>::Int Int32;
3008233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef TypeWithSize<4>::UInt UInt32;
3009233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef TypeWithSize<8>::Int Int64;
3010233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef TypeWithSize<8>::UInt UInt64;
3011233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
3012233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3013233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Utilities for command line flags and environment variables.
3014233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3015233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macro for referencing flags.
3016233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_FLAG(name) FLAGS_gtest_##name
3017233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3018233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for declaring flags.
3019233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
3020233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DECLARE_int32_(name) \
3021233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
3022233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DECLARE_string_(name) \
3023233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_API_ extern ::std::string GTEST_FLAG(name)
3024233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3025233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for defining flags.
3026233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DEFINE_bool_(name, default_val, doc) \
3027233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
3028233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DEFINE_int32_(name, default_val, doc) \
3029233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
3030233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_DEFINE_string_(name, default_val, doc) \
3031233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
3032233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3033233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Thread annotations
3034233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
3035233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_LOCK_EXCLUDED_(locks)
3036233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3037233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
3038233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to *value and returns true; otherwise leaves *value unchanged and returns
3039233d2500723e5594f3e7c70896ffeeef32b9c950ywan// false.
3040233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(chandlerc): Find a better way to refactor flag and environment parsing
3041233d2500723e5594f3e7c70896ffeeef32b9c950ywan// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
3042233d2500723e5594f3e7c70896ffeeef32b9c950ywan// function.
3043233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool ParseInt32(const Message& src_text, const char* str, Int32* value);
3044233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3045233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Parses a bool/Int32/string from the environment variable
3046233d2500723e5594f3e7c70896ffeeef32b9c950ywan// corresponding to the given Google Test flag.
3047233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool BoolFromGTestEnv(const char* flag, bool default_val);
3048233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
3049233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst char* StringFromGTestEnv(const char* flag, const char* default_val);
3050233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3051233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
3052233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
3053233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3054233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
3055233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3056233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_LINUX
3057233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <stdlib.h>
3058233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <sys/types.h>
3059233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <sys/wait.h>
3060233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <unistd.h>
3061233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_LINUX
3062233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3063233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_EXCEPTIONS
3064233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <stdexcept>
3065233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
3066233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3067233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <ctype.h>
3068233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <float.h>
3069233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h>
3070233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <iomanip>
3071233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits>
3072233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <set>
3073233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3074233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
3075233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
3076233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3077233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
3078233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
3079233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
3080233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3081233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
3082233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
3083233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
3084233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
3085233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
3086233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
3087233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
3088233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
3089233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
3090233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3091233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3092233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3093233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3094233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3095233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3096233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3097233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3098233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3099233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3100233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3101233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3102233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3103233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
3104233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3105233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Google C++ Testing Framework (Google Test)
3106233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3107233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file defines the Message class.
3108233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3109233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
3110233d2500723e5594f3e7c70896ffeeef32b9c950ywan// leave some internal implementation details in this header file.
3111233d2500723e5594f3e7c70896ffeeef32b9c950ywan// They are clearly marked by comments like this:
3112233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3113233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
3114233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3115233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Such code is NOT meant to be used by a user directly, and is subject
3116233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
3117233d2500723e5594f3e7c70896ffeeef32b9c950ywan// program!
3118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3119233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
3120233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
3121233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3122233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits>
3123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3124233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3125233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Ensures that there is at least one operator<< in the global namespace.
3126233d2500723e5594f3e7c70896ffeeef32b9c950ywan// See Message& operator<<(...) below for why.
3127233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid operator<<(const testing::internal::Secret&, int);
3128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3129233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
3130233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3131233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Message class works like an ostream repeater.
3132233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3133233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Typical usage:
3134233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3135233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   1. You stream a bunch of values to a Message object.
3136233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      It will remember the text in a stringstream.
3137233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   2. Then you stream the Message object to an ostream.
3138233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      This causes the text in the Message to be streamed
3139233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      to the ostream.
3140233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3141233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For example;
3142233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3143233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   testing::Message foo;
3144233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   foo << 1 << " != " << 2;
3145233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   std::cout << foo;
3146233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3147233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will print "1 != 2".
3148233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3149233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Message is not intended to be inherited from.  In particular, its
3150233d2500723e5594f3e7c70896ffeeef32b9c950ywan// destructor is not virtual.
3151233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3152233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note that stringstream behaves differently in gcc and in MSVC.  You
3153233d2500723e5594f3e7c70896ffeeef32b9c950ywan// can stream a NULL char pointer to it in the former, but not in the
3154233d2500723e5594f3e7c70896ffeeef32b9c950ywan// latter (it causes an access violation if you do).  The Message
3155233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class hides this difference by treating a NULL char pointer as
3156233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "(null)".
3157233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ Message {
3158233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
3159233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The type of basic IO manipulators (endl, ends, and flush) for
3160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // narrow streams.
3161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
3162233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3163233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
3164233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructs an empty Message.
3165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message();
3166233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Copy constructor.
3168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
3169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *ss_ << msg.GetString();
3170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3171233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructs a Message from a C-string.
3173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit Message(const char* str) : ss_(new ::std::stringstream) {
3174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *ss_ << str;
3175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3177233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_SYMBIAN
3178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Streams a value (either a pointer or not) to this object.
3179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
3180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  inline Message& operator <<(const T& value) {
3181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    StreamHelper(typename internal::is_pointer<T>::type(), value);
3182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
3183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3184233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
3185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Streams a non-pointer value to this object.
3186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
3187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  inline Message& operator <<(const T& val) {
3188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Some libraries overload << for STL containers.  These
3189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // overloads are defined in the global namespace instead of ::std.
3190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    //
3191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
3192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // overloads are visible in either the std namespace or the global
3193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // namespace, but not other namespaces, including the testing
3194233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // namespace which Google Test's Message class is in.
3195233d2500723e5594f3e7c70896ffeeef32b9c950ywan    //
3196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // To allow STL containers (and other types that has a << operator
3197233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // defined in the global namespace) to be used in Google Test
3198233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // assertions, testing::Message must access the custom << operator
3199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // from the global namespace.  With this using declaration,
3200233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // overloads of << defined in the global namespace and those
3201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // visible via Koenig lookup are both exposed in this function.
3202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    using ::operator <<;
3203233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *ss_ << val;
3204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
3205233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3206233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Streams a pointer value to this object.
3208233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This function is an overload of the previous one.  When you
3210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // stream a pointer to a Message, this definition will be used as it
3211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // is more specialized.  (The C++ Standard, section
3212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // [temp.func.order].)  If you stream a non-pointer, then the
3213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // previous definition will be used.
3214233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The reason for this overload is that streaming a NULL pointer to
3216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ostream is undefined behavior.  Depending on the compiler, you
3217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // may get "0", "(nil)", "(null)", or an access violation.  To
3218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ensure consistent result across compilers, we always treat NULL
3219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // as "(null)".
3220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
3221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  inline Message& operator <<(T* const& pointer) {  // NOLINT
3222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (pointer == NULL) {
3223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *ss_ << "(null)";
3224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
3225233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *ss_ << pointer;
3226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
3227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
3228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3229233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_SYMBIAN
3230233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Since the basic IO manipulators are overloaded for both narrow
3232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // and wide streams, we have to provide this specialized definition
3233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // of operator <<, even though its body is the same as the
3234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // templatized version above.  Without this definition, streaming
3235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // endl or other basic IO manipulators to Message will confuse the
3236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // compiler.
3237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message& operator <<(BasicNarrowIoManip val) {
3238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *ss_ << val;
3239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
3240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3241233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Instead of 1/0, we want to see true/false for bool values.
3243233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message& operator <<(bool b) {
3244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this << (b ? "true" : "false");
3245233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3246233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3247233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // These two overloads allow streaming a wide C string to a Message
3248233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // using the UTF-8 encoding.
3249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message& operator <<(const wchar_t* wide_c_str);
3250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message& operator <<(wchar_t* wide_c_str);
3251233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3252233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_STD_WSTRING
3253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Converts the given wide string to a narrow string using the UTF-8
3254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // encoding, and streams the result to this Message object.
3255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message& operator <<(const ::std::wstring& wstr);
3256233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_STD_WSTRING
3257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3258233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_WSTRING
3259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Converts the given wide string to a narrow string using the UTF-8
3260233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // encoding, and streams the result to this Message object.
3261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Message& operator <<(const ::wstring& wstr);
3262233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_WSTRING
3263233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the text streamed to this object so far as an std::string.
3265233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Each '\0' character in the buffer is replaced with "\\0".
3266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3267233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
3268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string GetString() const;
3269233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3270233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
3271233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3272233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_SYMBIAN
3273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // These are needed as the Nokia Symbian Compiler cannot decide between
3274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // const T& and const T* in a function template. The Nokia compiler _can_
3275233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // decide between class template specializations for T and T*, so a
3276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // tr1::type_traits-like is_pointer works, and we can overload on that.
3277233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
3278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
3279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (pointer == NULL) {
3280233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *ss_ << "(null)";
3281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
3282233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *ss_ << pointer;
3283233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
3284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
3286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  inline void StreamHelper(internal::false_type /*is_pointer*/,
3287233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           const T& value) {
3288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // See the comments in Message& operator <<(const T&) above for why
3289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // we need this using statement.
3290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    using ::operator <<;
3291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *ss_ << value;
3292233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3293233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_SYMBIAN
3294233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We'll hold the text streamed to this object here.
3296233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::scoped_ptr< ::std::stringstream> ss_;
3297233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We declare (but don't implement) this to prevent the compiler
3299233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // from implementing the assignment operator.
3300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const Message&);
3301233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3302233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3303233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Streams a Message to an ostream.
3304233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline std::ostream& operator <<(std::ostream& os, const Message& sb) {
3305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return os << sb.GetString();
3306233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
3307233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3308233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
3309233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3310233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Converts a streamable value to an std::string.  A NULL pointer is
3311233d2500723e5594f3e7c70896ffeeef32b9c950ywan// converted to "(null)".  When the input value is a ::string,
3312233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::std::string, ::wstring, or ::std::wstring object, each NUL
3313233d2500723e5594f3e7c70896ffeeef32b9c950ywan// character in it is replaced with "\\0".
3314233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
3315233d2500723e5594f3e7c70896ffeeef32b9c950ywanstd::string StreamableToString(const T& streamable) {
3316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return (Message() << streamable).GetString();
3317233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
3318233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3319233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
3320233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
3321233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3322233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
3323233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
3324233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
3325233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3326233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
3327233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
3328233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
3329233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3330233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
3331233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
3332233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
3333233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
3334233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
3335233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
3336233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
3337233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
3338233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
3339233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3340233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3341233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3342233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3343233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3344233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3345233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3346233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3347233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3348233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3349233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3350233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3351233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3352233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
3353233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3354233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Google C++ Testing Framework (Google Test)
3355233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3356233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file declares the String class and functions used internally by
3357233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test.  They are subject to change without notice. They should not used
3358233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by code external to Google Test.
3359233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3360233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file is #included by <gtest/internal/gtest-internal.h>.
3361233d2500723e5594f3e7c70896ffeeef32b9c950ywan// It should not be #included by other files.
3362233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3363233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
3364233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
3365233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3366233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __BORLANDC__
3367233d2500723e5594f3e7c70896ffeeef32b9c950ywan// string.h is not guaranteed to provide strcpy on C++ Builder.
3368233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <mem.h>
3369233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
3370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3371233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h>
3372233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string>
3373233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3374233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3375233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
3376233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
3377233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3378233d2500723e5594f3e7c70896ffeeef32b9c950ywan// String - an abstract class holding static string utilities.
3379233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ String {
3380233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
3381233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Static utility methods
3382233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3383233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clones a 0-terminated C string, allocating memory using new.  The
3384233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // caller is responsible for deleting the return value using
3385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // delete[].  Returns the cloned string, or NULL if the input is
3386233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NULL.
3387233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3388233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This is different from strdup() in string.h, which allocates
3389233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // memory using malloc().
3390233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const char* CloneCString(const char* c_str);
3391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3392233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS_MOBILE
3393233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
3394233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // able to pass strings to Win32 APIs on CE we need to convert them
3395233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // to 'Unicode', UTF-16.
3396233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3397233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates a UTF-16 wide string from the given ANSI string, allocating
3398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // memory using new. The caller is responsible for deleting the return
3399233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // value using delete[]. Returns the wide string, or NULL if the
3400233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // input is NULL.
3401233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3402233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The wide string is created using the ANSI codepage (CP_ACP) to
3403233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // match the behaviour of the ANSI versions of Win32 calls and the
3404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // C runtime.
3405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static LPCWSTR AnsiToUtf16(const char* c_str);
3406233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates an ANSI string from the given wide string, allocating
3408233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // memory using new. The caller is responsible for deleting the return
3409233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // value using delete[]. Returns the ANSI string, or NULL if the
3410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // input is NULL.
3411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The returned string is created using the ANSI codepage (CP_ACP) to
3413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // match the behaviour of the ANSI versions of Win32 calls and the
3414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // C runtime.
3415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
3416233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
3417233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Compares two C strings.  Returns true iff they have the same content.
3419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Unlike strcmp(), this function can handle NULL argument(s).  A
3421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NULL C string is considered different to any non-NULL C string,
3422233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // including the empty string.
3423233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool CStringEquals(const char* lhs, const char* rhs);
3424233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Converts a wide C string to a String using the UTF-8 encoding.
3426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NULL will be converted to "(null)".  If an error occurred during
3427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the conversion, "(failed to convert from wide string)" is
3428233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // returned.
3429233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static std::string ShowWideCString(const wchar_t* wide_c_str);
3430233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3431233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Compares two wide C strings.  Returns true iff they have the same
3432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // content.
3433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Unlike wcscmp(), this function can handle NULL argument(s).  A
3435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NULL C string is considered different to any non-NULL C string,
3436233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // including the empty string.
3437233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
3438233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3439233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Compares two C strings, ignoring case.  Returns true iff they
3440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // have the same content.
3441233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3442233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Unlike strcasecmp(), this function can handle NULL argument(s).
3443233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A NULL C string is considered different to any non-NULL C string,
3444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // including the empty string.
3445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool CaseInsensitiveCStringEquals(const char* lhs,
3446233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                           const char* rhs);
3447233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Compares two wide C strings, ignoring case.  Returns true iff they
3449233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // have the same content.
3450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3451233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Unlike wcscasecmp(), this function can handle NULL argument(s).
3452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A NULL C string is considered different to any non-NULL wide C string,
3453233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // including the empty string.
3454233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NB: The implementations on different platforms slightly differ.
3455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
3456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // environment variable. On GNU platform this method uses wcscasecmp
3457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // which compares according to LC_CTYPE category of the current locale.
3458233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
3459233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // current locale.
3460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
3461233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               const wchar_t* rhs);
3462233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the given string ends with the given suffix, ignoring
3464233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // case. Any string is considered to end with an empty suffix.
3465233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool EndsWithCaseInsensitive(
3466233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const std::string& str, const std::string& suffix);
3467233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3468233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Formats an int value as "%02d".
3469233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
3470233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Formats an int value as "%X".
3472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static std::string FormatHexInt(int value);
3473233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3474233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Formats a byte as "%02X".
3475233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static std::string FormatByte(unsigned char value);
3476233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3477233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
3478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  String();  // Not meant to be instantiated.
3479233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class String
3480233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3481233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
3482233d2500723e5594f3e7c70896ffeeef32b9c950ywan// character in the buffer is replaced with "\\0".
3483233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
3484233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3485233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
3486233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
3487233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3488233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
3489233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008, Google Inc.
3490233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
3491233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3492233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
3493233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
3494233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
3495233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3496233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
3497233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
3498233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
3499233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
3500233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
3501233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
3502233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
3503233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
3504233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
3505233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3506233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3507233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3508233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3509233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3510233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3511233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3512233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3513233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3514233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3515233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3516233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3517233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3518233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: keith.ray@gmail.com (Keith Ray)
3519233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3520233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test filepath utilities
3521233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3522233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file declares classes and functions used internally by
3523233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test.  They are subject to change without notice.
3524233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3525233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file is #included in <gtest/internal/gtest-internal.h>.
3526233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Do not include this header file separately!
3527233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3528233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
3529233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
3530233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3531233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3532233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
3533233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
3534233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3535233d2500723e5594f3e7c70896ffeeef32b9c950ywan// FilePath - a class for file and directory pathname manipulation which
3536233d2500723e5594f3e7c70896ffeeef32b9c950ywan// handles platform-specific conventions (like the pathname separator).
3537233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used for helper functions for naming files in a directory for xml output.
3538233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Except for Set methods, all methods are const or static, which provides an
3539233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "immutable value object" -- useful for peace of mind.
3540233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A FilePath with a value ending in a path separator ("like/this/") represents
3541233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a directory, otherwise it is assumed to represent a file. In either case,
3542233d2500723e5594f3e7c70896ffeeef32b9c950ywan// it may or may not represent an actual file or directory in the file system.
3543233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Names are NOT checked for syntax correctness -- no checking for illegal
3544233d2500723e5594f3e7c70896ffeeef32b9c950ywan// characters, malformed paths, etc.
3545233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3546233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ FilePath {
3547233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
3548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath() : pathname_("") { }
3549233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
3550233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3551233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
3552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Normalize();
3553233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3554233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3555233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath& operator=(const FilePath& rhs) {
3556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Set(rhs);
3557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
3558233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3559233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3560233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Set(const FilePath& rhs) {
3561233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pathname_ = rhs.pathname_;
3562233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
3563233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3564233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::string& string() const { return pathname_; }
3565233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* c_str() const { return pathname_.c_str(); }
3566233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3567233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the current working directory, or "" if unsuccessful.
3568233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static FilePath GetCurrentDir();
3569233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3570233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Given directory = "dir", base_name = "test", number = 0,
3571233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // extension = "xml", returns "dir/test.xml". If number is greater
3572233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // than zero (e.g., 12), returns "dir/test_12.xml".
3573233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On Windows platform, uses \ as the separator rather than /.
3574233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static FilePath MakeFileName(const FilePath& directory,
3575233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               const FilePath& base_name,
3576233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               int number,
3577233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               const char* extension);
3578233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Given directory = "dir", relative_path = "test.xml",
3580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // returns "dir/test.xml".
3581233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On Windows, uses \ as the separator rather than /.
3582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static FilePath ConcatPaths(const FilePath& directory,
3583233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              const FilePath& relative_path);
3584233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3585233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns a pathname for a file that does not currently exist. The pathname
3586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // will be directory/base_name.extension or
3587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // directory/base_name_<number>.extension if directory/base_name.extension
3588233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // already exists. The number will be incremented until a pathname is found
3589233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // that does not already exist.
3590233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
3591233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // There could be a race condition if two or more processes are calling this
3592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // function at the same time -- they could both pick the same filename.
3593233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static FilePath GenerateUniqueFileName(const FilePath& directory,
3594233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         const FilePath& base_name,
3595233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         const char* extension);
3596233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the path is "".
3598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool IsEmpty() const { return pathname_.empty(); }
3599233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3600233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If input name has a trailing separator character, removes it and returns
3601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the name, otherwise return the name string unmodified.
3602233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On Windows platform, uses \ as the separator, other platforms use /.
3603233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath RemoveTrailingPathSeparator() const;
3604233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3605233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns a copy of the FilePath with the directory part removed.
3606233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
3607233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
3608233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
3609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // returns an empty FilePath ("").
3610233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On Windows platform, '\' is the path separator, otherwise it is '/'.
3611233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath RemoveDirectoryName() const;
3612233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3613233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // RemoveFileName returns the directory path with the filename removed.
3614233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
3615233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
3616233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
3617233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
3618233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On Windows platform, '\' is the path separator, otherwise it is '/'.
3619233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath RemoveFileName() const;
3620233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3621233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns a copy of the FilePath with the case-insensitive extension removed.
3622233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
3623233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // FilePath("dir/file"). If a case-insensitive extension is not
3624233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // found, returns a copy of the original FilePath.
3625233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FilePath RemoveExtension(const char* extension) const;
3626233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3627233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates directories so that path exists. Returns true if successful or if
3628233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the directories already exist; returns false if unable to create
3629233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // directories for any reason. Will also return false if the FilePath does
3630233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // not represent a directory (that is, it doesn't end with a path separator).
3631233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool CreateDirectoriesRecursively() const;
3632233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3633233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Create the directory so that path exists. Returns true if successful or
3634233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // if the directory already exists; returns false if unable to create the
3635233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // directory for any reason, including if the parent directory does not
3636233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // exist. Not named "CreateDirectory" because that's a macro on Windows.
3637233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool CreateFolder() const;
3638233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3639233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if FilePath describes something in the file-system,
3640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // either a file, directory, or whatever, and that something exists.
3641233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool FileOrDirectoryExists() const;
3642233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3643233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if pathname describes a directory in the file-system
3644233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // that exists.
3645233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool DirectoryExists() const;
3646233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3647233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if FilePath ends with a path separator, which indicates that
3648233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // it is intended to represent a directory. Returns false otherwise.
3649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This does NOT check that a directory (or file) actually exists.
3650233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool IsDirectory() const;
3651233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if pathname describes a root directory. (Windows has one
3653233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // root directory per disk drive.)
3654233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool IsRootDirectory() const;
3655233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if pathname describes an absolute path.
3657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool IsAbsolutePath() const;
3658233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3659233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
3660233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Replaces multiple consecutive separators with a single separator.
3661233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
3662233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // redundancies that might be in a pathname involving "." or "..".
3663233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3664233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A pathname with multiple consecutive separators may occur either through
3665233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // user error or as a result of some scripts or APIs that generate a pathname
3666233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // with a trailing separator. On other platforms the same API or script
3667233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // may NOT generate a pathname with a trailing "/". Then elsewhere that
3668233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // pathname may have another "/" and pathname components added to it,
3669233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // without checking for the separator already being there.
3670233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The script language and operating system may allow paths like "foo//bar"
3671233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // but some of the functions in FilePath will not handle that correctly. In
3672233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // particular, RemoveTrailingPathSeparator() only removes one separator, and
3673233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // it is called in CreateDirectoriesRecursively() assuming that it will change
3674233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // a pathname from directory syntax (trailing separator) to filename syntax.
3675233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
3676233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On Windows this method also replaces the alternate path separator '/' with
3677233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
3678233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // "bar\\foo".
3679233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3680233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Normalize();
3681233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3682233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns a pointer to the last occurence of a valid path separator in
3683233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the FilePath. On Windows, for example, both '/' and '\' are valid path
3684233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // separators. Returns NULL if no path separator was found.
3685233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* FindLastPathSeparator() const;
3686233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3687233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string pathname_;
3688233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class FilePath
3689233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3690233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
3691233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
3692233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3693233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
3694233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file was GENERATED by command:
3695233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     pump.py gtest-type-util.h.pump
3696233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DO NOT EDIT BY HAND!!!
3697233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3698233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008 Google Inc.
3699233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All Rights Reserved.
3700233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3701233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
3702233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
3703233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
3704233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3705233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
3706233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
3707233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
3708233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
3709233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
3710233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
3711233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
3712233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
3713233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
3714233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3715233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3716233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3717233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3718233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3719233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3720233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3721233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3722233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3723233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3724233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3725233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3726233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3727233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
3728233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3729233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Type utilities needed for implementing typed and type-parameterized
3730233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
3731233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
3732233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Currently we support at most 50 types in a list, and at most 50
3733233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type-parameterized tests in one type-parameterized test case.
3734233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Please contact googletestframework@googlegroups.com if you need
3735233d2500723e5594f3e7c70896ffeeef32b9c950ywan// more.
3736233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3737233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
3738233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
3739233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3740233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3741233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
3742233d2500723e5594f3e7c70896ffeeef32b9c950ywan// libstdc++ (which is where cxxabi.h comes from).
3743233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_HAS_CXXABI_H_
3744233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  include <cxxabi.h>
3745233d2500723e5594f3e7c70896ffeeef32b9c950ywan# elif defined(__HP_aCC)
3746233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  include <acxx_demangle.h>
3747233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_HASH_CXXABI_H_
3748233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3749233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
3750233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
3751233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3752233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GetTypeName<T>() returns a human-readable name of type T.
3753233d2500723e5594f3e7c70896ffeeef32b9c950ywan// NB: This function is also used in Google Mock, so don't move it inside of
3754233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the typed-test-only section below.
3755233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
3756233d2500723e5594f3e7c70896ffeeef32b9c950ywanstd::string GetTypeName() {
3757233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_HAS_RTTI
3758233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3759233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* const name = typeid(T).name();
3760233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
3761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int status = 0;
3762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // gcc's implementation of typeid(T).name() mangles the type name,
3763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // so we have to demangle it.
3764233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   if GTEST_HAS_CXXABI_H_
3765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  using abi::__cxa_demangle;
3766233d2500723e5594f3e7c70896ffeeef32b9c950ywan#   endif  // GTEST_HAS_CXXABI_H_
3767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
3768233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::string name_str(status == 0 ? readable_name : name);
3769233d2500723e5594f3e7c70896ffeeef32b9c950ywan  free(readable_name);
3770233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return name_str;
3771233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  else
3772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return name;
3773233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
3774233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3775233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
3776233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3777233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return "<type>";
3778233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3779233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_HAS_RTTI
3780233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
3781233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3782233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
3783233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3784233d2500723e5594f3e7c70896ffeeef32b9c950ywan// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
3785233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type.  This can be used as a compile-time assertion to ensure that
3786233d2500723e5594f3e7c70896ffeeef32b9c950ywan// two types are equal.
3787233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3788233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
3789233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct AssertTypeEq;
3790233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3791233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
3792233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct AssertTypeEq<T, T> {
3793233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef bool type;
3794233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3795233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3796233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A unique type used as the default value for the arguments of class
3797233d2500723e5594f3e7c70896ffeeef32b9c950ywan// template Types.  This allows us to simulate variadic templates
3798233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
3799233d2500723e5594f3e7c70896ffeeef32b9c950ywan// support directly.
3800233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct None {};
3801233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3802233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The following family of struct and struct templates are used to
3803233d2500723e5594f3e7c70896ffeeef32b9c950ywan// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
3804233d2500723e5594f3e7c70896ffeeef32b9c950ywan// represents a type list with N types (T1, T2, ..., and TN) in it.
3805233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Except for Types0, every struct in the family has two member types:
3806233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Head for the first type in the list, and Tail for the rest of the
3807233d2500723e5594f3e7c70896ffeeef32b9c950ywan// list.
3808233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3809233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The empty type list.
3810233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types0 {};
3811233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3812233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Type lists of length 1, 2, 3, and so on.
3813233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3814233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1>
3815233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types1 {
3816233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3817233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types0 Tail;
3818233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3819233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
3820233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types2 {
3821233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3822233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types1<T2> Tail;
3823233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3824233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3825233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3>
3826233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types3 {
3827233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3828233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types2<T2, T3> Tail;
3829233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3830233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3831233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4>
3832233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types4 {
3833233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types3<T2, T3, T4> Tail;
3835233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3836233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3837233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
3838233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types5 {
3839233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types4<T2, T3, T4, T5> Tail;
3841233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3842233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3843233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3844233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6>
3845233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types6 {
3846233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3847233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types5<T2, T3, T4, T5, T6> Tail;
3848233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3849233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3850233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3851233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7>
3852233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types7 {
3853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3854233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
3855233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3856233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3857233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3858233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8>
3859233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types8 {
3860233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3861233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
3862233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3863233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3864233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3865233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9>
3866233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types9 {
3867233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3868233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
3869233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3870233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3871233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3872233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10>
3873233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types10 {
3874233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3875233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
3876233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3877233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3878233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3879233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3880233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11>
3881233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types11 {
3882233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3883233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
3884233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3885233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3886233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3887233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3888233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12>
3889233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types12 {
3890233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
3892233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3893233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3894233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3895233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3896233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13>
3897233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types13 {
3898233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3899233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
3900233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3901233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3902233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14>
3905233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types14 {
3906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
3908233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3909233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3910233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3912233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15>
3913233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types15 {
3914233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3915233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3916233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15> Tail;
3917233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3918233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3919233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3920233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3921233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3922233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16>
3923233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types16 {
3924233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3925233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3926233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16> Tail;
3927233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3928233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3929233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3931233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3932233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17>
3933233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types17 {
3934233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3935233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3936233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17> Tail;
3937233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3938233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3939233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3940233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3941233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3942233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18>
3943233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types18 {
3944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3945233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3946233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18> Tail;
3947233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3948233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3949233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3950233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3952233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19>
3953233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types19 {
3954233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3955233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3956233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19> Tail;
3957233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3958233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3959233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3960233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3961233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3962233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20>
3963233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types20 {
3964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3965233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3966233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20> Tail;
3967233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3968233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3969233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3970233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3971233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3972233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
3973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21>
3974233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types21 {
3975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3977233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21> Tail;
3978233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3979233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3980233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3982233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3983233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
3984233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22>
3985233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types22 {
3986233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3987233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3988233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22> Tail;
3989233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
3990233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3991233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
3992233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
3993233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
3994233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
3995233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23>
3996233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types23 {
3997233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
3998233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
3999233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
4000233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4001233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4002233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4003233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4004233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4005233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4006233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24>
4007233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types24 {
4008233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4009233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4010233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
4011233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4012233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4013233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4014233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4015233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4016233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4017233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25>
4018233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types25 {
4019233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4020233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4021233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
4022233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4023233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4024233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4025233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4026233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4027233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4028233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4029233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26>
4030233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types26 {
4031233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4032233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4033233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
4034233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4035233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4036233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4037233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4038233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4039233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4040233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4041233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27>
4042233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types27 {
4043233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4044233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4045233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
4046233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4047233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4048233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4049233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4050233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4051233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4052233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4053233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28>
4054233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types28 {
4055233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4056233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4057233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
4058233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4059233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4060233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4061233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4062233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4063233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4064233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29>
4066233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types29 {
4067233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4068233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4069233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
4070233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29> Tail;
4071233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4072233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4073233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4075233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4076233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4077233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4078233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30>
4079233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types30 {
4080233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4082233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4083233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30> Tail;
4084233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4085233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4086233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4087233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4088233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4089233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4090233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4091233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4092233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31>
4093233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types31 {
4094233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4095233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4096233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4097233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31> Tail;
4098233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4099233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4100233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32>
4107233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types32 {
4108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4109233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4110233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4111233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32> Tail;
4112233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4113233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4114233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33>
4121233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types33 {
4122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4124233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4125233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33> Tail;
4126233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4128233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34>
4135233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types34 {
4136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4138233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4139233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34> Tail;
4140233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4141233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4142233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35>
4149233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types35 {
4150233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4152233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4153233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35> Tail;
4154233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4155233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4156233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36>
4164233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types36 {
4165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4166233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4167233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4168233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36> Tail;
4169233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4170233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4171233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37>
4179233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types37 {
4180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4182233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4183233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
4184233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4185233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4186233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4187233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38>
4194233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types38 {
4195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4196233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4197233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4198233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
4199233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4200233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4201233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4203233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39>
4209233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types39 {
4210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4212233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4213233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
4214233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4215233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4216233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40>
4224233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types40 {
4225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4227233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4228233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
4229233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4230233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4231233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4232233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41>
4240233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types41 {
4241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4243233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4244233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
4245233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4246233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4247233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4250233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4251233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4252233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4253233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4254233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42>
4256233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types42 {
4257233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4259233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4260233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
4261233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4263233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4266233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4267233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4269233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4270233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43>
4272233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types43 {
4273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4275233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4276233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
4277233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43> Tail;
4278233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4279233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4280233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4282233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4283233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4285233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4287233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44>
4289233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types44 {
4290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4291233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4292233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4293233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4294233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44> Tail;
4295233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4297233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4298233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4299233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4301233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4303233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45>
4306233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types45 {
4307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4309233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4310233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4311233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44, T45> Tail;
4312233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4313233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4314233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4316233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4321233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
4323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46>
4324233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types46 {
4325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4327233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4328233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4329233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44, T45, T46> Tail;
4330233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4332233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4335233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4336233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4337233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4338233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4340233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
4341233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47>
4342233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types47 {
4343233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4344233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4345233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4346233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4347233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44, T45, T46, T47> Tail;
4348233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4349233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4350233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4351233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4352233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4353233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4354233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4355233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
4359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48>
4360233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types48 {
4361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4363233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4364233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4365233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44, T45, T46, T47, T48> Tail;
4366233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4367233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4368233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4369233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4371233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4376233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
4377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49>
4378233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types49 {
4379233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4380233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4381233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4382233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4383233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44, T45, T46, T47, T48, T49> Tail;
4384233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4385233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4386233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4388233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4389233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4391233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
4393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
4394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
4395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49, typename T50>
4396233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types50 {
4397233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T1 Head;
4398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4399233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4400233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
4401233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T44, T45, T46, T47, T48, T49, T50> Tail;
4402233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4403233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4404233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4405233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
4406233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4407233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We don't want to require the users to write TypesN<...> directly,
4408233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as that would require them to count the length.  Types<...> is much
4409233d2500723e5594f3e7c70896ffeeef32b9c950ywan// easier to write, but generates horrible messages when there is a
4410233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compiler error, as gcc insists on printing out each template
4411233d2500723e5594f3e7c70896ffeeef32b9c950ywan// argument, even if it has the default value (this means Types<int>
4412233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will appear as Types<int, None, None, ..., None> in the compiler
4413233d2500723e5594f3e7c70896ffeeef32b9c950ywan// errors).
4414233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
4415233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Our solution is to combine the best part of the two approaches: a
4416233d2500723e5594f3e7c70896ffeeef32b9c950ywan// user would write Types<T1, ..., TN>, and Google Test will translate
4417233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that to TypesN<T1, ..., TN> internally to make error messages
4418233d2500723e5594f3e7c70896ffeeef32b9c950ywan// readable.  The translation is done by the 'type' member of the
4419233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Types template.
4420233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1 = internal::None, typename T2 = internal::None,
4421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T3 = internal::None, typename T4 = internal::None,
4422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T5 = internal::None, typename T6 = internal::None,
4423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T7 = internal::None, typename T8 = internal::None,
4424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T9 = internal::None, typename T10 = internal::None,
4425233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11 = internal::None, typename T12 = internal::None,
4426233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T13 = internal::None, typename T14 = internal::None,
4427233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T15 = internal::None, typename T16 = internal::None,
4428233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T17 = internal::None, typename T18 = internal::None,
4429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T19 = internal::None, typename T20 = internal::None,
4430233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21 = internal::None, typename T22 = internal::None,
4431233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T23 = internal::None, typename T24 = internal::None,
4432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T25 = internal::None, typename T26 = internal::None,
4433233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T27 = internal::None, typename T28 = internal::None,
4434233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T29 = internal::None, typename T30 = internal::None,
4435233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31 = internal::None, typename T32 = internal::None,
4436233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T33 = internal::None, typename T34 = internal::None,
4437233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T35 = internal::None, typename T36 = internal::None,
4438233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T37 = internal::None, typename T38 = internal::None,
4439233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T39 = internal::None, typename T40 = internal::None,
4440233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41 = internal::None, typename T42 = internal::None,
4441233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T43 = internal::None, typename T44 = internal::None,
4442233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T45 = internal::None, typename T46 = internal::None,
4443233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T47 = internal::None, typename T48 = internal::None,
4444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T49 = internal::None, typename T50 = internal::None>
4445233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types {
4446233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4447233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4448233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
4449233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
4450233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4451233d2500723e5594f3e7c70896ffeeef32b9c950ywan
4452233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
4453233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<internal::None, internal::None, internal::None, internal::None,
4454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4459233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4460233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4461233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4462233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4463233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4466233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types0 type;
4467233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4468233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1>
4469233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, internal::None, internal::None, internal::None,
4470233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4472233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4473233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4474233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4475233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4476233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4479233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4480233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4481233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4482233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types1<T1> type;
4483233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4484233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
4485233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, internal::None, internal::None, internal::None,
4486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4487233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4488233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4489233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4490233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4491233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4492233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4493233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4494233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4495233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4496233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4498233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types2<T1, T2> type;
4499233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4500233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3>
4501233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, internal::None, internal::None, internal::None,
4502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4506233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4507233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4508233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4509233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4510233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4511233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4512233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4513233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types3<T1, T2, T3> type;
4514233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4515233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4>
4516233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
4517233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4518233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4519233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4520233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4521233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4522233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4523233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4524233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4525233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4526233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4527233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types4<T1, T2, T3, T4> type;
4529233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4530233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
4531233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
4532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4533233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4535233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4537233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4540233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4541233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4543233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types5<T1, T2, T3, T4, T5> type;
4544233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4545233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4546233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6>
4547233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
4548233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4549233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4550233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4551233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4554233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4555233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4558233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4559233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
4560233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4561233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4562233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7>
4563233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
4564233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4565233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4566233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4567233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4569233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4570233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4571233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4572233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4573233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4574233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4575233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
4576233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4577233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4578233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8>
4579233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
4580233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4581233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4582233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4583233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4584233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4585233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4586233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4587233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4588233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4589233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4590233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
4591233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4592233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4593233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9>
4594233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
4595233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4596233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4597233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4598233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4600233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4601233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4602233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4603233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4604233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4605233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
4606233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4607233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4608233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10>
4609233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
4610233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4611233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4612233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4613233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4614233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4616233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4619233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4620233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
4621233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4622233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4623233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4624233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11>
4625233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
4626233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4628233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4629233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4630233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4631233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4632233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4633233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4634233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4635233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4636233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
4637233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4638233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4639233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4640233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12>
4641233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
4642233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4643233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4644233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4645233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4646233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4647233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4648233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4649233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4650233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4651233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
4653233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12> type;
4654233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4655233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4656233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4657233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13>
4658233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
4659233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4660233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4661233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4662233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4664233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4666233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4668233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4669233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4670233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13> type;
4671233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4672233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4673233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4674233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14>
4675233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
4676233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4677233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4678233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4679233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4680233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4681233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4682233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4683233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4684233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4685233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4686233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14> type;
4687233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4688233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4689233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4690233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15>
4691233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4692233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4693233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4694233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4695233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4696233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4697233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4698233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4699233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4700233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4702233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15> type;
4703233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4704233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4705233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4706233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4707233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16>
4708233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4709233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, internal::None, internal::None, internal::None, internal::None,
4710233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4713233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4714233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4715233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4716233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4717233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4719233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16> type;
4720233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4721233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4722233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4723233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4724233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17>
4725233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4726233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, internal::None, internal::None, internal::None, internal::None,
4727233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4728233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4729233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4730233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4731233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4732233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4733233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4734233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4735233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4736233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17> type;
4737233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4738233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4739233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4740233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4741233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18>
4742233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4743233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, internal::None, internal::None, internal::None,
4744233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4745233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4746233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4747233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4748233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4750233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4752233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4753233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18> type;
4754233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4755233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4756233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4757233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4758233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19>
4759233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4760233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, internal::None, internal::None, internal::None,
4761233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4762233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4763233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4764233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4765233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4766233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4767233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4768233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4769233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19> type;
4770233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4771233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4772233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4773233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4774233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20>
4775233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4776233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
4777233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4778233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4779233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4780233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4781233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4782233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4783233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4784233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4785233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20> type;
4786233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4787233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4788233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4790233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21>
4792233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
4794233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4795233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4796233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4797233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4798233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4799233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4800233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4801233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4802233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
4803233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4804233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4805233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4806233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4808233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22>
4809233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4810233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
4811233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4812233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4813233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4814233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4815233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4816233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4817233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4818233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4819233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
4820233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4821233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4822233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4823233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4824233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4825233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23>
4826233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4827233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
4828233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4830233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4831233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4832233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4833233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4834233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4835233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4836233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
4837233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4838233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4839233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4840233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4841233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4842233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24>
4843233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4844233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
4845233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4846233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4847233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4848233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4849233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4850233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4851233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4852233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4853233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
4854233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4855233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4856233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4857233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4858233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4859233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25>
4860233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4861233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
4862233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4863233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4864233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4865233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4866233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4867233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4868233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4869233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
4870233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4871233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4872233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4873233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4874233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4875233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4876233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26>
4877233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4878233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
4879233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4880233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4881233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4882233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4883233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4884233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4885233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4886233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
4887233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26> type;
4888233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4889233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4890233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4891233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4892233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4893233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4894233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27>
4895233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4896233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
4897233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4898233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4899233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4900233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4901233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4902233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4904233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4905233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27> type;
4906233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4907233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4908233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4909233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4910233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4912233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28>
4913233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4914233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
4915233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4916233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4917233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4918233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4919233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4920233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4921233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4922233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4923233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28> type;
4924233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4925233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4926233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4928233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29>
4931233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4932233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
4933233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4934233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4935233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4936233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4937233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4938233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
4939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4940233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4941233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29> type;
4942233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4943233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4944233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4945233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4948233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30>
4949233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4950233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
4951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4952233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4953233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4954233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
4956233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4957233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4958233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30> type;
4959233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4960233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4961233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4962233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4963233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4964233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4965233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4966233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31>
4967233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4968233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
4969233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, internal::None, internal::None, internal::None, internal::None,
4970233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4971233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4972233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
4974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4975233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4976233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31> type;
4977233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4978233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4979233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4980233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
4982233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
4983233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
4984233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32>
4985233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
4986233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
4987233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, internal::None, internal::None, internal::None, internal::None,
4988233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4989233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4990233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
4991233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
4992233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
4993233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
4994233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32> type;
4995233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
4996233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
4997233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
4998233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
4999233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5000233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5001233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5002233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33>
5003233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5004233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5005233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, internal::None, internal::None, internal::None,
5006233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5007233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5008233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
5010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5011233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5012233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33> type;
5013233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5014233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5015233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5016233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5017233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5018233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5019233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5020233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34>
5021233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5022233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5023233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, internal::None, internal::None, internal::None,
5024233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5025233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5026233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5027233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
5028233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5029233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5030233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34> type;
5031233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5032233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5033233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5034233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5035233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5036233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5037233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5038233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35>
5039233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5040233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5041233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
5042233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5043233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5044233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
5045233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5046233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5047233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
5048233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5049233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5050233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5051233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5052233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5053233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5054233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5055233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5056233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36>
5057233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5058233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5059233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
5060233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5061233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5062233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
5063233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5064233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5065233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
5066233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5067233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5068233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5069233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5070233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5071233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5073233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37>
5075233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5076233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5077233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
5078233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5079233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5080233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
5081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5082233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5083233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
5084233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5085233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5086233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5087233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5088233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5089233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5090233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5091233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5092233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38>
5093233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5094233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5095233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
5096233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5097233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5098233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
5099233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5100233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5101233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
5102233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5103233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39>
5111233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
5114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
5117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5118233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5119233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
5120233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5121233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5128233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40>
5129233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
5132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
5135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5136233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5137233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
5138233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40> type;
5139233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5140233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41>
5149233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
5152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None> {
5154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5155233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5156233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5157233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41> type;
5158233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5159233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42>
5168233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
5171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
5173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5174233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5175233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5176233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42> type;
5177233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5178233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5179233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5186233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43>
5187233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
5190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None> {
5192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5193233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5194233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5195233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43> type;
5196233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5197233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5198233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5200233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5203233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44>
5206233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
5209233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None> {
5211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5212233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5213233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5214233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44> type;
5215233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5216233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45>
5225233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None, internal::None, internal::None, internal::None,
5229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::None> {
5230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5231233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5232233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5233233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45> type;
5234233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5235233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5240233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5241233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5242233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5243233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
5244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46>
5245233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T46, internal::None, internal::None, internal::None, internal::None> {
5249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5250233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5251233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5252233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45, T46> type;
5253233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5254233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5261233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
5263233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47>
5264233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5266233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5267233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T46, T47, internal::None, internal::None, internal::None> {
5268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5269233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5270233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5271233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45, T46, T47> type;
5272233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5273233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5274233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5280233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
5282233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48>
5283233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5285233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T46, T47, T48, internal::None, internal::None> {
5287233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5288233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5289233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5290233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45, T46, T47, T48> type;
5291233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5292233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
5293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
5294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
5295233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
5296233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
5297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
5298233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
5299233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
5300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
5301233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49>
5302233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
5303233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
5304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
5305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T46, T47, T48, T49, internal::None> {
5306233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
5307233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
5308233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
5309233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
5310233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5311233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5312233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
5313233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5314233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_TEMPLATE_ template <typename T> class
5315233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5316233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The template "selector" struct TemplateSel<Tmpl> is used to
5317233d2500723e5594f3e7c70896ffeeef32b9c950ywan// represent Tmpl, which must be a class template with one type
5318233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
5319233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as the type Tmpl<T>.  This allows us to actually instantiate the
5320233d2500723e5594f3e7c70896ffeeef32b9c950ywan// template "selected" by TemplateSel<Tmpl>.
5321233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
5322233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This trick is necessary for simulating typedef for class templates,
5323233d2500723e5594f3e7c70896ffeeef32b9c950ywan// which C++ doesn't support directly.
5324233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ Tmpl>
5325233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TemplateSel {
5326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
5327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct Bind {
5328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef Tmpl<T> type;
5329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
5330233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5332233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_BIND_(TmplSel, T) \
5333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TmplSel::template Bind<T>::type
5334233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5335233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A unique struct template used as the default value for the
5336233d2500723e5594f3e7c70896ffeeef32b9c950ywan// arguments of class template Templates.  This allows us to simulate
5337233d2500723e5594f3e7c70896ffeeef32b9c950ywan// variadic templates (e.g. Templates<int>, Templates<int, double>,
5338233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and etc), which C++ doesn't support directly.
5339233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
5340233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct NoneT {};
5341233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5342233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The following family of struct and struct templates are used to
5343233d2500723e5594f3e7c70896ffeeef32b9c950ywan// represent template lists.  In particular, TemplatesN<T1, T2, ...,
5344233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
5345233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for Templates0, every struct in the family has two member types:
5346233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Head for the selector of the first template in the list, and Tail
5347233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for the rest of the list.
5348233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5349233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The empty template list.
5350233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates0 {};
5351233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5352233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Template lists of length 1, 2, 3, and so on.
5353233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5354233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1>
5355233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates1 {
5356233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5357233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates0 Tail;
5358233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5359233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
5360233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates2 {
5361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates1<T2> Tail;
5363233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5364233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5365233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
5366233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates3 {
5367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5368233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates2<T2, T3> Tail;
5369233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5371233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4>
5373233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates4 {
5374233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5375233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates3<T2, T3, T4> Tail;
5376233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5377233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5378233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5379233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
5380233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates5 {
5381233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates4<T2, T3, T4, T5> Tail;
5383233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5384233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5385233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
5387233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates6 {
5388233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5389233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates5<T2, T3, T4, T5, T6> Tail;
5390233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5392233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7>
5395233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates7 {
5396233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5397233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
5398233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5399233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5400233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5401233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
5403233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates8 {
5404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
5406233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5407233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5408233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5409233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5410233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
5411233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates9 {
5412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
5414233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5415233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5416233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5417233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10>
5420233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates10 {
5421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5422233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
5423233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5424233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5425233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5426233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5427233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5428233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
5429233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates11 {
5430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5431233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
5432233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5434233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5435233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5436233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5437233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
5438233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates12 {
5439233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
5441233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5442233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5443233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5445233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5447233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13>
5448233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates13 {
5449233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
5451233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5452233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5453233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
5458233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates14 {
5459233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
5461233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14> Tail;
5462233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5463233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5464233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5466233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5467233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
5469233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates15 {
5470233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5472233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15> Tail;
5473233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5474233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5475233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5476233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5479233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5480233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16>
5481233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates16 {
5482233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5484233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16> Tail;
5485233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5486233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5487233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5488233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5489233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5490233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5491233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5492233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
5493233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates17 {
5494233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5495233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5496233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17> Tail;
5497233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5498233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5499233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5500233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
5505233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates18 {
5506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5508233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18> Tail;
5509233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5510233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5511233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5512233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5513233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5514233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5515233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5516233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5517233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19>
5518233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates19 {
5519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5521233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19> Tail;
5522233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5523233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5524233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5525233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5526233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5527233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5528233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5529233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5530233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
5531233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates20 {
5532233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5533233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5534233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20> Tail;
5535233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5536233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5537233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5540233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5541233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5543233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
5544233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates21 {
5545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5546233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5547233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21> Tail;
5548233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5549233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5550233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5551233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5554233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5555233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22>
5558233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates22 {
5559233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5560233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5561233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
5562233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5563233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5564233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5565233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5566233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5567233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5569233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5570233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5571233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
5572233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates23 {
5573233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5574233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5575233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
5576233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5577233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5578233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5579233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5580233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5581233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5582233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5583233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5584233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5585233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
5586233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates24 {
5587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5588233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5589233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
5590233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5591233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5592233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5593233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5594233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5595233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5596233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5597233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5598233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5600233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25>
5601233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates25 {
5602233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5603233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5604233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
5605233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5606233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5607233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5608233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5609233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5610233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5611233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5612233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5613233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5614233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
5616233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates26 {
5617233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5618233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5619233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
5620233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5621233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5622233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5623233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5624233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5625233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5626233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5628233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5629233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5630233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
5631233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates27 {
5632233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5633233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5634233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
5635233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5636233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5637233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5638233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5639233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5640233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5641233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5642233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5643233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5644233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5645233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5646233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28>
5647233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates28 {
5648233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5650233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
5651233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28> Tail;
5652233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5653233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5654233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5655233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5656233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5657233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5658233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5659233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5660233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5661233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5662233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
5664233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates29 {
5665233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5666233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5667233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5668233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29> Tail;
5669233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5670233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5671233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5672233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5673233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5674233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5675233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5676233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5677233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5678233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5679233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5680233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
5681233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates30 {
5682233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5683233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5684233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5685233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30> Tail;
5686233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5687233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5688233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5689233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5690233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5691233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5692233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5693233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5694233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5695233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5696233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5697233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5698233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31>
5699233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates31 {
5700233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5702233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5703233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31> Tail;
5704233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5705233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5706233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5707233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5709233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5710233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5713233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5714233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5715233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5716233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
5717233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates32 {
5718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5720233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5721233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32> Tail;
5722233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5723233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5724233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5725233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5726233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5727233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5728233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5729233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5730233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5731233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5732233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5733233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5734233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
5735233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates33 {
5736233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5737233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5738233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5739233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33> Tail;
5740233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5741233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5742233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5743233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5744233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5745233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5746233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5747233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5748233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5750233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5752233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5753233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34>
5754233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates34 {
5755233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5757233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5758233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34> Tail;
5759233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5760233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5761233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5762233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5763233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5764233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5765233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5766233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5767233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5768233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5769233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5770233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5771233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5772233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
5773233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates35 {
5774233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5775233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5776233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5777233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35> Tail;
5778233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5779233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5780233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5781233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5782233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5783233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5784233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5785233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5787233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5788233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5790233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
5792233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates36 {
5793233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5794233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5795233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5796233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
5797233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5798233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5799233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5800233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5801233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5802233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5803233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5804233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5805233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5806233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5808233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5809233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5810233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5811233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37>
5812233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates37 {
5813233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5814233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5815233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5816233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
5817233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5818233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5819233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5820233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5821233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5822233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5823233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5824233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5825233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5826233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5827233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5828233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5830233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5831233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
5832233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates38 {
5833233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5835233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5836233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
5837233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5838233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5839233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5840233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5841233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5842233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5843233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5844233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5845233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5846233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5847233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5848233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5849233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5850233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5851233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
5852233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates39 {
5853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5854233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5855233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5856233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
5857233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5858233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5859233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5860233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5861233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5862233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5863233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5864233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5865233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5866233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5867233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5868233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5869233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5870233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5871233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5872233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40>
5873233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates40 {
5874233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5875233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5876233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5877233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
5878233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5879233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5880233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5881233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5882233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5883233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5884233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5885233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5886233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5887233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5888233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5889233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5890233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5891233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5892233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5893233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
5894233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates41 {
5895233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5896233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5897233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5898233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
5899233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5900233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5901233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5902233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5905233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5906233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5907233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5908233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5909233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5910233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5912233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5913233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5914233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
5915233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates42 {
5916233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5917233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5918233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5919233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
5920233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42> Tail;
5921233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5922233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5923233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5924233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5925233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5926233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5928233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5931233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5932233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5933233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5934233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5935233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5936233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
5937233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43>
5938233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates43 {
5939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5941233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5942233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
5943233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43> Tail;
5944233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5945233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5946233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5948233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5949233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5950233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5952233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5953233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5954233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5956233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5957233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5958233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5959233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
5960233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
5961233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates44 {
5962233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5964233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5965233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
5966233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44> Tail;
5967233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5968233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5969233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5970233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5971233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5972233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5974233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5975233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5976233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
5977233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
5978233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
5979233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
5980233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
5981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
5982233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
5983233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
5984233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates45 {
5985233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
5986233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
5987233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
5988233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
5989233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44, T45> Tail;
5990233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
5991233d2500723e5594f3e7c70896ffeeef32b9c950ywan
5992233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
5993233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
5994233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
5995233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
5996233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
5997233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
5998233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
5999233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6000233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6001233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6002233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6003233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6004233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6005233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6006233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6007233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46>
6008233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates46 {
6009233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
6010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6011233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6012233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6013233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44, T45, T46> Tail;
6014233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6015233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6016233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6017233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6018233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6019233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6020233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6021233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6022233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6023233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6024233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6025233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6026233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6027233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6028233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6029233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6030233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6031233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
6032233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates47 {
6033233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
6034233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6035233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6036233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6037233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44, T45, T46, T47> Tail;
6038233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6039233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6040233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6041233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6042233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6043233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6044233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6045233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6046233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6047233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6048233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6049233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6050233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6051233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6052233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6053233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6054233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6055233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
6056233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates48 {
6057233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
6058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6059233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6060233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6061233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44, T45, T46, T47, T48> Tail;
6062233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6063233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6064233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6066233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6067233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6068233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6069233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6070233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6071233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6073233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6075233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6076233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6077233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6078233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6079233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
6080233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T49>
6081233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates49 {
6082233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
6083233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6084233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6085233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6086233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44, T45, T46, T47, T48, T49> Tail;
6087233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6088233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6089233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6090233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6091233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6092233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6093233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6094233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6095233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6096233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6097233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6098233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6099233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
6105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
6106233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates50 {
6107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef TemplateSel<T1> Head;
6108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6109233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6110233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
6111233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
6112233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6113233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6115233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We don't want to require the users to write TemplatesN<...> directly,
6116233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as that would require them to count the length.  Templates<...> is much
6117233d2500723e5594f3e7c70896ffeeef32b9c950ywan// easier to write, but generates horrible messages when there is a
6118233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compiler error, as gcc insists on printing out each template
6119233d2500723e5594f3e7c70896ffeeef32b9c950ywan// argument, even if it has the default value (this means Templates<list>
6120233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
6121233d2500723e5594f3e7c70896ffeeef32b9c950ywan// errors).
6122233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
6123233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Our solution is to combine the best part of the two approaches: a
6124233d2500723e5594f3e7c70896ffeeef32b9c950ywan// user would write Templates<T1, ..., TN>, and Google Test will translate
6125233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that to TemplatesN<T1, ..., TN> internally to make error messages
6126233d2500723e5594f3e7c70896ffeeef32b9c950ywan// readable.  The translation is done by the 'type' member of the
6127233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Templates template.
6128233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
6129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
6130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
6131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
6132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
6133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
6134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
6135233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
6136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
6137233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
6138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
6139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
6140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
6141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
6142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
6143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
6144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
6145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
6146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
6147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
6148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
6149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
6150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
6151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
6152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
6153233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates {
6154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6155233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6156233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6157233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
6158233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6159233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6160233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
6161233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT> {
6167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates0 type;
6168233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6169233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1>
6170233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT> {
6176233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates1<T1> type;
6177233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6178233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
6179233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT> {
6185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates2<T1, T2> type;
6186233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6187233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
6188233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates3<T1, T2, T3> type;
6194233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6195233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4>
6197233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6198233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6200233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6202233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates4<T1, T2, T3, T4> type;
6203233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6204233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
6206233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6209233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates5<T1, T2, T3, T4, T5> type;
6212233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6213233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
6215233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
6216233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
6221233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6222233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7>
6225233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
6226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
6231233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6232233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
6235233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
6236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
6241233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6242233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6243233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
6245233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
6246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
6251233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6252233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6253233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6254233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10>
6256233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
6257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
6262233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6263233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6266233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
6267233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
6268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6269233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6270233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
6273233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6274233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
6278233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
6279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6280233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6282233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
6284233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6285233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6287233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13>
6290233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
6291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
6296233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13> type;
6297233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6298233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6299233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6301233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
6303233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6306233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6307233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6309233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14> type;
6310233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6311233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6312233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6314233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
6316233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT> {
6321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6322233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15> type;
6323233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6324233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6325233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16>
6330233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6332233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT> {
6335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6336233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16> type;
6337233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6338233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6340233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6341233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6343233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
6344233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6346233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6347233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6348233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT> {
6349233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6350233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17> type;
6351233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6352233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6353233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6354233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6355233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
6358233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6360233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6361233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6362233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT> {
6363233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6364233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18> type;
6365233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6366233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6367233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6369233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6371233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19>
6373233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6376233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT> {
6378233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6379233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19> type;
6380233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6381233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6382233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6383233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6384233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6385233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
6388233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6389233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6391233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT> {
6393233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6394233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20> type;
6395233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6396233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6398233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6399233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6401233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
6403233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6404233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
6405233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6407233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT> {
6408233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6409233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21> type;
6410233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6411233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6413233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6414233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6415233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6416233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6417233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22>
6419233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
6421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT> {
6424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6425233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
6426233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6427233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6428233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6430233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6431233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6433233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6434233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
6435233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6436233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
6437233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6438233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6439233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT> {
6440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6441233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
6442233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6443233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6445233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6447233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6449233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
6451233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6452233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
6453233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT> {
6456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6457233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
6458233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6459233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6460233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6461233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6462233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6463233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6466233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6467233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25>
6468233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6469233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
6470233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6472233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT> {
6473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6474233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
6475233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6476233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6479233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6480233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6481233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6482233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6483233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6484233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
6485233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
6487233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6488233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6489233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT> {
6490233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6491233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
6492233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6493233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6494233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6495233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6496233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6498233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6499233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6500233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
6502233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
6504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6506233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT> {
6507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6508233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
6509233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27> type;
6510233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6511233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6512233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6513233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6514233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6515233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6516233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6517233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6518233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6519233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6520233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28>
6521233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6522233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
6523233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6524233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6525233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT> {
6526233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6527233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6528233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28> type;
6529233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6530233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6531233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6533233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6535233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6537233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
6540233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6541233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6543233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6544233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT> {
6545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6546233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6547233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29> type;
6548233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6549233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6550233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6551233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6554233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6555233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6558233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
6559233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6560233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6561233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6562233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6563233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6564233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6565233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30> type;
6566233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6567233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6569233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6570233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6571233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6572233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6573233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6574233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6575233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6576233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6577233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31>
6578233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6579233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6580233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6581233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6583233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6584233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31> type;
6585233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6586233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6587233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6588233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6589233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6590233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6591233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6592233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6593233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6594233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6595233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6596233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
6597233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6598233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6600233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6602233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6603233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32> type;
6604233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6605233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6606233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6607233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6608233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6609233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6610233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6611233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6612233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6613233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6614233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
6616233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6619233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6620233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6621233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6622233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33> type;
6623233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6624233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6625233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6626233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6628233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6629233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6630233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6631233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6632233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6633233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6634233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6635233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34>
6636233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6637233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6638233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6639233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6641233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6642233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34> type;
6643233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6644233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6645233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6646233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6647233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6648233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6649233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6650233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6651233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6652233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6653233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6654233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6655233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
6656233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6657233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6658233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
6659233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6660233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6661233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6662233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35> type;
6663233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6664233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6666233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6668233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6669233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6670233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6671233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6672233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6673233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6674233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6675233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
6676233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6677233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6678233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
6679233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6680233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6681233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6682233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
6683233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6684233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6685233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6686233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6687233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6688233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6689233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6690233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6691233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6692233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6693233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6694233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6695233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6696233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37>
6697233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6698233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6699233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
6700233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6702233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6703233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
6704233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6705233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6706233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6707233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6709233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6710233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6713233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6714233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6715233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6716233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6717233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
6718233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6719233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6720233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
6721233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6723233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6724233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
6725233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6726233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6727233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6728233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6729233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6730233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6731233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6732233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6733233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6734233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6735233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6736233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6737233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6738233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
6739233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6740233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6741233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
6742233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6744233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6745233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
6746233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6747233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6748233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6750233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6752233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6753233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6754233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6755233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6756233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6757233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6758233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6759233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6760233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40>
6761233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6762233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6763233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
6764233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6766233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6767233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
6768233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6769233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6770233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6771233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6772233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6773233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6774233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6775233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6776233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6777233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6778233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6779233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6780233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6781233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6782233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
6783233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6784233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6785233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
6786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6787233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6788233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6789233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
6790233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41> type;
6791233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6792233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6794233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6795233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6796233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6797233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6798233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6799233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6800233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6801233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6802233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6803233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6804233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6805233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
6806233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6808233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
6809233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6810233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6811233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6812233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6813233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42> type;
6814233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6815233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6816233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6817233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6818233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6819233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6820233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6821233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6822233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6823233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6824233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6825233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6826233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6827233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6828233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43>
6830233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6831233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6832233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
6833233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6835233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6836233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6837233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43> type;
6838233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6839233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6840233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6841233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6842233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6843233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6844233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6845233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6846233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6847233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6848233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6849233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6850233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6851233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6852233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6853233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
6854233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6855233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6856233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6857233d2500723e5594f3e7c70896ffeeef32b9c950ywan    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
6858233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6859233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6860233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6861233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44> type;
6862233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6863233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6864233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6865233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6866233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6867233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6868233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6869233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6870233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6871233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6872233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6873233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6874233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6875233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6876233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6877233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
6878233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6879233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6880233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6881233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
6882233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6883233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6884233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6885233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44, T45> type;
6886233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6887233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6888233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6889233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6890233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6891233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6892233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6893233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6894233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6895233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6896233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6897233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6898233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6899233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6900233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6901233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6902233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46>
6903233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6905233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6906233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T45, T46, NoneT, NoneT, NoneT, NoneT> {
6907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6908233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6909233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6910233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44, T45, T46> type;
6911233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6912233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6913233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6914233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6915233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6916233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6917233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6918233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6919233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6920233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6921233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6922233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6923233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6924233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6925233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6926233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
6928233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6931233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T45, T46, T47, NoneT, NoneT, NoneT> {
6932233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6933233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6934233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6935233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44, T45, T46, T47> type;
6936233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6937233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6938233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6939233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6940233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6941233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6942233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6943233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6944233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6945233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6948233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6949233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6950233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6952233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
6953233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6954233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6956233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T45, T46, T47, T48, NoneT, NoneT> {
6957233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6958233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6959233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6960233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44, T45, T46, T47, T48> type;
6961233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6962233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
6963233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
6964233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
6965233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
6966233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
6967233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
6968233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
6969233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
6970233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
6971233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
6972233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
6973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
6974233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
6975233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
6976233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
6977233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
6978233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEMPLATE_ T49>
6979233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
6980233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
6981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
6982233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T45, T46, T47, T48, T49, NoneT> {
6983233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
6984233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
6985233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
6986233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42, T43, T44, T45, T46, T47, T48, T49> type;
6987233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6988233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6989233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The TypeList template makes it possible to use either a single type
6990233d2500723e5594f3e7c70896ffeeef32b9c950ywan// or a Types<...> list in TYPED_TEST_CASE() and
6991233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TYPED_TEST_CASE_P().
6992233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6993233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
6994233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TypeList {
6995233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Types1<T> type;
6996233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
6997233d2500723e5594f3e7c70896ffeeef32b9c950ywan
6998233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
6999233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
7000233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
7001233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
7002233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
7003233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
7004233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
7005233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
7006233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
7007233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49, typename T50>
7008233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
7009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
7010233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
7011233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45, T46, T47, T48, T49, T50> > {
7012233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
7013233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
7014233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
7015233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
7016233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7017233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7018233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7019233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7020233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
7021233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
7022233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7023233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
7024233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7025233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Due to C++ preprocessor weirdness, we need double indirection to
7026233d2500723e5594f3e7c70896ffeeef32b9c950ywan// concatenate two tokens when one of them is __LINE__.  Writing
7027233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7028233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   foo ## __LINE__
7029233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7030233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will result in the token foo__LINE__, instead of foo followed by
7031233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the current line number.  For more details, see
7032233d2500723e5594f3e7c70896ffeeef32b9c950ywan// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
7033233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
7034233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
7035233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7036233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ProtocolMessage;
7037233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace proto2 { class Message; }
7038233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7039233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
7040233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7041233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Forward declarations.
7042233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7043233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass AssertionResult;                 // Result of an assertion.
7044233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Message;                         // Represents a failure message.
7045233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Test;                            // Represents a test.
7046233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestInfo;                        // Information about a test.
7047233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestPartResult;                  // Result of a test part.
7048233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UnitTest;                        // A collection of test cases.
7049233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7050233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7051233d2500723e5594f3e7c70896ffeeef32b9c950ywan::std::string PrintToString(const T& value);
7052233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7053233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
7054233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7055233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TraceInfo;                      // Information about a trace point.
7056233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ScopedTrace;                     // Implements scoped trace.
7057233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestInfoImpl;                    // Opaque implementation of TestInfo
7058233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UnitTestImpl;                    // Opaque implementation of UnitTest
7059233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7060233d2500723e5594f3e7c70896ffeeef32b9c950ywan// How many times InitGoogleTest() has been called.
7061233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ extern int g_init_gtest_count;
7062233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7063233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The text used in failure messages to indicate the start of the
7064233d2500723e5594f3e7c70896ffeeef32b9c950ywan// stack trace.
7065233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ extern const char kStackTraceMarker[];
7066233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7067233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Two overloaded helpers for checking at compile time whether an
7068233d2500723e5594f3e7c70896ffeeef32b9c950ywan// expression is a null pointer literal (i.e. NULL or any 0-valued
7069233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compile-time integral constant).  Their return values have
7070233d2500723e5594f3e7c70896ffeeef32b9c950ywan// different sizes, so we can use sizeof() to test which version is
7071233d2500723e5594f3e7c70896ffeeef32b9c950ywan// picked by the compiler.  These helpers have no implementations, as
7072233d2500723e5594f3e7c70896ffeeef32b9c950ywan// we only need their signatures.
7073233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7074233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Given IsNullLiteralHelper(x), the compiler will pick the first
7075233d2500723e5594f3e7c70896ffeeef32b9c950ywan// version if x can be implicitly converted to Secret*, and pick the
7076233d2500723e5594f3e7c70896ffeeef32b9c950ywan// second version otherwise.  Since Secret is a secret and incomplete
7077233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type, the only expression a user can write that has type Secret* is
7078233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a null pointer literal.  Therefore, we know that x is a null
7079233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pointer literal if and only if the first version is picked by the
7080233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compiler.
7081233d2500723e5594f3e7c70896ffeeef32b9c950ywanchar IsNullLiteralHelper(Secret* p);
7082233d2500723e5594f3e7c70896ffeeef32b9c950ywanchar (&IsNullLiteralHelper(...))[2];  // NOLINT
7083233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7084233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A compile-time bool constant that is true if and only if x is a
7085233d2500723e5594f3e7c70896ffeeef32b9c950ywan// null pointer literal (i.e. NULL or any 0-valued compile-time
7086233d2500723e5594f3e7c70896ffeeef32b9c950ywan// integral constant).
7087233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef GTEST_ELLIPSIS_NEEDS_POD_
7088233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We lose support for NULL detection where the compiler doesn't like
7089233d2500723e5594f3e7c70896ffeeef32b9c950ywan// passing non-POD classes through ellipsis (...).
7090233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_IS_NULL_LITERAL_(x) false
7091233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
7092233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_IS_NULL_LITERAL_(x) \
7093233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
7094233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_ELLIPSIS_NEEDS_POD_
7095233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7096233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Appends the user-supplied message to the Google-Test-generated message.
7097233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ std::string AppendUserMessage(
7098233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const std::string& gtest_msg, const Message& user_msg);
7099233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7100233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_EXCEPTIONS
7101233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7102233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This exception is thrown by (and only by) a failed Google Test
7103233d2500723e5594f3e7c70896ffeeef32b9c950ywan// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
7104233d2500723e5594f3e7c70896ffeeef32b9c950ywan// are enabled).  We derive it from std::runtime_error, which is for
7105233d2500723e5594f3e7c70896ffeeef32b9c950ywan// errors presumably detectable only at run time.  Since
7106233d2500723e5594f3e7c70896ffeeef32b9c950ywan// std::runtime_error inherits from std::exception, many testing
7107233d2500723e5594f3e7c70896ffeeef32b9c950ywan// frameworks know how to extract and print the message inside it.
7108233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
7109233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit GoogleTestFailureException(const TestPartResult& failure);
7111233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7113233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_EXCEPTIONS
7114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7115233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A helper class for creating scoped traces in user programs.
7116233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ ScopedTrace {
7117233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The c'tor pushes the given source file location and message onto
7119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // a trace stack maintained by Google Test.
7120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ScopedTrace(const char* file, int line, const Message& message);
7121233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The d'tor pops the info pushed by the c'tor.
7123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Note that the d'tor is not virtual in order to be efficient.
7125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Don't inherit from ScopedTrace!
7126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~ScopedTrace();
7127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7128233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
7130233d2500723e5594f3e7c70896ffeeef32b9c950ywan} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
7131233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            // c'tor and d'tor.  Therefore it doesn't
7132233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            // need to be used otherwise.
7133233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7134233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Constructs and returns the message for an equality assertion
7135233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
7136233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7137233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The first four parameters are the expressions used in the assertion
7138233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
7139233d2500723e5594f3e7c70896ffeeef32b9c950ywan// where foo is 5 and bar is 6, we have:
7140233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7141233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   expected_expression: "foo"
7142233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   actual_expression:   "bar"
7143233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   expected_value:      "5"
7144233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   actual_value:        "6"
7145233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7146233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The ignoring_case parameter is true iff the assertion is a
7147233d2500723e5594f3e7c70896ffeeef32b9c950ywan// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
7148233d2500723e5594f3e7c70896ffeeef32b9c950ywan// be inserted into the message.
7149233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult EqFailure(const char* expected_expression,
7150233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     const char* actual_expression,
7151233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     const std::string& expected_value,
7152233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     const std::string& actual_value,
7153233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     bool ignoring_case);
7154233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7155233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
7156233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ std::string GetBoolAssertionFailureMessage(
7157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const AssertionResult& assertion_result,
7158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* expression_text,
7159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* actual_predicate_value,
7160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* expected_predicate_value);
7161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7162233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This template class represents an IEEE floating-point number
7163233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (either single-precision or double-precision, depending on the
7164233d2500723e5594f3e7c70896ffeeef32b9c950ywan// template parameters).
7165233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7166233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The purpose of this class is to do more sophisticated number
7167233d2500723e5594f3e7c70896ffeeef32b9c950ywan// comparison.  (Due to round-off error, etc, it's very unlikely that
7168233d2500723e5594f3e7c70896ffeeef32b9c950ywan// two floating-points will be equal exactly.  Hence a naive
7169233d2500723e5594f3e7c70896ffeeef32b9c950ywan// comparison by the == operation often doesn't work.)
7170233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7171233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Format of IEEE floating-point:
7172233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7173233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   The most-significant bit being the leftmost, an IEEE
7174233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   floating-point looks like
7175233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7176233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     sign_bit exponent_bits fraction_bits
7177233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7178233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Here, sign_bit is a single bit that designates the sign of the
7179233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   number.
7180233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7181233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   For float, there are 8 exponent bits and 23 fraction bits.
7182233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7183233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   For double, there are 11 exponent bits and 52 fraction bits.
7184233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7185233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   More details can be found at
7186233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
7187233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7188233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Template parameter:
7189233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7190233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   RawType: the raw floating-point type (either float or double)
7191233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename RawType>
7192233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FloatingPoint {
7193233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Defines the unsigned integer type that has the same size as the
7195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // floating point number.
7196233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
7197233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7198233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constants.
7199233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7200233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // # of bits in a number.
7201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const size_t kBitCount = 8*sizeof(RawType);
7202233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // # of fraction bits in a number.
7204233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const size_t kFractionBitCount =
7205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    std::numeric_limits<RawType>::digits - 1;
7206233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // # of exponent bits in a number.
7208233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
7209233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The mask for the sign bit.
7211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
7212233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The mask for the fraction bits.
7214233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const Bits kFractionBitMask =
7215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
7216233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The mask for the exponent bits.
7218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
7219233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // How many ULP's (Units in the Last Place) we want to tolerate when
7221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // comparing two numbers.  The larger the value, the more error we
7222233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // allow.  A 0 value means that two numbers must be exactly the same
7223233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // to be considered equal.
7224233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The maximum error of a single floating-point operation is 0.5
7226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // units in the last place.  On Intel CPU's, all floating-point
7227233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // calculations are done with 80-bit precision, while double has 64
7228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // bits.  Therefore, 4 should be enough for ordinary use.
7229233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // See the following article for more details on ULP:
7231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
7232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const size_t kMaxUlps = 4;
7233233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructs a FloatingPoint from a raw floating-point number.
7235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
7237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // around may change its bits, although the new value is guaranteed
7238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // to be also a NAN.  Therefore, don't expect this constructor to
7239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // preserve the bits in x when x is a NAN.
7240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
7241233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Static methods
7243233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7244233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Reinterprets a bit pattern as a floating-point number.
7245233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7246233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This function is needed to test the AlmostEquals() method.
7247233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static RawType ReinterpretBits(const Bits bits) {
7248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    FloatingPoint fp(0);
7249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    fp.u_.bits_ = bits;
7250233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return fp.u_.value_;
7251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7252233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the floating-point number that represent positive infinity.
7254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static RawType Infinity() {
7255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ReinterpretBits(kExponentBitMask);
7256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the maximum representable finite floating-point number.
7259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static RawType Max();
7260233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Non-static methods
7262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7263233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the bits that represents this number.
7264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Bits &bits() const { return u_.bits_; }
7265233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the exponent bits of this number.
7267233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
7268233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the fraction bits of this number.
7270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
7271233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the sign bit of this number.
7273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
7274233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7275233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff this is NAN (not a number).
7276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool is_nan() const {
7277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // It's a NAN if the exponent bits are all ones and the fraction
7278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // bits are not entirely zeros.
7279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
7280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff this number is at most kMaxUlps ULP's away from
7283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // rhs.  In particular, this function:
7284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   - returns false if either number is (or both are) NAN.
7286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   - treats really large numbers as almost equal to infinity.
7287233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
7288233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool AlmostEquals(const FloatingPoint& rhs) const {
7289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // The IEEE standard says that any comparison operation involving
7290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // a NAN must return false.
7291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (is_nan() || rhs.is_nan()) return false;
7292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
7294233d2500723e5594f3e7c70896ffeeef32b9c950ywan        <= kMaxUlps;
7295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7297233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The data type used to store the actual floating-point number.
7299233d2500723e5594f3e7c70896ffeeef32b9c950ywan  union FloatingPointUnion {
7300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    RawType value_;  // The raw floating-point number.
7301233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Bits bits_;      // The bits that represent the number.
7302233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
7303233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7304233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Converts an integer from the sign-and-magnitude representation to
7305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the biased representation.  More precisely, let N be 2 to the
7306233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // power of (kBitCount - 1), an integer x is represented by the
7307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // unsigned number x + N.
7308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // For instance,
7310233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7311233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   -N + 1 (the most negative number representable using
7312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //          sign-and-magnitude) is represented by 1;
7313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   0      is represented by N; and
7314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   N - 1  (the biggest number representable using
7315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //          sign-and-magnitude) is represented by 2N - 1.
7316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7317233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Read http://en.wikipedia.org/wiki/Signed_number_representations
7318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // for more details on signed number representations.
7319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
7320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (kSignBitMask & sam) {
7321233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // sam represents a negative number.
7322233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return ~sam + 1;
7323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
7324233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // sam represents a positive number.
7325233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return kSignBitMask | sam;
7326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
7327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7328233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Given two numbers in the sign-and-magnitude representation,
7330233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // returns the distance between them as an unsigned number.
7331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
7332233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                     const Bits &sam2) {
7333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
7334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
7335233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
7336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7338233d2500723e5594f3e7c70896ffeeef32b9c950ywan  FloatingPointUnion u_;
7339233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7340233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7341233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
7342233d2500723e5594f3e7c70896ffeeef32b9c950ywan// macro defined by <windows.h>.
7343233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
7344233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline float FloatingPoint<float>::Max() { return FLT_MAX; }
7345233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
7346233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline double FloatingPoint<double>::Max() { return DBL_MAX; }
7347233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7348233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Typedefs the instances of the FloatingPoint template class that we
7349233d2500723e5594f3e7c70896ffeeef32b9c950ywan// care to use.
7350233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef FloatingPoint<float> Float;
7351233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef FloatingPoint<double> Double;
7352233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7353233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In order to catch the mistake of putting tests that use different
7354233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test fixture classes in the same test case, we need to assign
7355233d2500723e5594f3e7c70896ffeeef32b9c950ywan// unique IDs to fixture classes and compare them.  The TypeId type is
7356233d2500723e5594f3e7c70896ffeeef32b9c950ywan// used to hold such IDs.  The user should treat TypeId as an opaque
7357233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type: the only operation allowed on TypeId values is to compare
7358233d2500723e5594f3e7c70896ffeeef32b9c950ywan// them for equality using the == operator.
7359233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef const void* TypeId;
7360233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7361233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7362233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeIdHelper {
7363233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // dummy_ must not have a const type.  Otherwise an overly eager
7365233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
7366233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
7367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool dummy_;
7368233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7369233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7370233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7371233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool TypeIdHelper<T>::dummy_ = false;
7372233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7373233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GetTypeId<T>() returns the ID of type T.  Different values will be
7374233d2500723e5594f3e7c70896ffeeef32b9c950ywan// returned for different types.  Calling the function twice with the
7375233d2500723e5594f3e7c70896ffeeef32b9c950ywan// same type argument is guaranteed to return the same ID.
7376233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7377233d2500723e5594f3e7c70896ffeeef32b9c950ywanTypeId GetTypeId() {
7378233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The compiler is required to allocate a different
7379233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
7380233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the template.  Therefore, the address of dummy_ is guaranteed to
7381233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // be unique.
7382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return &(TypeIdHelper<T>::dummy_);
7383233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7384233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7385233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns the type ID of ::testing::Test.  Always call this instead
7386233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of GetTypeId< ::testing::Test>() to get the type ID of
7387233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::testing::Test, as the latter may give the wrong result due to a
7388233d2500723e5594f3e7c70896ffeeef32b9c950ywan// suspected linker bug when compiling Google Test as a Mac OS X
7389233d2500723e5594f3e7c70896ffeeef32b9c950ywan// framework.
7390233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ TypeId GetTestTypeId();
7391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7392233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines the abstract factory interface that creates instances
7393233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of a Test object.
7394233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestFactoryBase {
7395233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7396233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~TestFactoryBase() {}
7397233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates a test instance to run. The instance is both created and destroyed
7399233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // within TestInfoImpl::Run()
7400233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual Test* CreateTest() = 0;
7401233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7402233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
7403233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestFactoryBase() {}
7404233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7405233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7406233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
7407233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7408233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7409233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This class provides implementation of TeastFactoryBase interface.
7410233d2500723e5594f3e7c70896ffeeef32b9c950ywan// It is used in TEST and TEST_F macros.
7411233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class TestClass>
7412233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestFactoryImpl : public TestFactoryBase {
7413233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual Test* CreateTest() { return new TestClass; }
7415233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7416233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7417233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS
7418233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7419233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Predicate-formatters for implementing the HRESULT checking macros
7420233d2500723e5594f3e7c70896ffeeef32b9c950ywan// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
7421233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We pass a long instead of HRESULT to avoid causing an
7422233d2500723e5594f3e7c70896ffeeef32b9c950ywan// include dependency for the HRESULT type.
7423233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
7424233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            long hr);  // NOLINT
7425233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
7426233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            long hr);  // NOLINT
7427233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7428233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_WINDOWS
7429233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7430233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Types of SetUpTestCase() and TearDownTestCase() functions.
7431233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*SetUpTestCaseFunc)();
7432233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*TearDownTestCaseFunc)();
7433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7434233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Creates a new TestInfo object and registers it with Google Test;
7435233d2500723e5594f3e7c70896ffeeef32b9c950ywan// returns the created object.
7436233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7437233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Arguments:
7438233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7439233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   test_case_name:   name of the test case
7440233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   name:             name of the test
7441233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   type_param        the name of the test's type parameter, or NULL if
7442233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                     this is not a typed or a type-parameterized test.
7443233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   value_param       text representation of the test's value parameter,
7444233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                     or NULL if this is not a type-parameterized test.
7445233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   fixture_class_id: ID of the test fixture class
7446233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   set_up_tc:        pointer to the function that sets up the test case
7447233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   tear_down_tc:     pointer to the function that tears down the test case
7448233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   factory:          pointer to the factory that creates a test object.
7449233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                     The newly created TestInfo instance will assume
7450233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                     ownership of the factory object.
7451233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ TestInfo* MakeAndRegisterTestInfo(
7452233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* test_case_name,
7453233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* name,
7454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* type_param,
7455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* value_param,
7456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TypeId fixture_class_id,
7457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    SetUpTestCaseFunc set_up_tc,
7458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TearDownTestCaseFunc tear_down_tc,
7459233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TestFactoryBase* factory);
7460233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7461233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If *pstr starts with the given prefix, modifies *pstr to be right
7462233d2500723e5594f3e7c70896ffeeef32b9c950ywan// past the prefix and returns true; otherwise leaves *pstr unchanged
7463233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and returns false.  None of pstr, *pstr, and prefix can be NULL.
7464233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
7465233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7466233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7467233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7468233d2500723e5594f3e7c70896ffeeef32b9c950ywan// State of the definition of a type-parameterized test case.
7469233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TypedTestCasePState {
7470233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TypedTestCasePState() : registered_(false) {}
7472233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds the given test name to defined_test_names_ and return true
7474233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // if the test case hasn't been registered; otherwise aborts the
7475233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // program.
7476233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool AddTestName(const char* file, int line, const char* case_name,
7477233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   const char* test_name) {
7478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (registered_) {
7479233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fprintf(stderr, "%s Test %s must be defined before "
7480233d2500723e5594f3e7c70896ffeeef32b9c950ywan              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
7481233d2500723e5594f3e7c70896ffeeef32b9c950ywan              FormatFileLocation(file, line).c_str(), test_name, case_name);
7482233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fflush(stderr);
7483233d2500723e5594f3e7c70896ffeeef32b9c950ywan      posix::Abort();
7484233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
7485233d2500723e5594f3e7c70896ffeeef32b9c950ywan    defined_test_names_.insert(test_name);
7486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return true;
7487233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7488233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7489233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Verifies that registered_tests match the test names in
7490233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // defined_test_names_; returns registered_tests if successful, or
7491233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // aborts the program otherwise.
7492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* VerifyRegisteredTestNames(
7493233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* file, int line, const char* registered_tests);
7494233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7495233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7496233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool registered_;
7497233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::std::set<const char*> defined_test_names_;
7498233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7500233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Skips to the first non-space char after the first comma in 'str';
7501233d2500723e5594f3e7c70896ffeeef32b9c950ywan// returns NULL if no comma is found in 'str'.
7502233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline const char* SkipComma(const char* str) {
7503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* comma = strchr(str, ',');
7504233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (comma == NULL) {
7505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return NULL;
7506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  while (IsSpace(*(++comma))) {}
7508233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return comma;
7509233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7510233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7511233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns the prefix of 'str' before the first comma in it; returns
7512233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the entire string if it contains no comma.
7513233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline std::string GetPrefixUntilComma(const char* str) {
7514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* comma = strchr(str, ',');
7515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return comma == NULL ? str : std::string(str, comma);
7516233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7517233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7518233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
7519233d2500723e5594f3e7c70896ffeeef32b9c950ywan// registers a list of type-parameterized tests with Google Test.  The
7520233d2500723e5594f3e7c70896ffeeef32b9c950ywan// return value is insignificant - we just need to return something
7521233d2500723e5594f3e7c70896ffeeef32b9c950ywan// such that we can call this function in a namespace scope.
7522233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7523233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implementation note: The GTEST_TEMPLATE_ macro declares a template
7524233d2500723e5594f3e7c70896ffeeef32b9c950ywan// template parameter.  It's defined in gtest-type-util.h.
7525233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
7526233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeParameterizedTest {
7527233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // 'index' is the index of the test in the type list 'Types'
7529233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
7530233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Types).  Valid values for 'index' are [0, N - 1] where N is the
7531233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // length of Types.
7532233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Register(const char* prefix, const char* case_name,
7533233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       const char* test_names, int index) {
7534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef typename Types::Head Type;
7535233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef Fixture<Type> FixtureClass;
7536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
7537233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // First, registers the first type-parameterized test in the type
7539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // list.
7540233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MakeAndRegisterTestInfo(
7541233d2500723e5594f3e7c70896ffeeef32b9c950ywan        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
7542233d2500723e5594f3e7c70896ffeeef32b9c950ywan         + StreamableToString(index)).c_str(),
7543233d2500723e5594f3e7c70896ffeeef32b9c950ywan        GetPrefixUntilComma(test_names).c_str(),
7544233d2500723e5594f3e7c70896ffeeef32b9c950ywan        GetTypeName<Type>().c_str(),
7545233d2500723e5594f3e7c70896ffeeef32b9c950ywan        NULL,  // No value parameter.
7546233d2500723e5594f3e7c70896ffeeef32b9c950ywan        GetTypeId<FixtureClass>(),
7547233d2500723e5594f3e7c70896ffeeef32b9c950ywan        TestClass::SetUpTestCase,
7548233d2500723e5594f3e7c70896ffeeef32b9c950ywan        TestClass::TearDownTestCase,
7549233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new TestFactoryImpl<TestClass>);
7550233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7551233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Next, recurses (at compile time) with the tail of the type list.
7552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
7553233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ::Register(prefix, case_name, test_names, index + 1);
7554233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7555233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7556233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7557233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The base case for the compile time recursion.
7558233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ Fixture, class TestSel>
7559233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeParameterizedTest<Fixture, TestSel, Types0> {
7560233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7561233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
7562233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       const char* /*test_names*/, int /*index*/) {
7563233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return true;
7564233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7565233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7566233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7567233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
7568233d2500723e5594f3e7c70896ffeeef32b9c950ywan// registers *all combinations* of 'Tests' and 'Types' with Google
7569233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Test.  The return value is insignificant - we just need to return
7570233d2500723e5594f3e7c70896ffeeef32b9c950ywan// something such that we can call this function in a namespace scope.
7571233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
7572233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeParameterizedTestCase {
7573233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7574233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Register(const char* prefix, const char* case_name,
7575233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       const char* test_names) {
7576233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef typename Tests::Head Head;
7577233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7578233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // First, register the first test in 'Test' for each type in 'Types'.
7579233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TypeParameterizedTest<Fixture, Head, Types>::Register(
7580233d2500723e5594f3e7c70896ffeeef32b9c950ywan        prefix, case_name, test_names, 0);
7581233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7582233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Next, recurses (at compile time) with the tail of the test list.
7583233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
7584233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ::Register(prefix, case_name, SkipComma(test_names));
7585233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7586233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7587233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7588233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The base case for the compile time recursion.
7589233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <GTEST_TEMPLATE_ Fixture, typename Types>
7590233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeParameterizedTestCase<Fixture, Templates0, Types> {
7591233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
7593233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       const char* /*test_names*/) {
7594233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return true;
7595233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7596233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7597233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7598233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
7599233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7600233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns the current OS stack trace as an std::string.
7601233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7602233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The maximum number of stack frames to be included is specified by
7603233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the gtest_stack_trace_depth flag.  The skip_count parameter
7604233d2500723e5594f3e7c70896ffeeef32b9c950ywan// specifies the number of top frames to be skipped, which doesn't
7605233d2500723e5594f3e7c70896ffeeef32b9c950ywan// count against the number of frames to be included.
7606233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7607233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For example, if Foo() calls Bar(), which in turn calls
7608233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
7609233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
7610233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
7611233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UnitTest* unit_test, int skip_count);
7612233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7613233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helpers for suppressing warnings on unreachable code or constant
7614233d2500723e5594f3e7c70896ffeeef32b9c950ywan// condition.
7615233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7616233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Always returns true.
7617233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ bool AlwaysTrue();
7618233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7619233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Always returns false.
7620233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool AlwaysFalse() { return !AlwaysTrue(); }
7621233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7622233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper for suppressing false warning from Clang on a const char*
7623233d2500723e5594f3e7c70896ffeeef32b9c950ywan// variable declared in a conditional expression always being NULL in
7624233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the else branch.
7625233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct GTEST_API_ ConstCharPtr {
7626233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ConstCharPtr(const char* str) : value(str) {}
7627233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator bool() const { return true; }
7628233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* value;
7629233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7630233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7631233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A simple Linear Congruential Generator for generating random
7632233d2500723e5594f3e7c70896ffeeef32b9c950ywan// numbers with a uniform distribution.  Unlike rand() and srand(), it
7633233d2500723e5594f3e7c70896ffeeef32b9c950ywan// doesn't use global state (and therefore can't interfere with user
7634233d2500723e5594f3e7c70896ffeeef32b9c950ywan// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
7635233d2500723e5594f3e7c70896ffeeef32b9c950ywan// but it's good enough for our purposes.
7636233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ Random {
7637233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7638233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const UInt32 kMaxRange = 1u << 31;
7639233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit Random(UInt32 seed) : state_(seed) {}
7641233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7642233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Reseed(UInt32 seed) { state_ = seed; }
7643233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7644233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Generates a random number from [0, range).  Crashes if 'range' is
7645233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // 0 or greater than kMaxRange.
7646233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UInt32 Generate(UInt32 range);
7647233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7648233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UInt32 state_;
7650233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
7651233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7652233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7653233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
7654233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compiler error iff T1 and T2 are different types.
7655233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
7656233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct CompileAssertTypesEqual;
7657233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7658233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7659233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct CompileAssertTypesEqual<T, T> {
7660233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7661233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7662233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Removes the reference from a type if it is a reference type,
7663233d2500723e5594f3e7c70896ffeeef32b9c950ywan// otherwise leaves it unchanged.  This is the same as
7664233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tr1::remove_reference, which is not widely available yet.
7665233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7666233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct RemoveReference { typedef T type; };  // NOLINT
7667233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7668233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct RemoveReference<T&> { typedef T type; };  // NOLINT
7669233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7670233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A handy wrapper around RemoveReference that works when the argument
7671233d2500723e5594f3e7c70896ffeeef32b9c950ywan// T depends on template parameters.
7672233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_REMOVE_REFERENCE_(T) \
7673233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ::testing::internal::RemoveReference<T>::type
7674233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7675233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Removes const from a type if it is a const type, otherwise leaves
7676233d2500723e5594f3e7c70896ffeeef32b9c950ywan// it unchanged.  This is the same as tr1::remove_const, which is not
7677233d2500723e5594f3e7c70896ffeeef32b9c950ywan// widely available yet.
7678233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7679233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct RemoveConst { typedef T type; };  // NOLINT
7680233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7681233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct RemoveConst<const T> { typedef T type; };  // NOLINT
7682233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7683233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
7684233d2500723e5594f3e7c70896ffeeef32b9c950ywan// definition to fail to remove the const in 'const int[3]' and 'const
7685233d2500723e5594f3e7c70896ffeeef32b9c950ywan// char[3][4]'.  The following specialization works around the bug.
7686233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, size_t N>
7687233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct RemoveConst<const T[N]> {
7688233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename RemoveConst<T>::type type[N];
7689233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7690233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7691233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_MSC_VER) && _MSC_VER < 1400
7692233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This is the only specialization that allows VC++ 7.1 to remove const in
7693233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
7694233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and thus needs to be conditionally compiled.
7695233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, size_t N>
7696233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct RemoveConst<T[N]> {
7697233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename RemoveConst<T>::type type[N];
7698233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7699233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
7700233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7701233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A handy wrapper around RemoveConst that works when the argument
7702233d2500723e5594f3e7c70896ffeeef32b9c950ywan// T depends on template parameters.
7703233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_REMOVE_CONST_(T) \
7704233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ::testing::internal::RemoveConst<T>::type
7705233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7706233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Turns const U&, U&, const U, and U all into U.
7707233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
7708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
7709233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7710233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Adds reference to a type if it is not a reference type,
7711233d2500723e5594f3e7c70896ffeeef32b9c950ywan// otherwise leaves it unchanged.  This is the same as
7712233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tr1::add_reference, which is not widely available yet.
7713233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7714233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct AddReference { typedef T& type; };  // NOLINT
7715233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7716233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct AddReference<T&> { typedef T& type; };  // NOLINT
7717233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7718233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A handy wrapper around AddReference that works when the argument T
7719233d2500723e5594f3e7c70896ffeeef32b9c950ywan// depends on template parameters.
7720233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ADD_REFERENCE_(T) \
7721233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ::testing::internal::AddReference<T>::type
7722233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7723233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Adds a reference to const on top of T as necessary.  For example,
7724233d2500723e5594f3e7c70896ffeeef32b9c950ywan// it transforms
7725233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7726233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   char         ==> const char&
7727233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   const char   ==> const char&
7728233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   char&        ==> const char&
7729233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   const char&  ==> const char&
7730233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7731233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The argument T must depend on some template parameters.
7732233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_REFERENCE_TO_CONST_(T) \
7733233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
7734233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7735233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ImplicitlyConvertible<From, To>::value is a compile-time bool
7736233d2500723e5594f3e7c70896ffeeef32b9c950ywan// constant that's true iff type From can be implicitly converted to
7737233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type To.
7738233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename From, typename To>
7739233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ImplicitlyConvertible {
7740233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7741233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We need the following helper functions only for their types.
7742233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // They have no implementations.
7743233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7744233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // MakeFrom() is an expression whose type is From.  We cannot simply
7745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // use From(), as the type From may not have a public default
7746233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // constructor.
7747233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static From MakeFrom();
7748233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7749233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // These two functions are overloaded.  Given an expression
7750233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Helper(x), the compiler will pick the first version if x can be
7751233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // implicitly converted to type To; otherwise it will pick the
7752233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // second version.
7753233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
7754233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The first version returns a value of size 1, and the second
7755233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // version returns a value of size 2.  Therefore, by checking the
7756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // size of Helper(x), which can be done at compile time, we can tell
7757233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // which version of Helper() is used, and hence whether x can be
7758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // implicitly converted to type To.
7759233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static char Helper(To);
7760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static char (&Helper(...))[2];  // NOLINT
7761233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We have to put the 'public' section after the 'private' section,
7763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // or MSVC refuses to compile the code.
7764233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // MSVC warns about implicitly converting from double to int for
7766233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // possible loss of data, so we need to temporarily disable the
7767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // warning.
7768233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
7769233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(push)          // Saves the current warning state.
7770233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(disable:4244)  // Temporarily disables warning 4244.
7771233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const bool value =
7773233d2500723e5594f3e7c70896ffeeef32b9c950ywan      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
7774233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(pop)           // Restores the warning state.
7775233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(__BORLANDC__)
7776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // C++Builder cannot use member overload resolution during template
7777233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // instantiation.  The simplest workaround is to use its C++0x type traits
7778233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // functions (C++Builder 2009 and above only).
7779233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const bool value = __is_convertible(From, To);
7780233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
7781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const bool value =
7782233d2500723e5594f3e7c70896ffeeef32b9c950ywan      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
7783233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // _MSV_VER
7784233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7785233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename From, typename To>
7786233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst bool ImplicitlyConvertible<From, To>::value;
7787233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7788233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IsAProtocolMessage<T>::value is a compile-time bool constant that's
7789233d2500723e5594f3e7c70896ffeeef32b9c950ywan// true iff T is type ProtocolMessage, proto2::Message, or a subclass
7790233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of those.
7791233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
7792233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct IsAProtocolMessage
7793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public bool_constant<
7794233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
7795233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
7796233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7797233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7798233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When the compiler sees expression IsContainerTest<C>(0), if C is an
7799233d2500723e5594f3e7c70896ffeeef32b9c950ywan// STL-style container class, the first overload of IsContainerTest
7800233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will be viable (since both C::iterator* and C::const_iterator* are
7801233d2500723e5594f3e7c70896ffeeef32b9c950ywan// valid types and NULL can be implicitly converted to them).  It will
7802233d2500723e5594f3e7c70896ffeeef32b9c950ywan// be picked over the second overload as 'int' is a perfect match for
7803233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the type of argument 0.  If C::iterator or C::const_iterator is not
7804233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a valid type, the first overload is not viable, and the second
7805233d2500723e5594f3e7c70896ffeeef32b9c950ywan// overload will be picked.  Therefore, we can determine whether C is
7806233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a container class by checking the type of IsContainerTest<C>(0).
7807233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The value of the expression is insignificant.
7808233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7809233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note that we look for both C::iterator and C::const_iterator.  The
7810233d2500723e5594f3e7c70896ffeeef32b9c950ywan// reason is that C++ injects the name of a class as a member of the
7811233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class itself (e.g. you can refer to class iterator as either
7812233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 'iterator' or 'iterator::iterator').  If we look for C::iterator
7813233d2500723e5594f3e7c70896ffeeef32b9c950ywan// only, for example, we would mistakenly think that a class named
7814233d2500723e5594f3e7c70896ffeeef32b9c950ywan// iterator is an STL container.
7815233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
7816233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Also note that the simpler approach of overloading
7817233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IsContainerTest(typename C::const_iterator*) and
7818233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
7819233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef int IsContainer;
7820233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class C>
7821233d2500723e5594f3e7c70896ffeeef32b9c950ywanIsContainer IsContainerTest(int /* dummy */,
7822233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            typename C::iterator* /* it */ = NULL,
7823233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            typename C::const_iterator* /* const_it */ = NULL) {
7824233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return 0;
7825233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7826233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7827233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef char IsNotContainer;
7828233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class C>
7829233d2500723e5594f3e7c70896ffeeef32b9c950ywanIsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
7830233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7831233d2500723e5594f3e7c70896ffeeef32b9c950ywan// EnableIf<condition>::type is void when 'Cond' is true, and
7832233d2500723e5594f3e7c70896ffeeef32b9c950ywan// undefined when 'Cond' is false.  To use SFINAE to make a function
7833233d2500723e5594f3e7c70896ffeeef32b9c950ywan// overload only apply when a particular expression is true, add
7834233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "typename EnableIf<expression>::type* = 0" as the last parameter.
7835233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<bool> struct EnableIf;
7836233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<> struct EnableIf<true> { typedef void type; };  // NOLINT
7837233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7838233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Utilities for native arrays.
7839233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7840233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ArrayEq() compares two k-dimensional native arrays using the
7841233d2500723e5594f3e7c70896ffeeef32b9c950ywan// elements' operator==, where k can be any integer >= 0.  When k is
7842233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 0, ArrayEq() degenerates into comparing a single pair of values.
7843233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7844233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U>
7845233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool ArrayEq(const T* lhs, size_t size, const U* rhs);
7846233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7847233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This generic version is used when k is 0.
7848233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U>
7849233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
7850233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7851233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This overload is used when k >= 1.
7852233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U, size_t N>
7853233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
7854233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ArrayEq(lhs, N, rhs);
7855233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7856233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7857233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This helper reduces code bloat.  If we instead put its logic inside
7858233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the previous ArrayEq() function, arrays with different sizes would
7859233d2500723e5594f3e7c70896ffeeef32b9c950ywan// lead to different copies of the template code.
7860233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U>
7861233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool ArrayEq(const T* lhs, size_t size, const U* rhs) {
7862233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (size_t i = 0; i != size; i++) {
7863233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!internal::ArrayEq(lhs[i], rhs[i]))
7864233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return false;
7865233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7866233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return true;
7867233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7868233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7869233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Finds the first element in the iterator range [begin, end) that
7870233d2500723e5594f3e7c70896ffeeef32b9c950ywan// equals elem.  Element may be a native array type itself.
7871233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Iter, typename Element>
7872233d2500723e5594f3e7c70896ffeeef32b9c950ywanIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
7873233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (Iter it = begin; it != end; ++it) {
7874233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (internal::ArrayEq(*it, elem))
7875233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return it;
7876233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7877233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return end;
7878233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7879233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7880233d2500723e5594f3e7c70896ffeeef32b9c950ywan// CopyArray() copies a k-dimensional native array using the elements'
7881233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operator=, where k can be any integer >= 0.  When k is 0,
7882233d2500723e5594f3e7c70896ffeeef32b9c950ywan// CopyArray() degenerates into copying a single value.
7883233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7884233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U>
7885233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid CopyArray(const T* from, size_t size, U* to);
7886233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7887233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This generic version is used when k is 0.
7888233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U>
7889233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void CopyArray(const T& from, U* to) { *to = from; }
7890233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7891233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This overload is used when k >= 1.
7892233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U, size_t N>
7893233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void CopyArray(const T(&from)[N], U(*to)[N]) {
7894233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::CopyArray(from, N, *to);
7895233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7896233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7897233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This helper reduces code bloat.  If we instead put its logic inside
7898233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the previous CopyArray() function, arrays with different sizes
7899233d2500723e5594f3e7c70896ffeeef32b9c950ywan// would lead to different copies of the template code.
7900233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename U>
7901233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid CopyArray(const T* from, size_t size, U* to) {
7902233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (size_t i = 0; i != size; i++) {
7903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::CopyArray(from[i], to + i);
7904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7905233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
7906233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7907233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The relation between an NativeArray object (see below) and the
7908233d2500723e5594f3e7c70896ffeeef32b9c950ywan// native array it represents.
7909233d2500723e5594f3e7c70896ffeeef32b9c950ywanenum RelationToSource {
7910233d2500723e5594f3e7c70896ffeeef32b9c950ywan  kReference,  // The NativeArray references the native array.
7911233d2500723e5594f3e7c70896ffeeef32b9c950ywan  kCopy        // The NativeArray makes a copy of the native array and
7912233d2500723e5594f3e7c70896ffeeef32b9c950ywan               // owns the copy.
7913233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7914233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7915233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Adapts a native array to a read-only STL-style container.  Instead
7916233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of the complete STL container concept, this adaptor only implements
7917233d2500723e5594f3e7c70896ffeeef32b9c950ywan// members useful for Google Mock's container matchers.  New members
7918233d2500723e5594f3e7c70896ffeeef32b9c950ywan// should be added as needed.  To simplify the implementation, we only
7919233d2500723e5594f3e7c70896ffeeef32b9c950ywan// support Element being a raw type (i.e. having no top-level const or
7920233d2500723e5594f3e7c70896ffeeef32b9c950ywan// reference modifier).  It's the client's responsibility to satisfy
7921233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this requirement.  Element can be an array type itself (hence
7922233d2500723e5594f3e7c70896ffeeef32b9c950ywan// multi-dimensional arrays are supported).
7923233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Element>
7924233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass NativeArray {
7925233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
7926233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // STL-style container typedefs.
7927233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Element value_type;
7928233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef Element* iterator;
7929233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef const Element* const_iterator;
7930233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7931233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructs from a native array.
7932233d2500723e5594f3e7c70896ffeeef32b9c950ywan  NativeArray(const Element* array, size_t count, RelationToSource relation) {
7933233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Init(array, count, relation);
7934233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7935233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7936233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Copy constructor.
7937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  NativeArray(const NativeArray& rhs) {
7938233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
7939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7940233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~NativeArray() {
7942233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Ensures that the user doesn't instantiate NativeArray with a
7943233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // const or reference type.
7944233d2500723e5594f3e7c70896ffeeef32b9c950ywan    static_cast<void>(StaticAssertTypeEqHelper<Element,
7945233d2500723e5594f3e7c70896ffeeef32b9c950ywan        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
7946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (relation_to_source_ == kCopy)
7947233d2500723e5594f3e7c70896ffeeef32b9c950ywan      delete[] array_;
7948233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7949233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7950233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // STL-style container methods.
7951233d2500723e5594f3e7c70896ffeeef32b9c950ywan  size_t size() const { return size_; }
7952233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const_iterator begin() const { return array_; }
7953233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const_iterator end() const { return array_ + size_; }
7954233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator==(const NativeArray& rhs) const {
7955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return size() == rhs.size() &&
7956233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ArrayEq(begin(), size(), rhs.begin());
7957233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7958233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7959233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
7960233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Initializes this object; makes a copy of the input array if
7961233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // 'relation' is kCopy.
7962233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Init(const Element* array, size_t a_size, RelationToSource relation) {
7963233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (relation == kReference) {
7964233d2500723e5594f3e7c70896ffeeef32b9c950ywan      array_ = array;
7965233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
7966233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Element* const copy = new Element[a_size];
7967233d2500723e5594f3e7c70896ffeeef32b9c950ywan      CopyArray(array, a_size, copy);
7968233d2500723e5594f3e7c70896ffeeef32b9c950ywan      array_ = copy;
7969233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
7970233d2500723e5594f3e7c70896ffeeef32b9c950ywan    size_ = a_size;
7971233d2500723e5594f3e7c70896ffeeef32b9c950ywan    relation_to_source_ = relation;
7972233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
7973233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Element* array_;
7975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  size_t size_;
7976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RelationToSource relation_to_source_;
7977233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7978233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_ASSIGN_(NativeArray);
7979233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
7980233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7981233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
7982233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
7983233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7984233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
7985233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::testing::internal::AssertHelper(result_type, file, line, message) \
7986233d2500723e5594f3e7c70896ffeeef32b9c950ywan    = ::testing::Message()
7987233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7988233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_MESSAGE_(message, result_type) \
7989233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
7990233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7991233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_FATAL_FAILURE_(message) \
7992233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
7993233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7994233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_NONFATAL_FAILURE_(message) \
7995233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
7996233d2500723e5594f3e7c70896ffeeef32b9c950ywan
7997233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_SUCCESS_(message) \
7998233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
7999233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8000233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Suppresses MSVC warnings 4072 (unreachable code) for the code following
8001233d2500723e5594f3e7c70896ffeeef32b9c950ywan// statement if it returns or throws (or doesn't return or throw in some
8002233d2500723e5594f3e7c70896ffeeef32b9c950ywan// situations).
8003233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
8004233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::AlwaysTrue()) { statement; }
8005233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8006233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
8007233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8008233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
8009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool gtest_caught_expected = false; \
8010233d2500723e5594f3e7c70896ffeeef32b9c950ywan    try { \
8011233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8012233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8013233d2500723e5594f3e7c70896ffeeef32b9c950ywan    catch (expected_exception const&) { \
8014233d2500723e5594f3e7c70896ffeeef32b9c950ywan      gtest_caught_expected = true; \
8015233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8016233d2500723e5594f3e7c70896ffeeef32b9c950ywan    catch (...) { \
8017233d2500723e5594f3e7c70896ffeeef32b9c950ywan      gtest_msg.value = \
8018233d2500723e5594f3e7c70896ffeeef32b9c950ywan          "Expected: " #statement " throws an exception of type " \
8019233d2500723e5594f3e7c70896ffeeef32b9c950ywan          #expected_exception ".\n  Actual: it throws a different type."; \
8020233d2500723e5594f3e7c70896ffeeef32b9c950ywan      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
8021233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8022233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!gtest_caught_expected) { \
8023233d2500723e5594f3e7c70896ffeeef32b9c950ywan      gtest_msg.value = \
8024233d2500723e5594f3e7c70896ffeeef32b9c950ywan          "Expected: " #statement " throws an exception of type " \
8025233d2500723e5594f3e7c70896ffeeef32b9c950ywan          #expected_exception ".\n  Actual: it throws nothing."; \
8026233d2500723e5594f3e7c70896ffeeef32b9c950ywan      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
8027233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8028233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else \
8029233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
8030233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fail(gtest_msg.value)
8031233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8032233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_NO_THROW_(statement, fail) \
8033233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8034233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::AlwaysTrue()) { \
8035233d2500723e5594f3e7c70896ffeeef32b9c950ywan    try { \
8036233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8037233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8038233d2500723e5594f3e7c70896ffeeef32b9c950ywan    catch (...) { \
8039233d2500723e5594f3e7c70896ffeeef32b9c950ywan      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
8040233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8041233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else \
8042233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
8043233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fail("Expected: " #statement " doesn't throw an exception.\n" \
8044233d2500723e5594f3e7c70896ffeeef32b9c950ywan           "  Actual: it throws.")
8045233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8046233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_ANY_THROW_(statement, fail) \
8047233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8048233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::AlwaysTrue()) { \
8049233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool gtest_caught_any = false; \
8050233d2500723e5594f3e7c70896ffeeef32b9c950ywan    try { \
8051233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8052233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8053233d2500723e5594f3e7c70896ffeeef32b9c950ywan    catch (...) { \
8054233d2500723e5594f3e7c70896ffeeef32b9c950ywan      gtest_caught_any = true; \
8055233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8056233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!gtest_caught_any) { \
8057233d2500723e5594f3e7c70896ffeeef32b9c950ywan      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
8058233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8059233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else \
8060233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
8061233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fail("Expected: " #statement " throws an exception.\n" \
8062233d2500723e5594f3e7c70896ffeeef32b9c950ywan           "  Actual: it doesn't.")
8063233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8064233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8065233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
8066233d2500723e5594f3e7c70896ffeeef32b9c950ywan// either a boolean expression or an AssertionResult. text is a textual
8067233d2500723e5594f3e7c70896ffeeef32b9c950ywan// represenation of expression as it was passed into the EXPECT_TRUE.
8068233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
8069233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8070233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (const ::testing::AssertionResult gtest_ar_ = \
8071233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::AssertionResult(expression)) \
8072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; \
8073233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else \
8074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    fail(::testing::internal::GetBoolAssertionFailureMessage(\
8075233d2500723e5594f3e7c70896ffeeef32b9c950ywan        gtest_ar_, text, #actual, #expected).c_str())
8076233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8077233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
8078233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::AlwaysTrue()) { \
8080233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
8081233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8082233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
8083233d2500723e5594f3e7c70896ffeeef32b9c950ywan      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
8084233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8085233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else \
8086233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
8087233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fail("Expected: " #statement " doesn't generate new fatal " \
8088233d2500723e5594f3e7c70896ffeeef32b9c950ywan           "failures in the current thread.\n" \
8089233d2500723e5594f3e7c70896ffeeef32b9c950ywan           "  Actual: it does.")
8090233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8091233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Expands to the name of the class that implements the given test.
8092233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
8093233d2500723e5594f3e7c70896ffeeef32b9c950ywan  test_case_name##_##test_name##_Test
8094233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8095233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper macro for defining tests.
8096233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
8097233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
8098233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:\
8099233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
8100233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:\
8101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TestBody();\
8102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
8103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
8104233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
8105233d2500723e5594f3e7c70896ffeeef32b9c950ywan};\
8106233d2500723e5594f3e7c70896ffeeef32b9c950ywan\
8107233d2500723e5594f3e7c70896ffeeef32b9c950ywan::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
8108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::test_info_ =\
8109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::internal::MakeAndRegisterTestInfo(\
8110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        #test_case_name, #test_name, NULL, NULL, \
8111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        (parent_id), \
8112233d2500723e5594f3e7c70896ffeeef32b9c950ywan        parent_class::SetUpTestCase, \
8113233d2500723e5594f3e7c70896ffeeef32b9c950ywan        parent_class::TearDownTestCase, \
8114233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new ::testing::internal::TestFactoryImpl<\
8115233d2500723e5594f3e7c70896ffeeef32b9c950ywan            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
8116233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
8117233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8118233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
8119233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
8120233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
8121233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8122233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
8123233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
8124233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
8125233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8126233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
8127233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
8128233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
8129233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
8130233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
8131233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
8132233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
8133233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
8134233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
8135233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8136233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8137233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8138233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8139233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8140233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8141233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8142233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8143233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8144233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8145233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8146233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8147233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8148233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
8149233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8150233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Google C++ Testing Framework (Google Test)
8151233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8152233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file defines the public API for death tests.  It is
8153233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #included by gtest.h so a user doesn't need to include this
8154233d2500723e5594f3e7c70896ffeeef32b9c950ywan// directly.
8155233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8156233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
8157233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
8158233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8159233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2005, Google Inc.
8160233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
8161233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8162233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
8163233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
8164233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
8165233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8166233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
8167233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
8168233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
8169233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
8170233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
8171233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
8172233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
8173233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
8174233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
8175233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8176233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8177233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8178233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8179233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8180233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8181233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8182233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8183233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8184233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8185233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8186233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8187233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8188233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
8189233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8190233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The Google C++ Testing Framework (Google Test)
8191233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8192233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header file defines internal utilities needed for implementing
8193233d2500723e5594f3e7c70896ffeeef32b9c950ywan// death tests.  They are subject to change without notice.
8194233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8195233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
8196233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
8197233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8198233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8199233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h>
8200233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8201233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
8202233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
8203233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8204233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_string_(internal_run_death_test);
8205233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8206233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Names of the flags (needed for parsing Google Test flags).
8207233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst char kDeathTestStyleFlag[] = "death_test_style";
8208233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst char kDeathTestUseFork[] = "death_test_use_fork";
8209233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst char kInternalRunDeathTestFlag[] = "internal_run_death_test";
8210233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8211233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_DEATH_TEST
8212233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8213233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DeathTest is a class that hides much of the complexity of the
8214233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
8215233d2500723e5594f3e7c70896ffeeef32b9c950ywan// returns a concrete class that depends on the prevailing death test
8216233d2500723e5594f3e7c70896ffeeef32b9c950ywan// style, as defined by the --gtest_death_test_style and/or
8217233d2500723e5594f3e7c70896ffeeef32b9c950ywan// --gtest_internal_run_death_test flags.
8218233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8219233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In describing the results of death tests, these terms are used with
8220233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the corresponding definitions:
8221233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8222233d2500723e5594f3e7c70896ffeeef32b9c950ywan// exit status:  The integer exit information in the format specified
8223233d2500723e5594f3e7c70896ffeeef32b9c950ywan//               by wait(2)
8224233d2500723e5594f3e7c70896ffeeef32b9c950ywan// exit code:    The integer code passed to exit(3), _exit(2), or
8225233d2500723e5594f3e7c70896ffeeef32b9c950ywan//               returned from main()
8226233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ DeathTest {
8227233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
8228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Create returns false if there was an error determining the
8229233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // appropriate action to take for the current death test; for example,
8230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // if the gtest_death_test_style flag is set to an invalid value.
8231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The LastMessage method will return a more detailed message in that
8232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
8233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // argument is set.  If the death test should be skipped, the pointer
8234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // is set to NULL; otherwise, it is set to the address of a new concrete
8235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // DeathTest object that controls the execution of the current test.
8236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool Create(const char* statement, const RE* regex,
8237233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     const char* file, int line, DeathTest** test);
8238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  DeathTest();
8239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~DeathTest() { }
8240233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A helper class that aborts a death test when it's deleted.
8242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class ReturnSentinel {
8243233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
8244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
8245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
8246233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
8247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DeathTest* const test_;
8248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
8249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } GTEST_ATTRIBUTE_UNUSED_;
8250233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // An enumeration of possible roles that may be taken when a death
8252233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test is encountered.  EXECUTE means that the death test logic should
8253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // be executed immediately.  OVERSEE means that the program should prepare
8254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the appropriate environment for a child process to execute the death
8255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test, then wait for it to complete.
8256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
8257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // An enumeration of the three reasons that a test might be aborted.
8259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  enum AbortReason {
8260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TEST_ENCOUNTERED_RETURN_STATEMENT,
8261233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TEST_THREW_EXCEPTION,
8262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TEST_DID_NOT_DIE
8263233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
8264233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8265233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Assumes one of the above roles.
8266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual TestRole AssumeRole() = 0;
8267233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Waits for the death test to finish and returns its status.
8269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual int Wait() = 0;
8270233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if the death test passed; that is, the test process
8272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // exited during the test, its exit status matches a user-supplied
8273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // predicate, and its stderr output matches a user-supplied regular
8274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // expression.
8275233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The user-supplied predicate may be a macro expression rather
8276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // than a function pointer or functor, or else Wait and Passed could
8277233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // be combined.
8278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual bool Passed(bool exit_status_ok) = 0;
8279233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Signals that the death test did not die as expected.
8281233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void Abort(AbortReason reason) = 0;
8282233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns a human-readable outcome message regarding the outcome of
8284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the last death test.
8285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const char* LastMessage();
8286233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8287233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void set_last_death_test_message(const std::string& message);
8288233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8289233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
8290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A string containing a description of the outcome of the last death test.
8291233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static std::string last_death_test_message_;
8292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8293233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
8294233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8295233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8296233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Factory interface for death tests.  May be mocked out for testing.
8297233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass DeathTestFactory {
8298233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
8299233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~DeathTestFactory() { }
8300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual bool Create(const char* statement, const RE* regex,
8301233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      const char* file, int line, DeathTest** test) = 0;
8302233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8303233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8304233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A concrete DeathTestFactory implementation for normal use.
8305233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass DefaultDeathTestFactory : public DeathTestFactory {
8306233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
8307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual bool Create(const char* statement, const RE* regex,
8308233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      const char* file, int line, DeathTest** test);
8309233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8310233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8311233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns true if exit_status describes a process that was terminated
8312233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by a signal, or exited normally with a nonzero exit code.
8313233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ bool ExitedUnsuccessfully(int exit_status);
8314233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8315233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Traps C++ exceptions escaping statement and reports them as test
8316233d2500723e5594f3e7c70896ffeeef32b9c950ywan// failures. Note that trapping SEH exceptions is not implemented here.
8317233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_HAS_EXCEPTIONS
8318233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
8319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  try { \
8320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } catch (const ::std::exception& gtest_exception) { \
8322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    fprintf(\
8323233d2500723e5594f3e7c70896ffeeef32b9c950ywan        stderr, \
8324233d2500723e5594f3e7c70896ffeeef32b9c950ywan        "\n%s: Caught std::exception-derived exception escaping the " \
8325233d2500723e5594f3e7c70896ffeeef32b9c950ywan        "death test statement. Exception message: %s\n", \
8326233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
8327233d2500723e5594f3e7c70896ffeeef32b9c950ywan        gtest_exception.what()); \
8328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    fflush(stderr); \
8329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
8330233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } catch (...) { \
8331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
8332233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
8333233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8334233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
8335233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
8336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
8337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8338233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif
8339233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8340233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
8341233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ASSERT_EXIT*, and EXPECT_EXIT*.
8342233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
8343233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8344233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::AlwaysTrue()) { \
8345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::testing::internal::RE& gtest_regex = (regex); \
8346233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::internal::DeathTest* gtest_dt; \
8347233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
8348233d2500723e5594f3e7c70896ffeeef32b9c950ywan        __FILE__, __LINE__, &gtest_dt)) { \
8349233d2500723e5594f3e7c70896ffeeef32b9c950ywan      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
8350233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8351233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (gtest_dt != NULL) { \
8352233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
8353233d2500723e5594f3e7c70896ffeeef32b9c950ywan          gtest_dt_ptr(gtest_dt); \
8354233d2500723e5594f3e7c70896ffeeef32b9c950ywan      switch (gtest_dt->AssumeRole()) { \
8355233d2500723e5594f3e7c70896ffeeef32b9c950ywan        case ::testing::internal::DeathTest::OVERSEE_TEST: \
8356233d2500723e5594f3e7c70896ffeeef32b9c950ywan          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
8357233d2500723e5594f3e7c70896ffeeef32b9c950ywan            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
8358233d2500723e5594f3e7c70896ffeeef32b9c950ywan          } \
8359233d2500723e5594f3e7c70896ffeeef32b9c950ywan          break; \
8360233d2500723e5594f3e7c70896ffeeef32b9c950ywan        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
8361233d2500723e5594f3e7c70896ffeeef32b9c950ywan          ::testing::internal::DeathTest::ReturnSentinel \
8362233d2500723e5594f3e7c70896ffeeef32b9c950ywan              gtest_sentinel(gtest_dt); \
8363233d2500723e5594f3e7c70896ffeeef32b9c950ywan          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
8364233d2500723e5594f3e7c70896ffeeef32b9c950ywan          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
8365233d2500723e5594f3e7c70896ffeeef32b9c950ywan          break; \
8366233d2500723e5594f3e7c70896ffeeef32b9c950ywan        } \
8367233d2500723e5594f3e7c70896ffeeef32b9c950ywan        default: \
8368233d2500723e5594f3e7c70896ffeeef32b9c950ywan          break; \
8369233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } \
8370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
8371233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else \
8372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
8373233d2500723e5594f3e7c70896ffeeef32b9c950ywan      fail(::testing::internal::DeathTest::LastMessage())
8374233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The symbol "fail" here expands to something into which a message
8375233d2500723e5594f3e7c70896ffeeef32b9c950ywan// can be streamed.
8376233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8377233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
8378233d2500723e5594f3e7c70896ffeeef32b9c950ywan// NDEBUG mode. In this case we need the statements to be executed, the regex is
8379233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ignored, and the macro must accept a streamed message even though the message
8380233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is never printed.
8381233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
8382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8383233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (::testing::internal::AlwaysTrue()) { \
8384233d2500723e5594f3e7c70896ffeeef32b9c950ywan     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else \
8386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::testing::Message()
8387233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8388233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A class representing the parsed contents of the
8389233d2500723e5594f3e7c70896ffeeef32b9c950ywan// --gtest_internal_run_death_test flag, as it existed when
8390233d2500723e5594f3e7c70896ffeeef32b9c950ywan// RUN_ALL_TESTS was called.
8391233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass InternalRunDeathTestFlag {
8392233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
8393233d2500723e5594f3e7c70896ffeeef32b9c950ywan  InternalRunDeathTestFlag(const std::string& a_file,
8394233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           int a_line,
8395233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           int an_index,
8396233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           int a_write_fd)
8397233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : file_(a_file), line_(a_line), index_(an_index),
8398233d2500723e5594f3e7c70896ffeeef32b9c950ywan        write_fd_(a_write_fd) {}
8399233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8400233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~InternalRunDeathTestFlag() {
8401233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (write_fd_ >= 0)
8402233d2500723e5594f3e7c70896ffeeef32b9c950ywan      posix::Close(write_fd_);
8403233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
8404233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::string& file() const { return file_; }
8406233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int line() const { return line_; }
8407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int index() const { return index_; }
8408233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int write_fd() const { return write_fd_; }
8409233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8410233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
8411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string file_;
8412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int line_;
8413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int index_;
8414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int write_fd_;
8415233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
8417233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8418233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8419233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns a newly created InternalRunDeathTestFlag object with fields
8420233d2500723e5594f3e7c70896ffeeef32b9c950ywan// initialized from the GTEST_FLAG(internal_run_death_test) flag if
8421233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the flag is specified; otherwise returns NULL.
8422233d2500723e5594f3e7c70896ffeeef32b9c950ywanInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
8423233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8424233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else  // GTEST_HAS_DEATH_TEST
8425233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8426233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This macro is used for implementing macros such as
8427233d2500723e5594f3e7c70896ffeeef32b9c950ywan// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
8428233d2500723e5594f3e7c70896ffeeef32b9c950ywan// death tests are not supported. Those macros must compile on such systems
8429233d2500723e5594f3e7c70896ffeeef32b9c950ywan// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
8430233d2500723e5594f3e7c70896ffeeef32b9c950ywan// systems that support death tests. This allows one to write such a macro
8431233d2500723e5594f3e7c70896ffeeef32b9c950ywan// on a system that does not support death tests and be sure that it will
8432233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compile on a death-test supporting system.
8433233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8434233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Parameters:
8435233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   statement -  A statement that a macro such as EXPECT_DEATH would test
8436233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                for program termination. This macro has to make sure this
8437233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                statement is compiled but not executed, to ensure that
8438233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
8439233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                parameter iff EXPECT_DEATH compiles with it.
8440233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
8441233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                the output of statement.  This parameter has to be
8442233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                compiled but not evaluated by this macro, to ensure that
8443233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                this macro only accepts expressions that a macro such as
8444233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                EXPECT_DEATH would accept.
8445233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
8446233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
8447233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
8448233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                compile inside functions where ASSERT_DEATH doesn't
8449233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                compile.
8450233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8451233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  The branch that has an always false condition is used to ensure that
8452233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  statement and regex are compiled (and thus syntactically correct) but
8453233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  never executed. The unreachable code macro protects the terminator
8454233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  statement from generating an 'unreachable code' warning in case
8455233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  statement unconditionally returns or throws. The Message constructor at
8456233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  the end allows the syntax of streaming additional messages into the
8457233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
8458233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
8459233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
8460233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (::testing::internal::AlwaysTrue()) { \
8461233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOG_(WARNING) \
8462233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "Death tests are not supported on this platform.\n" \
8463233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "Statement '" #statement "' cannot be verified."; \
8464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else if (::testing::internal::AlwaysFalse()) { \
8465233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::internal::RE::PartialMatch(".*", (regex)); \
8466233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
8467233d2500723e5594f3e7c70896ffeeef32b9c950ywan      terminator; \
8468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else \
8469233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::Message()
8470233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8471233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_DEATH_TEST
8472233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8473233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
8474233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
8475233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8476233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
8477233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8478233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
8479233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8480233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag controls the style of death tests.  Valid values are "threadsafe",
8481233d2500723e5594f3e7c70896ffeeef32b9c950ywan// meaning that the death test child process will re-execute the test binary
8482233d2500723e5594f3e7c70896ffeeef32b9c950ywan// from the start, running only a single death test, or "fast",
8483233d2500723e5594f3e7c70896ffeeef32b9c950ywan// meaning that the child process will execute the test logic immediately
8484233d2500723e5594f3e7c70896ffeeef32b9c950ywan// after forking.
8485233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_string_(death_test_style);
8486233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8487233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_DEATH_TEST
8488233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8489233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
8490233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8491233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Returns a Boolean value indicating whether the caller is currently
8492233d2500723e5594f3e7c70896ffeeef32b9c950ywan// executing in the context of the death test child process.  Tools such as
8493233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Valgrind heap checkers may need this to modify their behavior in death
8494233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tests.  IMPORTANT: This is an internal utility.  Using it may break the
8495233d2500723e5594f3e7c70896ffeeef32b9c950ywan// implementation of death tests.  User code MUST NOT use it.
8496233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ bool InDeathTestChild();
8497233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8498233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
8499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8500233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The following macros are useful for writing death tests.
8501233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8502233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
8503233d2500723e5594f3e7c70896ffeeef32b9c950ywan// executed:
8504233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8505233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   1. It generates a warning if there is more than one active
8506233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   thread.  This is because it's safe to fork() or clone() only
8507233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   when there is a single thread.
8508233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8509233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   2. The parent process clone()s a sub-process and runs the death
8510233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   test in it; the sub-process exits with code 0 at the end of the
8511233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   death test, if it hasn't exited already.
8512233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8513233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   3. The parent process waits for the sub-process to terminate.
8514233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8515233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   4. The parent process checks the exit code and error message of
8516233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   the sub-process.
8517233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8518233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Examples:
8519233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8520233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
8521233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   for (int i = 0; i < 5; i++) {
8522233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     EXPECT_DEATH(server.ProcessRequest(i),
8523233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                  "Invalid request .* in ProcessRequest()")
8524233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                  << "Failed to die on request " << i;
8525233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
8526233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8527233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
8528233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8529233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   bool KilledBySIGHUP(int exit_code) {
8530233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
8531233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
8532233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8533233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
8534233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8535233d2500723e5594f3e7c70896ffeeef32b9c950ywan// On the regular expressions used in death tests:
8536233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8537233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
8538233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   which uses the POSIX extended regex syntax.
8539233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8540233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   On other platforms (e.g. Windows), we only support a simple regex
8541233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   syntax implemented as part of Google Test.  This limited
8542233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   implementation should be enough most of the time when writing
8543233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   death tests; though it lacks many features you can find in PCRE
8544233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   or POSIX extended regex syntax.  For example, we don't support
8545233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
8546233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   repetition count ("x{5,7}"), among others.
8547233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8548233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Below is the syntax that we do support.  We chose it to be a
8549233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   subset of both PCRE and POSIX extended regex, so it's easy to
8550233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   learn wherever you come from.  In the following: 'A' denotes a
8551233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   literal character, period (.), or a single \\ escape sequence;
8552233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
8553233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   natural numbers.
8554233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8555233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     c     matches any literal character c
8556233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\d   matches any decimal digit
8557233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\D   matches any character that's not a decimal digit
8558233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\f   matches \f
8559233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\n   matches \n
8560233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\r   matches \r
8561233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\s   matches any ASCII whitespace, including \n
8562233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\S   matches any character that's not a whitespace
8563233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\t   matches \t
8564233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\v   matches \v
8565233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\w   matches any letter, _, or decimal digit
8566233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\W   matches any character that \\w doesn't match
8567233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     \\c   matches any literal character c, which must be a punctuation
8568233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     .     matches any single character except \n
8569233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     A?    matches 0 or 1 occurrences of A
8570233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     A*    matches 0 or many occurrences of A
8571233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     A+    matches 1 or many occurrences of A
8572233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     ^     matches the beginning of a string (not that of each line)
8573233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     $     matches the end of a string (not that of each line)
8574233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     xy    matches x followed by y
8575233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8576233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   If you accidentally use PCRE or POSIX extended regex features
8577233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   not implemented by us, you will get a run-time failure.  In that
8578233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   case, please try to rewrite your regular expression within the
8579233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   above syntax.
8580233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8581233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   This implementation is *not* meant to be as highly tuned or robust
8582233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   as a compiled regex library, but should perform well enough for a
8583233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   death test, which already incurs significant overhead by launching
8584233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   a child process.
8585233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8586233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Known caveats:
8587233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8588233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   A "threadsafe" style death test obtains the path to the test
8589233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   program from argv[0] and re-executes it in the sub-process.  For
8590233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   simplicity, the current implementation doesn't search the PATH
8591233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   when launching the sub-process.  This means that the user must
8592233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   invoke the test program via a path that contains at least one
8593233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   path separator (e.g. path/to/foo_test and
8594233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
8595233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   is rarely a problem as people usually don't put the test binary
8596233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   directory in PATH.
8597233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8598233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(wan@google.com): make thread-safe death tests search the PATH.
8599233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8600233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Asserts that a given statement causes the program to exit, with an
8601233d2500723e5594f3e7c70896ffeeef32b9c950ywan// integer exit status that satisfies predicate, and emitting error output
8602233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that matches regex.
8603233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_EXIT(statement, predicate, regex) \
8604233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
8605233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8606233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Like ASSERT_EXIT, but continues on to successive tests in the
8607233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test case, if any:
8608233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define EXPECT_EXIT(statement, predicate, regex) \
8609233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
8610233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8611233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Asserts that a given statement causes the program to exit, either by
8612233d2500723e5594f3e7c70896ffeeef32b9c950ywan// explicitly exiting with a nonzero exit code or being killed by a
8613233d2500723e5594f3e7c70896ffeeef32b9c950ywan// signal, and emitting error output that matches regex.
8614233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_DEATH(statement, regex) \
8615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
8616233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8617233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Like ASSERT_DEATH, but continues on to successive tests in the
8618233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test case, if any:
8619233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define EXPECT_DEATH(statement, regex) \
8620233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
8621233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8622233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
8623233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8624233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Tests that an exit code describes a normal exit with a given exit code.
8625233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ ExitedWithCode {
8626233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
8627233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ExitedWithCode(int exit_code);
8628233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator()(int exit_status) const;
8629233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
8630233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
8631233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ExitedWithCode& other);
8632233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8633233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int exit_code_;
8634233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8635233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8636233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if !GTEST_OS_WINDOWS
8637233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Tests that an exit code describes an exit due to termination by a
8638233d2500723e5594f3e7c70896ffeeef32b9c950ywan// given signal.
8639233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ KilledBySignal {
8640233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
8641233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit KilledBySignal(int signum);
8642233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator()(int exit_status) const;
8643233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
8644233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int signum_;
8645233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8646233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // !GTEST_OS_WINDOWS
8647233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8648233d2500723e5594f3e7c70896ffeeef32b9c950ywan// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
8649233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The death testing framework causes this to have interesting semantics,
8650233d2500723e5594f3e7c70896ffeeef32b9c950ywan// since the sideeffects of the call are only visible in opt mode, and not
8651233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in debug mode.
8652233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8653233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In practice, this can be used to test functions that utilize the
8654233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LOG(DFATAL) macro using the following style:
8655233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8656233d2500723e5594f3e7c70896ffeeef32b9c950ywan// int DieInDebugOr12(int* sideeffect) {
8657233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   if (sideeffect) {
8658233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     *sideeffect = 12;
8659233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
8660233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   LOG(DFATAL) << "death";
8661233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   return 12;
8662233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
8663233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8664233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
8665233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   int sideeffect = 0;
8666233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Only asserts in dbg.
8667233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
8668233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8669233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #ifdef NDEBUG
8670233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // opt-mode has sideeffect visible.
8671233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(12, sideeffect);
8672233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #else
8673233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // dbg-mode no visible sideeffect.
8674233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(0, sideeffect);
8675233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #endif
8676233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
8677233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8678233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This will assert that DieInDebugReturn12InOpt() crashes in debug
8679233d2500723e5594f3e7c70896ffeeef32b9c950ywan// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
8680233d2500723e5594f3e7c70896ffeeef32b9c950ywan// appropriate fallback value (12 in this case) in opt mode. If you
8681233d2500723e5594f3e7c70896ffeeef32b9c950ywan// need to test that a function has appropriate side-effects in opt
8682233d2500723e5594f3e7c70896ffeeef32b9c950ywan// mode, include assertions against the side-effects.  A general
8683233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pattern for this is:
8684233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8685233d2500723e5594f3e7c70896ffeeef32b9c950ywan// EXPECT_DEBUG_DEATH({
8686233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Side-effects here will have an effect after this statement in
8687233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // opt mode, but none in debug mode.
8688233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
8689233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }, "death");
8690233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8691233d2500723e5594f3e7c70896ffeeef32b9c950ywan# ifdef NDEBUG
8692233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8693233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define EXPECT_DEBUG_DEATH(statement, regex) \
8694233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_EXECUTE_STATEMENT_(statement, regex)
8695233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8696233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define ASSERT_DEBUG_DEATH(statement, regex) \
8697233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_EXECUTE_STATEMENT_(statement, regex)
8698233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8699233d2500723e5594f3e7c70896ffeeef32b9c950ywan# else
8700233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8701233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define EXPECT_DEBUG_DEATH(statement, regex) \
8702233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_DEATH(statement, regex)
8703233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8704233d2500723e5594f3e7c70896ffeeef32b9c950ywan#  define ASSERT_DEBUG_DEATH(statement, regex) \
8705233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_DEATH(statement, regex)
8706233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8707233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // NDEBUG for EXPECT_DEBUG_DEATH
8708233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_DEATH_TEST
8709233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8710233d2500723e5594f3e7c70896ffeeef32b9c950ywan// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
8711233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
8712233d2500723e5594f3e7c70896ffeeef32b9c950ywan// death tests are supported; otherwise they just issue a warning.  This is
8713233d2500723e5594f3e7c70896ffeeef32b9c950ywan// useful when you are combining death test assertions with normal test
8714233d2500723e5594f3e7c70896ffeeef32b9c950ywan// assertions in one test.
8715233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_DEATH_TEST
8716233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
8717233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPECT_DEATH(statement, regex)
8718233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
8719233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_DEATH(statement, regex)
8720233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
8721233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
8722233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
8723233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
8724233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
8725233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
8726233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8727233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
8728233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8729233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
8730233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file was GENERATED by command:
8731233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     pump.py gtest-param-test.h.pump
8732233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DO NOT EDIT BY HAND!!!
8733233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8734233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008, Google Inc.
8735233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
8736233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8737233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
8738233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
8739233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
8740233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8741233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
8742233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
8743233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
8744233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
8745233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
8746233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
8747233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
8748233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
8749233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
8750233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8751233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8752233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8753233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8754233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8755233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8756233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8757233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8758233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8759233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8760233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8761233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8762233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8763233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Authors: vladl@google.com (Vlad Losev)
8764233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8765233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros and functions for implementing parameterized tests
8766233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in Google C++ Testing Framework (Google Test)
8767233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8768233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
8769233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8770233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
8771233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
8772233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8773233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8774233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Value-parameterized tests allow you to test your code with different
8775233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parameters without writing multiple copies of the same test.
8776233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8777233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Here is how you use value-parameterized tests:
8778233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8779233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0
8780233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8781233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To write value-parameterized tests, first you should define a fixture
8782233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class. It is usually derived from testing::TestWithParam<T> (see below for
8783233d2500723e5594f3e7c70896ffeeef32b9c950ywan// another inheritance scheme that's sometimes useful in more complicated
8784233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class hierarchies), where the type of your parameter values.
8785233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestWithParam<T> is itself derived from testing::Test. T can be any
8786233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyable type. If it's a raw pointer, you are responsible for managing the
8787233d2500723e5594f3e7c70896ffeeef32b9c950ywan// lifespan of the pointed values.
8788233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8789233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FooTest : public ::testing::TestWithParam<const char*> {
8790233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // You can implement all the usual class fixture members here.
8791233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8792233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8793233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Then, use the TEST_P macro to define as many parameterized tests
8794233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for this fixture as you want. The _P suffix is for "parameterized"
8795233d2500723e5594f3e7c70896ffeeef32b9c950ywan// or "pattern", whichever you prefer to think.
8796233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8797233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(FooTest, DoesBlah) {
8798233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Inside a test, access the test parameter with the GetParam() method
8799233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // of the TestWithParam<T> class:
8800233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_TRUE(foo.Blah(GetParam()));
8801233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ...
8802233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
8803233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8804233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(FooTest, HasBlahBlah) {
8805233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ...
8806233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
8807233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8808233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
8809233d2500723e5594f3e7c70896ffeeef32b9c950ywan// case with any set of parameters you want. Google Test defines a number
8810233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of functions for generating test parameters. They return what we call
8811233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (surprise!) parameter generators. Here is a  summary of them, which
8812233d2500723e5594f3e7c70896ffeeef32b9c950ywan// are all in the testing namespace:
8813233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8814233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8815233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  Range(begin, end [, step]) - Yields values {begin, begin+step,
8816233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                               begin+step+step, ...}. The values do not
8817233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                               include end. step defaults to 1.
8818233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
8819233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  ValuesIn(container)        - Yields values from a C-style array, an STL
8820233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
8821233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  Bool()                     - Yields sequence {false, true}.
8822233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
8823233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                               for the math savvy) of the values generated
8824233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                               by the N generators.
8825233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8826233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For more details, see comments at the definitions of these functions below
8827233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in this file.
8828233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8829233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The following statement will instantiate tests from the FooTest test case
8830233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each with parameter values "meeny", "miny", and "moe".
8831233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8832233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(InstantiationName,
8833233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        FooTest,
8834233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        Values("meeny", "miny", "moe"));
8835233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8836233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To distinguish different instances of the pattern, (yes, you
8837233d2500723e5594f3e7c70896ffeeef32b9c950ywan// can instantiate it more then once) the first argument to the
8838233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
8839233d2500723e5594f3e7c70896ffeeef32b9c950ywan// actual test case name. Remember to pick unique prefixes for different
8840233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instantiations. The tests from the instantiation above will have
8841233d2500723e5594f3e7c70896ffeeef32b9c950ywan// these names:
8842233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8843233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
8844233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
8845233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
8846233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
8847233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
8848233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
8849233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8850233d2500723e5594f3e7c70896ffeeef32b9c950ywan// You can use these names in --gtest_filter.
8851233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8852233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This statement will instantiate all tests from FooTest again, each
8853233d2500723e5594f3e7c70896ffeeef32b9c950ywan// with parameter values "cat" and "dog":
8854233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8855233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst char* pets[] = {"cat", "dog"};
8856233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
8857233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8858233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The tests from the instantiation above will have these names:
8859233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8860233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
8861233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
8862233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
8863233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
8864233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8865233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
8866233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the given test case, whether their definitions come before or
8867233d2500723e5594f3e7c70896ffeeef32b9c950ywan// AFTER the INSTANTIATE_TEST_CASE_P statement.
8868233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8869233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Please also note that generator expressions (including parameters to the
8870233d2500723e5594f3e7c70896ffeeef32b9c950ywan// generators) are evaluated in InitGoogleTest(), after main() has started.
8871233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This allows the user on one hand, to adjust generator parameters in order
8872233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to dynamically determine a set of tests to run and on the other hand,
8873233d2500723e5594f3e7c70896ffeeef32b9c950ywan// give the user a chance to inspect the generated tests with Google Test
8874233d2500723e5594f3e7c70896ffeeef32b9c950ywan// reflection API before RUN_ALL_TESTS() is executed.
8875233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8876233d2500723e5594f3e7c70896ffeeef32b9c950ywan// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
8877233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for more examples.
8878233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8879233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In the future, we plan to publish the API for defining new parameter
8880233d2500723e5594f3e7c70896ffeeef32b9c950ywan// generators. But for now this interface remains part of the internal
8881233d2500723e5594f3e7c70896ffeeef32b9c950ywan// implementation and is subject to change.
8882233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8883233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8884233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A parameterized test fixture must be derived from testing::Test and from
8885233d2500723e5594f3e7c70896ffeeef32b9c950ywan// testing::WithParamInterface<T>, where T is the type of the parameter
8886233d2500723e5594f3e7c70896ffeeef32b9c950ywan// values. Inheriting from TestWithParam<T> satisfies that requirement because
8887233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestWithParam<T> inherits from both Test and WithParamInterface. In more
8888233d2500723e5594f3e7c70896ffeeef32b9c950ywan// complicated hierarchies, however, it is occasionally useful to inherit
8889233d2500723e5594f3e7c70896ffeeef32b9c950ywan// separately from Test and WithParamInterface. For example:
8890233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8891233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass BaseTest : public ::testing::Test {
8892233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // You can inherit all the usual members for a non-parameterized test
8893233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // fixture here.
8894233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8895233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8896233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
8897233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The usual test fixture members go here too.
8898233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
8899233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8900233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_F(BaseTest, HasFoo) {
8901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This is an ordinary non-parameterized test.
8902233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
8903233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8904233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(DerivedTest, DoesBlah) {
8905233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // GetParam works just the same here as if you inherit from TestWithParam.
8906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_TRUE(foo.Blah(GetParam()));
8907233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
8908233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8909233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // 0
8910233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8911233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8912233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_OS_SYMBIAN
8913233d2500723e5594f3e7c70896ffeeef32b9c950ywan# include <utility>
8914233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
8915233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8916233d2500723e5594f3e7c70896ffeeef32b9c950ywan// scripts/fuse_gtest.py depends on gtest's own header being #included
8917233d2500723e5594f3e7c70896ffeeef32b9c950ywan// *unconditionally*.  Therefore these #includes cannot be moved
8918233d2500723e5594f3e7c70896ffeeef32b9c950ywan// inside #if GTEST_HAS_PARAM_TEST.
8919233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008 Google Inc.
8920233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All Rights Reserved.
8921233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8922233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
8923233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
8924233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
8925233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8926233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
8927233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
8928233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
8929233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
8930233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
8931233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
8932233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
8933233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
8934233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
8935233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8936233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8937233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8938233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8939233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8940233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8941233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8942233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8943233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8944233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8945233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8946233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8947233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8948233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: vladl@google.com (Vlad Losev)
8949233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8950233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Type and function utilities for implementing parameterized tests.
8951233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8952233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
8953233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
8954233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8955233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <iterator>
8956233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <utility>
8957233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <vector>
8958233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8959233d2500723e5594f3e7c70896ffeeef32b9c950ywan// scripts/fuse_gtest.py depends on gtest's own header being #included
8960233d2500723e5594f3e7c70896ffeeef32b9c950ywan// *unconditionally*.  Therefore these #includes cannot be moved
8961233d2500723e5594f3e7c70896ffeeef32b9c950ywan// inside #if GTEST_HAS_PARAM_TEST.
8962233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2003 Google Inc.
8963233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
8964233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8965233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
8966233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
8967233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
8968233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8969233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
8970233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
8971233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
8972233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
8973233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
8974233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
8975233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
8976233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
8977233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
8978233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8979233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8980233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
8981233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8982233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8983233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8984233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8985233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
8986233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
8987233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
8988233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
8989233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8990233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8991233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Authors: Dan Egnor (egnor@google.com)
8992233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8993233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A "smart" pointer type with reference tracking.  Every pointer to a
8994233d2500723e5594f3e7c70896ffeeef32b9c950ywan// particular object is kept on a circular linked list.  When the last pointer
8995233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to an object is destroyed or reassigned, the object is deleted.
8996233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
8997233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used properly, this deletes the object when the last reference goes away.
8998233d2500723e5594f3e7c70896ffeeef32b9c950ywan// There are several caveats:
8999233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - Like all reference counting schemes, cycles lead to leaks.
9000233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - Each smart pointer is actually two pointers (8 bytes instead of 4).
9001233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - Every time a pointer is assigned, the entire list of pointers to that
9002233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   object is traversed.  This class is therefore NOT SUITABLE when there
9003233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   will often be more than two or three pointers to a particular object.
9004233d2500723e5594f3e7c70896ffeeef32b9c950ywan// - References are only tracked as long as linked_ptr<> objects are copied.
9005233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
9006233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   will happen (double deletion).
9007233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9008233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A good use of this class is storing object references in STL containers.
9009233d2500723e5594f3e7c70896ffeeef32b9c950ywan// You can safely put linked_ptr<> in a vector<>.
9010233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Other uses may not be as good.
9011233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9012233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note: If you use an incomplete type with linked_ptr<>, the class
9013233d2500723e5594f3e7c70896ffeeef32b9c950ywan// *containing* linked_ptr<> must have a constructor and destructor (even
9014233d2500723e5594f3e7c70896ffeeef32b9c950ywan// if they do nothing!).
9015233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9016233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Bill Gibbons suggested we use something like this.
9017233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9018233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Thread Safety:
9019233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Unlike other linked_ptr implementations, in this implementation
9020233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   a linked_ptr object is thread-safe in the sense that:
9021233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     - it's safe to copy linked_ptr objects concurrently,
9022233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     - it's safe to copy *from* a linked_ptr and read its underlying
9023233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       raw pointer (e.g. via get()) concurrently, and
9024233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     - it's safe to write to two linked_ptrs that point to the same
9025233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       shared object concurrently.
9026233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
9027233d2500723e5594f3e7c70896ffeeef32b9c950ywan// confusion with normal linked_ptr.
9028233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9029233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
9030233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
9031233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9032233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h>
9033233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <assert.h>
9034233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9035233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9036233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
9037233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
9038233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9039233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Protects copying of all linked_ptr objects.
9040233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
9041233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9042233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This is used internally by all instances of linked_ptr<>.  It needs to be
9043233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a non-template class because different types of linked_ptr<> can refer to
9044233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
9045233d2500723e5594f3e7c70896ffeeef32b9c950ywan// So, it needs to be possible for different types of linked_ptr to participate
9046233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the same circular linked list, so we need a single class type here.
9047233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9048233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
9049233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass linked_ptr_internal {
9050233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9051233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Create a new circle that includes only this instance.
9052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void join_new() {
9053233d2500723e5594f3e7c70896ffeeef32b9c950ywan    next_ = this;
9054233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9055233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9056233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Many linked_ptr operations may change p.link_ for some linked_ptr
9057233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // variable p in the same circle as this object.  Therefore we need
9058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // to prevent two such operations from occurring concurrently.
9059233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9060233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Note that different types of linked_ptr objects can coexist in a
9061233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
9062233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
9063233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // protect all linked_ptr objects.  This can create serious
9064233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // contention in production code, but is acceptable in a testing
9065233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // framework.
9066233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9067233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Join an existing circle.
9068233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void join(linked_ptr_internal const* ptr)
9069233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
9070233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MutexLock lock(&g_linked_ptr_mutex);
9071233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    linked_ptr_internal const* p = ptr;
9073233d2500723e5594f3e7c70896ffeeef32b9c950ywan    while (p->next_ != ptr) p = p->next_;
9074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    p->next_ = this;
9075233d2500723e5594f3e7c70896ffeeef32b9c950ywan    next_ = ptr;
9076233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9077233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9078233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Leave whatever circle we're part of.  Returns true if we were the
9079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // last member of the circle.  Once this is done, you can join() another.
9080233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool depart()
9081233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
9082233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MutexLock lock(&g_linked_ptr_mutex);
9083233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9084233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (next_ == this) return true;
9085233d2500723e5594f3e7c70896ffeeef32b9c950ywan    linked_ptr_internal const* p = next_;
9086233d2500723e5594f3e7c70896ffeeef32b9c950ywan    while (p->next_ != this) p = p->next_;
9087233d2500723e5594f3e7c70896ffeeef32b9c950ywan    p->next_ = next_;
9088233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return false;
9089233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9090233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9091233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
9092233d2500723e5594f3e7c70896ffeeef32b9c950ywan  mutable linked_ptr_internal const* next_;
9093233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9094233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9095233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9096233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass linked_ptr {
9097233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9098233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T element_type;
9099233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9100233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Take over ownership of a raw pointer.  This should happen as soon as
9101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // possible after the object is created.
9102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
9103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~linked_ptr() { depart(); }
9104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
9106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
9107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  linked_ptr(linked_ptr const& ptr) {  // NOLINT
9108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    assert(&ptr != this);
9109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    copy(&ptr);
9110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9111233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Assignment releases the old value and acquires the new.
9113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
9114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    depart();
9115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    copy(&ptr);
9116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
9117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  linked_ptr& operator=(linked_ptr const& ptr) {
9120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (&ptr != this) {
9121233d2500723e5594f3e7c70896ffeeef32b9c950ywan      depart();
9122233d2500723e5594f3e7c70896ffeeef32b9c950ywan      copy(&ptr);
9123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
9124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
9125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9126233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Smart pointer members.
9128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void reset(T* ptr = NULL) {
9129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    depart();
9130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    capture(ptr);
9131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9132233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* get() const { return value_; }
9133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* operator->() const { return value_; }
9134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T& operator*() const { return *value_; }
9135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator==(T* p) const { return value_ == p; }
9137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator!=(T* p) const { return value_ != p; }
9138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U>
9139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator==(linked_ptr<U> const& ptr) const {
9140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return value_ == ptr.get();
9141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9142233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U>
9143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator!=(linked_ptr<U> const& ptr) const {
9144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return value_ != ptr.get();
9145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9147233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
9148233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U>
9149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class linked_ptr;
9150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T* value_;
9152233d2500723e5594f3e7c70896ffeeef32b9c950ywan  linked_ptr_internal link_;
9153233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void depart() {
9155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (link_.depart()) delete value_;
9156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void capture(T* ptr) {
9159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    value_ = ptr;
9160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    link_.join_new();
9161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9162233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename U> void copy(linked_ptr<U> const* ptr) {
9164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    value_ = ptr->get();
9165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (value_)
9166233d2500723e5594f3e7c70896ffeeef32b9c950ywan      link_.join(&ptr->link_);
9167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
9168233d2500723e5594f3e7c70896ffeeef32b9c950ywan      link_.join_new();
9169233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9170233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9171233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9172233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename T> inline
9173233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool operator==(T* ptr, const linked_ptr<T>& x) {
9174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ptr == x.get();
9175233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9177233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename T> inline
9178233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool operator!=(T* ptr, const linked_ptr<T>& x) {
9179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ptr != x.get();
9180233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9181233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9182233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A function to convert T* into linked_ptr<T>
9183233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
9184233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
9185233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9186233d2500723e5594f3e7c70896ffeeef32b9c950ywanlinked_ptr<T> make_linked_ptr(T* ptr) {
9187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return linked_ptr<T>(ptr);
9188233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9189233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9190233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
9191233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
9192233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9193233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
9194233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2007, Google Inc.
9195233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
9196233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9197233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
9198233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
9199233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
9200233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9201233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
9202233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
9203233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
9204233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
9205233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
9206233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
9207233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
9208233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
9209233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
9210233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9211233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
9212233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9213233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
9214233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9215233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9216233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9217233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
9218233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
9219233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
9220233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
9221233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9222233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9223233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
9224233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9225233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test - The Google C++ Testing Framework
9226233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9227233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file implements a universal value printer that can print a
9228233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value of any type T:
9229233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9230233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
9231233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9232233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A user can teach this function how to print a class type T by
9233233d2500723e5594f3e7c70896ffeeef32b9c950ywan// defining either operator<<() or PrintTo() in the namespace that
9234233d2500723e5594f3e7c70896ffeeef32b9c950ywan// defines T.  More specifically, the FIRST defined function in the
9235233d2500723e5594f3e7c70896ffeeef32b9c950ywan// following list will be used (assuming T is defined in namespace
9236233d2500723e5594f3e7c70896ffeeef32b9c950ywan// foo):
9237233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9238233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   1. foo::PrintTo(const T&, ostream*)
9239233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   2. operator<<(ostream&, const T&) defined in either foo or the
9240233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      global namespace.
9241233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9242233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If none of the above is defined, it will print the debug string of
9243233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the value if it is a protocol buffer, or print the raw bytes in the
9244233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value otherwise.
9245233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9246233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To aid debugging: when T is a reference type, the address of the
9247233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value is also printed; when T is a (const) char pointer, both the
9248233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pointer value and the NUL-terminated string it points to are
9249233d2500723e5594f3e7c70896ffeeef32b9c950ywan// printed.
9250233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9251233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We also provide some convenient wrappers:
9252233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9253233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Prints a value to a string.  For a (const or not) char
9254233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // pointer, the NUL-terminated string (but not the pointer) is
9255233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // printed.
9256233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   std::string ::testing::PrintToString(const T& value);
9257233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9258233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Prints a value tersely: for a reference type, the referenced
9259233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // value (but not the address) is printed; for a (const or not) char
9260233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // pointer, the NUL-terminated string (but not the pointer) is
9261233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // printed.
9262233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
9263233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9264233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Prints value using the type inferred by the compiler.  The difference
9265233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // from UniversalTersePrint() is that this function prints both the
9266233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // pointer and the NUL-terminated string for a (const or not) char pointer.
9267233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
9268233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9269233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Prints the fields of a tuple tersely to a string vector, one
9270233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // element for each field. Tuple support must be enabled in
9271233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // gtest-port.h.
9272233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
9273233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       const Tuple& value);
9274233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9275233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Known limitation:
9276233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9277233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The print primitives print the elements of an STL-style container
9278233d2500723e5594f3e7c70896ffeeef32b9c950ywan// using the compiler-inferred type of *iter where iter is a
9279233d2500723e5594f3e7c70896ffeeef32b9c950ywan// const_iterator of the container.  When const_iterator is an input
9280233d2500723e5594f3e7c70896ffeeef32b9c950ywan// iterator but not a forward iterator, this inferred type may not
9281233d2500723e5594f3e7c70896ffeeef32b9c950ywan// match value_type, and the print output may be incorrect.  In
9282233d2500723e5594f3e7c70896ffeeef32b9c950ywan// practice, this is rarely a problem as for most containers
9283233d2500723e5594f3e7c70896ffeeef32b9c950ywan// const_iterator is a forward iterator.  We'll fix this if there's an
9284233d2500723e5594f3e7c70896ffeeef32b9c950ywan// actual need for it.  Note that this fix cannot rely on value_type
9285233d2500723e5594f3e7c70896ffeeef32b9c950ywan// being defined as many user-defined container types don't have
9286233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value_type.
9287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9288233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
9289233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
9290233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9291233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <ostream>  // NOLINT
9292233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <sstream>
9293233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string>
9294233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <utility>
9295233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <vector>
9296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9297233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
9298233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9299233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Definitions in the 'internal' and 'internal2' name spaces are
9300233d2500723e5594f3e7c70896ffeeef32b9c950ywan// subject to change without notice.  DO NOT USE THEM IN USER CODE!
9301233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal2 {
9302233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9303233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints the given number of bytes in the given object to the given
9304233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ostream.
9305233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
9306233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     size_t count,
9307233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                     ::std::ostream* os);
9308233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9309233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For selecting which printer to use when a given type has neither <<
9310233d2500723e5594f3e7c70896ffeeef32b9c950ywan// nor PrintTo().
9311233d2500723e5594f3e7c70896ffeeef32b9c950ywanenum TypeKind {
9312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  kProtobuf,              // a protobuf type
9313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
9314233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          // (e.g. a named or unnamed enum type)
9315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  kOtherType              // anything else
9316233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9317233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9318233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
9319233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by the universal printer to print a value of type T when neither
9320233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operator<< nor PrintTo() is defined for T, where kTypeKind is the
9321233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "kind" of T as defined by enum TypeKind.
9322233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, TypeKind kTypeKind>
9323233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeWithoutFormatter {
9324233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This default version is called when kTypeKind is kOtherType.
9326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void PrintValue(const T& value, ::std::ostream* os) {
9327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
9328233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         sizeof(value), os);
9329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9330233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9332233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We print a protobuf using its ShortDebugString() when the string
9333233d2500723e5594f3e7c70896ffeeef32b9c950ywan// doesn't exceed this many characters; otherwise we print it using
9334233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DebugString() for better readability.
9335233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst size_t kProtobufOneLinerMaxLength = 50;
9336233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9337233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9338233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeWithoutFormatter<T, kProtobuf> {
9339233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9340233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void PrintValue(const T& value, ::std::ostream* os) {
9341233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::testing::internal::string short_str = value.ShortDebugString();
9342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::testing::internal::string pretty_str =
9343233d2500723e5594f3e7c70896ffeeef32b9c950ywan        short_str.length() <= kProtobufOneLinerMaxLength ?
9344233d2500723e5594f3e7c70896ffeeef32b9c950ywan        short_str : ("\n" + value.DebugString());
9345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << ("<" + pretty_str + ">");
9346233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9347233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9348233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9349233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9350233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TypeWithoutFormatter<T, kConvertibleToInteger> {
9351233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9352233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Since T has no << operator or PrintTo() but can be implicitly
9353233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // converted to BiggestInt, we print it as a BiggestInt.
9354233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9355233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Most likely T is an enum type (either named or unnamed), in which
9356233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // case printing it as an integer is the desired behavior.  In case
9357233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // T is not an enum, printing it as an integer is the best we can do
9358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // given that it has no user-defined printer.
9359233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void PrintValue(const T& value, ::std::ostream* os) {
9360233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const internal::BiggestInt kBigInt = value;
9361233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << kBigInt;
9362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9363233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9364233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9365233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints the given value to the given ostream.  If the value is a
9366233d2500723e5594f3e7c70896ffeeef32b9c950ywan// protocol message, its debug string is printed; if it's an enum or
9367233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of a type implicitly convertible to BiggestInt, it's printed as an
9368233d2500723e5594f3e7c70896ffeeef32b9c950ywan// integer; otherwise the bytes in the value are printed.  This is
9369233d2500723e5594f3e7c70896ffeeef32b9c950ywan// what UniversalPrinter<T>::Print() does when it knows nothing about
9370233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type T and T has neither << operator nor PrintTo().
9371233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9372233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A user can override this behavior for a class type Foo by defining
9373233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a << operator in the namespace where Foo is defined.
9374233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9375233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We put this operator in namespace 'internal2' instead of 'internal'
9376233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to simplify the implementation, as much code in 'internal' needs to
9377233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use << in STL, which would conflict with our own << were it defined
9378233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in 'internal'.
9379233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9380233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note that this operator<< takes a generic std::basic_ostream<Char,
9381233d2500723e5594f3e7c70896ffeeef32b9c950ywan// CharTraits> type instead of the more restricted std::ostream.  If
9382233d2500723e5594f3e7c70896ffeeef32b9c950ywan// we define it to take an std::ostream instead, we'll get an
9383233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "ambiguous overloads" compiler error when trying to print a type
9384233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Foo that supports streaming to std::basic_ostream<Char,
9385233d2500723e5594f3e7c70896ffeeef32b9c950ywan// CharTraits>, as the compiler cannot tell whether
9386233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operator<<(std::ostream&, const T&) or
9387233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
9388233d2500723e5594f3e7c70896ffeeef32b9c950ywan// specific.
9389233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Char, typename CharTraits, typename T>
9390233d2500723e5594f3e7c70896ffeeef32b9c950ywan::std::basic_ostream<Char, CharTraits>& operator<<(
9391233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
9392233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TypeWithoutFormatter<T,
9393233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
9394233d2500723e5594f3e7c70896ffeeef32b9c950ywan       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
9395233d2500723e5594f3e7c70896ffeeef32b9c950ywan       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
9396233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return os;
9397233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9398233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9399233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal2
9400233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
9401233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9402233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
9403233d2500723e5594f3e7c70896ffeeef32b9c950ywan// magic needed for implementing UniversalPrinter won't work.
9404233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing_internal {
9405233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9406233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used to print a value that is not an STL-style container when the
9407233d2500723e5594f3e7c70896ffeeef32b9c950ywan// user doesn't define PrintTo() for it.
9408233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9409233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
9410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // With the following statement, during unqualified name lookup,
9411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // testing::internal2::operator<< appears as if it was declared in
9412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the nearest enclosing namespace that contains both
9413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ::testing_internal and ::testing::internal2, i.e. the global
9414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // namespace.  For more details, refer to the C++ Standard section
9415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
9416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // testing::internal2::operator<< in case T doesn't come with a <<
9417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // operator.
9418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We cannot write 'using ::testing::internal2::operator<<;', which
9420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // gcc 3.3 fails to compile due to a compiler bug.
9421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  using namespace ::testing::internal2;  // NOLINT
9422233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9423233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Assuming T is defined in namespace foo, in the next statement,
9424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the compiler will consider all of:
9425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   1. foo::operator<< (thanks to Koenig look-up),
9427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   2. ::operator<< (as the current namespace is enclosed in ::),
9428233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   3. testing::internal2::operator<< (thanks to the using statement above).
9429233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The operator<< whose type matches T best will be picked.
9431233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We deliberately allow #2 to be a candidate, as sometimes it's
9433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // impossible to define #1 (e.g. when foo is ::std, defining
9434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // anything in it is undefined behavior unless you are a compiler
9435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // vendor.).
9436233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << value;
9437233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9438233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9439233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing_internal
9440233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9441233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
9442233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
9443233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9444233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
9445233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value to the given ostream.  The caller must ensure that
9446233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 'ostream_ptr' is not NULL, or the behavior is undefined.
9447233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9448233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We define UniversalPrinter as a class template (as opposed to a
9449233d2500723e5594f3e7c70896ffeeef32b9c950ywan// function template), as we need to partially specialize it for
9450233d2500723e5594f3e7c70896ffeeef32b9c950ywan// reference types, which cannot be done with function templates.
9451233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9452233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalPrinter;
9453233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9454233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9455233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid UniversalPrint(const T& value, ::std::ostream* os);
9456233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9457233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used to print an STL-style container when the user doesn't define
9458233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a PrintTo() for it.
9459233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename C>
9460233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid DefaultPrintTo(IsContainer /* dummy */,
9461233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    false_type /* is not a pointer */,
9462233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    const C& container, ::std::ostream* os) {
9463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const size_t kMaxCount = 32;  // The maximum number of elements to print.
9464233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << '{';
9465233d2500723e5594f3e7c70896ffeeef32b9c950ywan  size_t count = 0;
9466233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (typename C::const_iterator it = container.begin();
9467233d2500723e5594f3e7c70896ffeeef32b9c950ywan       it != container.end(); ++it, ++count) {
9468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (count > 0) {
9469233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *os << ',';
9470233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (count == kMaxCount) {  // Enough has been printed.
9471233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *os << " ...";
9472233d2500723e5594f3e7c70896ffeeef32b9c950ywan        break;
9473233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
9474233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
9475233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << ' ';
9476233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
9477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // handle *it being a native array.
9478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    internal::UniversalPrint(*it, os);
9479233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9480233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (count > 0) {
9482233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << ' ';
9483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9484233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << '}';
9485233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9486233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9487233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used to print a pointer that is neither a char pointer nor a member
9488233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pointer, when the user doesn't define PrintTo() for it.  (A member
9489233d2500723e5594f3e7c70896ffeeef32b9c950ywan// variable pointer or member function pointer doesn't really point to
9490233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a location in the address space.  Their representation is
9491233d2500723e5594f3e7c70896ffeeef32b9c950ywan// implementation-defined.  Therefore they will be printed as raw
9492233d2500723e5594f3e7c70896ffeeef32b9c950ywan// bytes.)
9493233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9494233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid DefaultPrintTo(IsNotContainer /* dummy */,
9495233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    true_type /* is a pointer */,
9496233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    T* p, ::std::ostream* os) {
9497233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (p == NULL) {
9498233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << "NULL";
9499233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
9500233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // C++ doesn't allow casting from a function pointer to any object
9501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // pointer.
9502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    //
9503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // IsTrue() silences warnings: "Condition is always true",
9504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // "unreachable code".
9505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
9506233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // T is not a function type.  We just call << to print p,
9507233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // relying on ADL to pick up user-defined << for their pointer
9508233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // types, if any.
9509233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *os << p;
9510233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
9511233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // T is a function type, so '*os << p' doesn't do what we want
9512233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // (it just prints p as bool).  We want to print p as a const
9513233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // void*.  However, we cannot cast it to const void* directly,
9514233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // even using reinterpret_cast, as earlier versions of gcc
9515233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // (e.g. 3.4.5) cannot compile the cast when p is a function
9516233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // pointer.  Casting to UInt64 first solves the problem.
9517233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *os << reinterpret_cast<const void*>(
9518233d2500723e5594f3e7c70896ffeeef32b9c950ywan          reinterpret_cast<internal::UInt64>(p));
9519233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
9520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9521233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9522233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9523233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used to print a non-container, non-pointer value when the user
9524233d2500723e5594f3e7c70896ffeeef32b9c950ywan// doesn't define PrintTo() for it.
9525233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9526233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid DefaultPrintTo(IsNotContainer /* dummy */,
9527233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    false_type /* is not a pointer */,
9528233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    const T& value, ::std::ostream* os) {
9529233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::testing_internal::DefaultPrintNonContainerTo(value, os);
9530233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9531233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9532233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints the given value using the << operator if it has one;
9533233d2500723e5594f3e7c70896ffeeef32b9c950ywan// otherwise prints the bytes in it.  This is what
9534233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
9535233d2500723e5594f3e7c70896ffeeef32b9c950ywan// or overloaded for type T.
9536233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
9537233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A user can override this behavior for a class type Foo by defining
9538233d2500723e5594f3e7c70896ffeeef32b9c950ywan// an overload of PrintTo() in the namespace where Foo is defined.  We
9539233d2500723e5594f3e7c70896ffeeef32b9c950ywan// give the user this option as sometimes defining a << operator for
9540233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Foo is not desirable (e.g. the coding style may prevent doing it,
9541233d2500723e5594f3e7c70896ffeeef32b9c950ywan// or there is already a << operator but it doesn't do what the user
9542233d2500723e5594f3e7c70896ffeeef32b9c950ywan// wants).
9543233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9544233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const T& value, ::std::ostream* os) {
9545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // DefaultPrintTo() is overloaded.  The type of its first two
9546233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // arguments determine which version will be picked.  If T is an
9547233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // STL-style container, the version for container will be called; if
9548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // T is a pointer, the pointer version will be called; otherwise the
9549233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // generic version will be called.
9550233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9551233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Note that we check for container types here, prior to we check
9552233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // for protocol message types in our operator<<.  The rationale is:
9553233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9554233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // For protocol messages, we want to give people a chance to
9555233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // override Google Mock's format by defining a PrintTo() or
9556233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // operator<<.  For STL containers, other formats can be
9557233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // incompatible with Google Mock's format for the container
9558233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // elements; therefore we check for container types here to ensure
9559233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // that our format is used.
9560233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9561233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The second argument of DefaultPrintTo() is needed to bypass a bug
9562233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // in Symbian's C++ compiler that prevents it from picking the right
9563233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // overload between:
9564233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
9565233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   PrintTo(const T& x, ...);
9566233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   PrintTo(T* x, ...);
9567233d2500723e5594f3e7c70896ffeeef32b9c950ywan  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
9568233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9569233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9570233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The following list of PrintTo() overloads tells
9571233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UniversalPrinter<T>::Print() how to print standard types (built-in
9572233d2500723e5594f3e7c70896ffeeef32b9c950ywan// types, strings, plain arrays, and pointers).
9573233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9574233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloads for various char types.
9575233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
9576233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
9577233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(char c, ::std::ostream* os) {
9578233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // When printing a plain char, we always treat it as unsigned.  This
9579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // way, the output won't be affected by whether the compiler thinks
9580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // char is signed or not.
9581233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(static_cast<unsigned char>(c), os);
9582233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9583233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9584233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloads for other simple built-in types.
9585233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(bool x, ::std::ostream* os) {
9586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << (x ? "true" : "false");
9587233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9588233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9589233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overload for wchar_t type.
9590233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints a wchar_t as a symbol if it is printable or as its internal
9591233d2500723e5594f3e7c70896ffeeef32b9c950ywan// code otherwise and also as its decimal code (except for L'\0').
9592233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The L'\0' char is printed as "L'\\0'". The decimal code is printed
9593233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as signed integer when wchar_t is implemented by the compiler
9594233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as a signed type and is printed as an unsigned integer when wchar_t
9595233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is implemented as an unsigned type.
9596233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
9597233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9598233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloads for C strings.
9599233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
9600233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(char* s, ::std::ostream* os) {
9601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(ImplicitCast_<const char*>(s), os);
9602233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9603233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9604233d2500723e5594f3e7c70896ffeeef32b9c950ywan// signed/unsigned char is often used for representing binary data, so
9605233d2500723e5594f3e7c70896ffeeef32b9c950ywan// we print pointers to it as void* to be safe.
9606233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const signed char* s, ::std::ostream* os) {
9607233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(ImplicitCast_<const void*>(s), os);
9608233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9609233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(signed char* s, ::std::ostream* os) {
9610233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(ImplicitCast_<const void*>(s), os);
9611233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9612233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const unsigned char* s, ::std::ostream* os) {
9613233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(ImplicitCast_<const void*>(s), os);
9614233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9615233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(unsigned char* s, ::std::ostream* os) {
9616233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(ImplicitCast_<const void*>(s), os);
9617233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9618233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9619233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MSVC can be configured to define wchar_t as a typedef of unsigned
9620233d2500723e5594f3e7c70896ffeeef32b9c950ywan// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
9621233d2500723e5594f3e7c70896ffeeef32b9c950ywan// type.  When wchar_t is a typedef, defining an overload for const
9622233d2500723e5594f3e7c70896ffeeef32b9c950ywan// wchar_t* would cause unsigned short* be printed as a wide string,
9623233d2500723e5594f3e7c70896ffeeef32b9c950ywan// possibly causing invalid memory accesses.
9624233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
9625233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloads for wide C strings
9626233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
9627233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(wchar_t* s, ::std::ostream* os) {
9628233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
9629233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9630233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
9631233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9632233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overload for C arrays.  Multi-dimensional arrays are printed
9633233d2500723e5594f3e7c70896ffeeef32b9c950ywan// properly.
9634233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9635233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints the given number of elements in an array, without printing
9636233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the curly braces.
9637233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9638233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
9639233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UniversalPrint(a[0], os);
9640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (size_t i = 1; i != count; i++) {
9641233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << ", ";
9642233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrint(a[i], os);
9643233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9644233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9645233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9646233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloads for ::string and ::std::string.
9647233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_STRING
9648233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
9649233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const ::string& s, ::std::ostream* os) {
9650233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintStringTo(s, os);
9651233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9652233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_STRING
9653233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9654233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
9655233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const ::std::string& s, ::std::ostream* os) {
9656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintStringTo(s, os);
9657233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9658233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9659233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloads for ::wstring and ::std::wstring.
9660233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_WSTRING
9661233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
9662233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const ::wstring& s, ::std::ostream* os) {
9663233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintWideStringTo(s, os);
9664233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9665233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_GLOBAL_WSTRING
9666233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9667233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_STD_WSTRING
9668233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
9669233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
9670233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintWideStringTo(s, os);
9671233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9672233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_STD_WSTRING
9673233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9674233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TR1_TUPLE
9675233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
9676233d2500723e5594f3e7c70896ffeeef32b9c950ywan// which are packed as tuples.
9677233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9678233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for printing a tuple.  T must be instantiated with
9679233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a tuple type.
9680233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9681233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTupleTo(const T& t, ::std::ostream* os);
9682233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9683233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overloaded PrintTo() for tuples of various arities.  We support
9684233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tuples of up-to 10 fields.  The following implementation works
9685233d2500723e5594f3e7c70896ffeeef32b9c950ywan// regardless of whether tr1::tuple is implemented using the
9686233d2500723e5594f3e7c70896ffeeef32b9c950ywan// non-standard variadic template feature or not.
9687233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9688233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
9689233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9690233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9691233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9692233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1>
9693233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
9694233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9695233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9696233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9697233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
9698233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
9699233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9700233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9701233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9702233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3>
9703233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
9704233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9705233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9706233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9707233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4>
9708233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
9709233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9710233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9711233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9712233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
9713233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
9714233d2500723e5594f3e7c70896ffeeef32b9c950ywan             ::std::ostream* os) {
9715233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9716233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9717233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9718233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9719233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T6>
9720233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
9721233d2500723e5594f3e7c70896ffeeef32b9c950ywan             ::std::ostream* os) {
9722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9723233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9724233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9725233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9726233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T6, typename T7>
9727233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
9728233d2500723e5594f3e7c70896ffeeef32b9c950ywan             ::std::ostream* os) {
9729233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9730233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9731233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9732233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9733233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T6, typename T7, typename T8>
9734233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
9735233d2500723e5594f3e7c70896ffeeef32b9c950ywan             ::std::ostream* os) {
9736233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9737233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9738233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9739233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9740233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T6, typename T7, typename T8, typename T9>
9741233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
9742233d2500723e5594f3e7c70896ffeeef32b9c950ywan             ::std::ostream* os) {
9743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9744233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9745233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9746233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
9747233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T6, typename T7, typename T8, typename T9, typename T10>
9748233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(
9749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
9750233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::std::ostream* os) {
9751233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PrintTupleTo(t, os);
9752233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9753233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TR1_TUPLE
9754233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9755233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Overload for std::pair.
9756233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
9757233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
9758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << '(';
9759233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
9760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // a reference type.  The same for printing value.second.
9761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UniversalPrinter<T1>::Print(value.first, os);
9762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << ", ";
9763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UniversalPrinter<T2>::Print(value.second, os);
9764233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << ')';
9765233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9766233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9767233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements printing a non-reference type T by letting the compiler
9768233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pick the right overload of PrintTo() for T.
9769233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9770233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalPrinter {
9771233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // MSVC warns about adding const to a function type, so we want to
9773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // disable the warning.
9774233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
9775233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(push)          // Saves the current warning state.
9776233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(disable:4180)  // Temporarily disables warning 4180.
9777233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // _MSC_VER
9778233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9779233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Note: we deliberately don't call this PrintTo(), as that name
9780233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // conflicts with ::testing::internal::PrintTo in the body of the
9781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // function.
9782233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const T& value, ::std::ostream* os) {
9783233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // By default, ::testing::internal::PrintTo() is used for printing
9784233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // the value.
9785233d2500723e5594f3e7c70896ffeeef32b9c950ywan    //
9786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Thanks to Koenig look-up, if T is a class and has its own
9787233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // PrintTo() function defined in its namespace, that function will
9788233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // be visible here.  Since it is more specific than the generic ones
9789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // in ::testing::internal, it will be picked by the compiler in the
9790233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // following statement - exactly what we want.
9791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PrintTo(value, os);
9792233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9793233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9794233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
9795233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(pop)           // Restores the warning state.
9796233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // _MSC_VER
9797233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9798233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9799233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UniversalPrintArray(begin, len, os) prints an array of 'len'
9800233d2500723e5594f3e7c70896ffeeef32b9c950ywan// elements, starting at address 'begin'.
9801233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9802233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
9803233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (len == 0) {
9804233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << "{}";
9805233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
9806233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << "{ ";
9807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const size_t kThreshold = 18;
9808233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const size_t kChunkSize = 8;
9809233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // If the array has more than kThreshold elements, we'll have to
9810233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // omit some details by printing only the first and the last
9811233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // kChunkSize elements.
9812233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // TODO(wan@google.com): let the user control the threshold using a flag.
9813233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (len <= kThreshold) {
9814233d2500723e5594f3e7c70896ffeeef32b9c950ywan      PrintRawArrayTo(begin, len, os);
9815233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
9816233d2500723e5594f3e7c70896ffeeef32b9c950ywan      PrintRawArrayTo(begin, kChunkSize, os);
9817233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *os << ", ..., ";
9818233d2500723e5594f3e7c70896ffeeef32b9c950ywan      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
9819233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
9820233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << " }";
9821233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9822233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9823233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This overload prints a (const) char array compactly.
9824233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void UniversalPrintArray(
9825233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* begin, size_t len, ::std::ostream* os);
9826233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9827233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This overload prints a (const) wchar_t array compactly.
9828233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void UniversalPrintArray(
9829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const wchar_t* begin, size_t len, ::std::ostream* os);
9830233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9831233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements printing an array type T[N].
9832233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, size_t N>
9833233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalPrinter<T[N]> {
9834233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9835233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Prints the given array, omitting some elements when there are too
9836233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // many.
9837233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const T (&a)[N], ::std::ostream* os) {
9838233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrintArray(a, N, os);
9839233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9840233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9841233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9842233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements printing a reference type T&.
9843233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9844233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalPrinter<T&> {
9845233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9846233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // MSVC warns about adding const to a function type, so we want to
9847233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // disable the warning.
9848233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
9849233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(push)          // Saves the current warning state.
9850233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(disable:4180)  // Temporarily disables warning 4180.
9851233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // _MSC_VER
9852233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const T& value, ::std::ostream* os) {
9854233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Prints the address of the value.  We use reinterpret_cast here
9855233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // as static_cast doesn't compile when T is a function type.
9856233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
9857233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9858233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Then prints the value itself.
9859233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrint(value, os);
9860233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9861233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9862233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
9863233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(pop)           // Restores the warning state.
9864233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // _MSC_VER
9865233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9866233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9867233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints a value tersely: for a reference type, the referenced value
9868233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (but not the address) is printed; for a (const) char pointer, the
9869233d2500723e5594f3e7c70896ffeeef32b9c950ywan// NUL-terminated string (but not the pointer) is printed.
9870233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9871233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9872233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter {
9873233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9874233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const T& value, ::std::ostream* os) {
9875233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrint(value, os);
9876233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9877233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9878233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9879233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter<T&> {
9880233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9881233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const T& value, ::std::ostream* os) {
9882233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrint(value, os);
9883233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9884233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9885233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, size_t N>
9886233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter<T[N]> {
9887233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9888233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const T (&value)[N], ::std::ostream* os) {
9889233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrinter<T[N]>::Print(value, os);
9890233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9891233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9892233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
9893233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter<const char*> {
9894233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9895233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const char* str, ::std::ostream* os) {
9896233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (str == NULL) {
9897233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *os << "NULL";
9898233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
9899233d2500723e5594f3e7c70896ffeeef32b9c950ywan      UniversalPrint(string(str), os);
9900233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
9901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9902233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9903233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
9904233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter<char*> {
9905233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(char* str, ::std::ostream* os) {
9907233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalTersePrinter<const char*>::Print(str, os);
9908233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9909233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9910233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9911233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_STD_WSTRING
9912233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
9913233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter<const wchar_t*> {
9914233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9915233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(const wchar_t* str, ::std::ostream* os) {
9916233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (str == NULL) {
9917233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *os << "NULL";
9918233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
9919233d2500723e5594f3e7c70896ffeeef32b9c950ywan      UniversalPrint(::std::wstring(str), os);
9920233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
9921233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9922233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9923233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
9924233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9925233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
9926233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UniversalTersePrinter<wchar_t*> {
9927233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
9928233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void Print(wchar_t* str, ::std::ostream* os) {
9929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalTersePrinter<const wchar_t*>::Print(str, os);
9930233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9931233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9932233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9933233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9934233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid UniversalTersePrint(const T& value, ::std::ostream* os) {
9935233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UniversalTersePrinter<T>::Print(value, os);
9936233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9937233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9938233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints a value using the type inferred by the compiler.  The
9939233d2500723e5594f3e7c70896ffeeef32b9c950ywan// difference between this and UniversalTersePrint() is that for a
9940233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (const) char pointer, this prints both the pointer and the
9941233d2500723e5594f3e7c70896ffeeef32b9c950ywan// NUL-terminated string.
9942233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
9943233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid UniversalPrint(const T& value, ::std::ostream* os) {
9944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
9945233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // UniversalPrinter with T directly.
9946233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T T1;
9947233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UniversalPrinter<T1>::Print(value, os);
9948233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
9949233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9950233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TR1_TUPLE
9951233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef ::std::vector<string> Strings;
9952233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9953233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This helper template allows PrintTo() for tuples and
9954233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UniversalTersePrintTupleFieldsToStrings() to be defined by
9955233d2500723e5594f3e7c70896ffeeef32b9c950ywan// induction on the number of tuple fields.  The idea is that
9956233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
9957233d2500723e5594f3e7c70896ffeeef32b9c950ywan// fields in tuple t, and can be defined in terms of
9958233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TuplePrefixPrinter<N - 1>.
9959233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9960233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The inductive case.
9961233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <size_t N>
9962233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TuplePrefixPrinter {
9963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Prints the first N fields of a tuple.
9964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename Tuple>
9965233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
9966233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
9967233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *os << ", ";
9968233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
9969233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ::Print(::std::tr1::get<N - 1>(t), os);
9970233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9971233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9972233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Tersely prints the first N fields of a tuple to a string vector,
9973233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // one element for each field.
9974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename Tuple>
9975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
9976233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
9977233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::std::stringstream ss;
9978233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
9979233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strings->push_back(ss.str());
9980233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
9981233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9982233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9983233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Base cases.
9984233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
9985233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TuplePrefixPrinter<0> {
9986233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename Tuple>
9987233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
9988233d2500723e5594f3e7c70896ffeeef32b9c950ywan
9989233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename Tuple>
9990233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
9991233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
9992233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We have to specialize the entire TuplePrefixPrinter<> class
9993233d2500723e5594f3e7c70896ffeeef32b9c950ywan// template here, even though the definition of
9994233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TersePrintPrefixToStrings() is the same as the generic version, as
9995233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
9996233d2500723e5594f3e7c70896ffeeef32b9c950ywan// support specializing a method template of a class template.
9997233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
9998233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct TuplePrefixPrinter<1> {
9999233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename Tuple>
10000233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
10001233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
10002233d2500723e5594f3e7c70896ffeeef32b9c950ywan        Print(::std::tr1::get<0>(t), os);
10003233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10004233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10005233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename Tuple>
10006233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
10007233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ::std::stringstream ss;
10008233d2500723e5594f3e7c70896ffeeef32b9c950ywan    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
10009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strings->push_back(ss.str());
10010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10011233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10012233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10013233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for printing a tuple.  T must be instantiated with
10014233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a tuple type.
10015233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
10016233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid PrintTupleTo(const T& t, ::std::ostream* os) {
10017233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << "(";
10018233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
10019233d2500723e5594f3e7c70896ffeeef32b9c950ywan      PrintPrefixTo(t, os);
10020233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *os << ")";
10021233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
10022233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10023233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints the fields of a tuple tersely to a string vector, one
10024233d2500723e5594f3e7c70896ffeeef32b9c950ywan// element for each field.  See the comment before
10025233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UniversalTersePrint() for how we define "tersely".
10026233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Tuple>
10027233d2500723e5594f3e7c70896ffeeef32b9c950ywanStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
10028233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Strings result;
10029233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
10030233d2500723e5594f3e7c70896ffeeef32b9c950ywan      TersePrintPrefixToStrings(value, &result);
10031233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return result;
10032233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
10033233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TR1_TUPLE
10034233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10035233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
10036233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10037233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
10038233d2500723e5594f3e7c70896ffeeef32b9c950ywan::std::string PrintToString(const T& value) {
10039233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::std::stringstream ss;
10040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::UniversalTersePrinter<T>::Print(value, &ss);
10041233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ss.str();
10042233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
10043233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10044233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
10045233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10046233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
10047233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10048233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PARAM_TEST
10049233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10050233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
10051233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
10052233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10053233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10054233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10055233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Outputs a message explaining invalid registration of different
10056233d2500723e5594f3e7c70896ffeeef32b9c950ywan// fixture class for the same test case. This may happen when
10057233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_P macro is used to define two tests with the same name
10058233d2500723e5594f3e7c70896ffeeef32b9c950ywan// but in different namespaces.
10059233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
10060233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* file, int line);
10061233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10062233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename> class ParamGeneratorInterface;
10063233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename> class ParamGenerator;
10064233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10065233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Interface for iterating over elements provided by an implementation
10066233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of ParamGeneratorInterface<T>.
10067233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
10068233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParamIteratorInterface {
10069233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10070233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~ParamIteratorInterface() {}
10071233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A pointer to the base generator instance.
10072233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Used only for the purposes of iterator comparison
10073233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // to make sure that two iterators belong to the same generator.
10074233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
10075233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Advances iterator to point to the next element
10076233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // provided by the generator. The caller is responsible
10077233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // for not calling Advance() on an iterator equal to
10078233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // BaseGenerator()->End().
10079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void Advance() = 0;
10080233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clones the iterator object. Used for implementing copy semantics
10081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // of ParamIterator<T>.
10082233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface* Clone() const = 0;
10083233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Dereferences the current iterator and provides (read-only) access
10084233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // to the pointed value. It is the caller's responsibility not to call
10085233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Current() on an iterator equal to BaseGenerator()->End().
10086233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Used for implementing ParamGenerator<T>::operator*().
10087233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual const T* Current() const = 0;
10088233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Determines whether the given iterator and other point to the same
10089233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // element in the sequence generated by the generator.
10090233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Used for implementing ParamGenerator<T>::operator==().
10091233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
10092233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10093233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10094233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Class iterating over elements provided by an implementation of
10095233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
10096233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and implements the const forward iterator concept.
10097233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
10098233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParamIterator {
10099233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10100233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T value_type;
10101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef const T& reference;
10102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ptrdiff_t difference_type;
10103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ParamIterator assumes ownership of the impl_ pointer.
10105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
10106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParamIterator& operator=(const ParamIterator& other) {
10107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (this != &other)
10108233d2500723e5594f3e7c70896ffeeef32b9c950ywan      impl_.reset(other.impl_->Clone());
10109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
10110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10111233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T& operator*() const { return *impl_->Current(); }
10113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T* operator->() const { return impl_->Current(); }
10114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Prefix version of operator++.
10115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParamIterator& operator++() {
10116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    impl_->Advance();
10117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
10118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Postfix version of operator++.
10120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParamIterator operator++(int /*unused*/) {
10121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamIteratorInterface<T>* clone = impl_->Clone();
10122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    impl_->Advance();
10123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamIterator(clone);
10124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator==(const ParamIterator& other) const {
10126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
10127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool operator!=(const ParamIterator& other) const {
10129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return !(*this == other);
10130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10132233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class ParamGenerator<T>;
10134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
10135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  scoped_ptr<ParamIteratorInterface<T> > impl_;
10136233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10138233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ParamGeneratorInterface<T> is the binary interface to access generators
10139233d2500723e5594f3e7c70896ffeeef32b9c950ywan// defined in other translation units.
10140233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
10141233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParamGeneratorInterface {
10142233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T ParamType;
10144233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~ParamGeneratorInterface() {}
10146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Generator interface definition
10148233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<T>* Begin() const = 0;
10149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<T>* End() const = 0;
10150233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10151233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10152233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Wraps ParamGeneratorInterface<T> and provides general generator syntax
10153233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compatible with the STL Container concept.
10154233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This class implements copy initialization semantics and the contained
10155233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ParamGeneratorInterface<T> instance is shared among all copies
10156233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of the original object. This is possible because that instance is immutable.
10157233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate<typename T>
10158233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParamGenerator {
10159233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ParamIterator<T> iterator;
10161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10162233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
10163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
10164233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParamGenerator& operator=(const ParamGenerator& other) {
10166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    impl_ = other.impl_;
10167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
10168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10169233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  iterator begin() const { return iterator(impl_->Begin()); }
10171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  iterator end() const { return iterator(impl_->End()); }
10172233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10173233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  linked_ptr<const ParamGeneratorInterface<T> > impl_;
10175233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10177233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates values from a range of two comparable values. Can be used to
10178233d2500723e5594f3e7c70896ffeeef32b9c950ywan// generate sequences of user-defined types that implement operator+() and
10179233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operator<().
10180233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This class is used in the Range() function.
10181233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename IncrementT>
10182233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass RangeGenerator : public ParamGeneratorInterface<T> {
10183233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RangeGenerator(T begin, T end, IncrementT step)
10185233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : begin_(begin), end_(end),
10186233d2500723e5594f3e7c70896ffeeef32b9c950ywan        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
10187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~RangeGenerator() {}
10188233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10189233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<T>* Begin() const {
10190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, begin_, 0, step_);
10191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<T>* End() const {
10193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, end_, end_index_, step_);
10194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10195233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10196233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10197233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<T> {
10198233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
10199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
10200233d2500723e5594f3e7c70896ffeeef32b9c950ywan             IncrementT step)
10201233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base), value_(value), index_(index), step_(step) {}
10202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
10203233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
10205233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
10206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
10208233d2500723e5594f3e7c70896ffeeef32b9c950ywan      value_ = value_ + step_;
10209233d2500723e5594f3e7c70896ffeeef32b9c950ywan      index_++;
10210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<T>* Clone() const {
10212233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
10213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const T* Current() const { return &value_; }
10215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
10216233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
10217233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
10218233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
10219233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
10220233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
10221233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const int other_index =
10222233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other)->index_;
10223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return index_ == other_index;
10224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10225233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10226233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
10227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
10228233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : ParamIteratorInterface<T>(),
10229233d2500723e5594f3e7c70896ffeeef32b9c950ywan          base_(other.base_), value_(other.value_), index_(other.index_),
10230233d2500723e5594f3e7c70896ffeeef32b9c950ywan          step_(other.step_) {}
10231233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10232233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
10233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
10234233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<T>* const base_;
10236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T value_;
10237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int index_;
10238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const IncrementT step_;
10239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class RangeGenerator::Iterator
10240233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static int CalculateEndIndex(const T& begin,
10242233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               const T& end,
10243233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               const IncrementT& step) {
10244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int end_index = 0;
10245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (T i = begin; i < end; i = i + step)
10246233d2500723e5594f3e7c70896ffeeef32b9c950ywan      end_index++;
10247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return end_index;
10248233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10249233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const RangeGenerator& other);
10252233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T begin_;
10254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T end_;
10255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const IncrementT step_;
10256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The index for the end() iterator. All the elements in the generated
10257233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // sequence are indexed (0-based) to aid iterator comparison.
10258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int end_index_;
10259233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class RangeGenerator
10260233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10261233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10262233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates values from a pair of STL-style iterators. Used in the
10263233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ValuesIn() function. The elements are copied from the source range
10264233d2500723e5594f3e7c70896ffeeef32b9c950ywan// since the source can be located on the stack, and the generator
10265233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is likely to persist beyond that stack frame.
10266233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
10267233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
10268233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename ForwardIterator>
10270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
10271233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : container_(begin, end) {}
10272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~ValuesInIteratorRangeGenerator() {}
10273233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<T>* Begin() const {
10275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, container_.begin());
10276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10277233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<T>* End() const {
10278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, container_.end());
10279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10280233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10281233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename ::std::vector<T> ContainerType;
10283233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<T> {
10285233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
10286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<T>* base,
10287233d2500723e5594f3e7c70896ffeeef32b9c950ywan             typename ContainerType::const_iterator iterator)
10288233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base), iterator_(iterator) {}
10289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
10290233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
10292233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
10293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
10295233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++iterator_;
10296233d2500723e5594f3e7c70896ffeeef32b9c950ywan      value_.reset();
10297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10298233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<T>* Clone() const {
10299233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
10300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10301233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // We need to use cached value referenced by iterator_ because *iterator_
10302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // can return a temporary object (and of type other then T), so just
10303233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // having "return &*iterator_;" doesn't work.
10304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // value_ is updated here and not in Advance() because Advance()
10305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // can advance iterator_ beyond the end of the range, and we cannot
10306233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // detect that fact. The client code, on the other hand, is
10307233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // responsible for not calling Current() on an out-of-range iterator.
10308233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const T* Current() const {
10309233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (value_.get() == NULL)
10310233d2500723e5594f3e7c70896ffeeef32b9c950ywan        value_.reset(new T(*iterator_));
10311233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return value_.get();
10312233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
10314233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
10315233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
10316233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
10317233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
10318233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
10319233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return iterator_ ==
10320233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
10321233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10322233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10323233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
10324233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
10325233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // The explicit constructor call suppresses a false warning
10326233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // emitted by gcc when supplied with the -Wextra option.
10327233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : ParamIteratorInterface<T>(),
10328233d2500723e5594f3e7c70896ffeeef32b9c950ywan          base_(other.base_),
10329233d2500723e5594f3e7c70896ffeeef32b9c950ywan          iterator_(other.iterator_) {}
10330233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<T>* const base_;
10332233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ContainerType::const_iterator iterator_;
10333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // A cached value of *iterator_. We keep it here to allow access by
10334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // pointer in the wrapping iterator's operator->().
10335233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // value_ needs to be mutable to be accessed in Current().
10336233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Use of scoped_ptr helps manage cached value's lifetime,
10337233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // which is bound by the lifespan of the iterator itself.
10338233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mutable scoped_ptr<const T> value_;
10339233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class ValuesInIteratorRangeGenerator::Iterator
10340233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10341233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10342233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValuesInIteratorRangeGenerator& other);
10343233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10344233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ContainerType container_;
10345233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class ValuesInIteratorRangeGenerator
10346233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10347233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10348233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10349233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Stores a parameter value and later creates tests parameterized with that
10350233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value.
10351233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class TestClass>
10352233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParameterizedTestFactory : public TestFactoryBase {
10353233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10354233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename TestClass::ParamType ParamType;
10355233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ParameterizedTestFactory(ParamType parameter) :
10356233d2500723e5594f3e7c70896ffeeef32b9c950ywan      parameter_(parameter) {}
10357233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual Test* CreateTest() {
10358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TestClass::SetParam(&parameter_);
10359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new TestClass();
10360233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10361233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10362233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10363233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamType parameter_;
10364233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10365233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
10366233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10367233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10368233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10369233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10370233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestMetaFactoryBase is a base class for meta-factories that create
10371233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test factories for passing into MakeAndRegisterTestInfo function.
10372233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class ParamType>
10373233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestMetaFactoryBase {
10374233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10375233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~TestMetaFactoryBase() {}
10376233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10377233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
10378233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10379233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10380233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10381233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10382233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestMetaFactory creates test factories for passing into
10383233d2500723e5594f3e7c70896ffeeef32b9c950ywan// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
10384233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ownership of test factory pointer, same factory object cannot be passed
10385233d2500723e5594f3e7c70896ffeeef32b9c950ywan// into that method twice. But ParameterizedTestCaseInfo is going to call
10386233d2500723e5594f3e7c70896ffeeef32b9c950ywan// it for each Test/Parameter value combination. Thus it needs meta factory
10387233d2500723e5594f3e7c70896ffeeef32b9c950ywan// creator class.
10388233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class TestCase>
10389233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestMetaFactory
10390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public TestMetaFactoryBase<typename TestCase::ParamType> {
10391233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10392233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename TestCase::ParamType ParamType;
10393233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10394233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestMetaFactory() {}
10395233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10396233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
10397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new ParameterizedTestFactory<TestCase>(parameter);
10398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10399233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10400233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10401233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
10402233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10403233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10404233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10405233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10406233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ParameterizedTestCaseInfoBase is a generic interface
10407233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
10408233d2500723e5594f3e7c70896ffeeef32b9c950ywan// accumulates test information provided by TEST_P macro invocations
10409233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
10410233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and uses that information to register all resulting test instances
10411233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
10412233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a collection of pointers to the ParameterizedTestCaseInfo objects
10413233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and calls RegisterTests() on each of them when asked.
10414233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParameterizedTestCaseInfoBase {
10415233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~ParameterizedTestCaseInfoBase() {}
10417233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Base part of test case name for display purposes.
10419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual const string& GetTestCaseName() const = 0;
10420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Test case id to verify identity.
10421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual TypeId GetTestCaseTypeId() const = 0;
10422233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // UnitTest class invokes this method to register tests in this
10423233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test case right before running them in RUN_ALL_TESTS macro.
10424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This method should not be called more then once on any single
10425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // instance of a ParameterizedTestCaseInfoBase derived class.
10426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void RegisterTests() = 0;
10427233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10428233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
10429233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParameterizedTestCaseInfoBase() {}
10430233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10431233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
10433233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10434233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10435233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10436233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10437233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
10438233d2500723e5594f3e7c70896ffeeef32b9c950ywan// macro invocations for a particular test case and generators
10439233d2500723e5594f3e7c70896ffeeef32b9c950ywan// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
10440233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test case. It registers tests with all values generated by all
10441233d2500723e5594f3e7c70896ffeeef32b9c950ywan// generators when asked.
10442233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class TestCase>
10443233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
10444233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ParamType and GeneratorCreationFunc are private types but are required
10446233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // for declarations of public methods AddTestPattern() and
10447233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // AddTestCaseInstantiation().
10448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename TestCase::ParamType ParamType;
10449233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A function that returns an instance of appropriate generator type.
10450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
10451233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ParameterizedTestCaseInfo(const char* name)
10453233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : test_case_name_(name) {}
10454233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Test case base name for display purposes.
10456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual const string& GetTestCaseName() const { return test_case_name_; }
10457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Test case id to verify identity.
10458233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
10459233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TEST_P macro uses AddTestPattern() to record information
10460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // about a single test in a LocalTestInfo structure.
10461233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test_case_name is the base name of the test case (without invocation
10462233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // prefix). test_base_name is the name of an individual test without
10463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
10464233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test case base name and DoBar is test base name.
10465233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AddTestPattern(const char* test_case_name,
10466233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      const char* test_base_name,
10467233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      TestMetaFactoryBase<ParamType>* meta_factory) {
10468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
10469233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                       test_base_name,
10470233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                       meta_factory)));
10471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
10473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // about a generator.
10474233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int AddTestCaseInstantiation(const string& instantiation_name,
10475233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               GeneratorCreationFunc* func,
10476233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               const char* /* file */,
10477233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               int /* line */) {
10478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    instantiations_.push_back(::std::make_pair(instantiation_name, func));
10479233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return 0;  // Return value used only to run this method in namespace scope.
10480233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // UnitTest class invokes this method to register tests in this test case
10482233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test cases right before running tests in RUN_ALL_TESTS macro.
10483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This method should not be called more then once on any single
10484233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // instance of a ParameterizedTestCaseInfoBase derived class.
10485233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // UnitTest has a guard to prevent from calling this method more then once.
10486233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void RegisterTests() {
10487233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (typename TestInfoContainer::iterator test_it = tests_.begin();
10488233d2500723e5594f3e7c70896ffeeef32b9c950ywan         test_it != tests_.end(); ++test_it) {
10489233d2500723e5594f3e7c70896ffeeef32b9c950ywan      linked_ptr<TestInfo> test_info = *test_it;
10490233d2500723e5594f3e7c70896ffeeef32b9c950ywan      for (typename InstantiationContainer::iterator gen_it =
10491233d2500723e5594f3e7c70896ffeeef32b9c950ywan               instantiations_.begin(); gen_it != instantiations_.end();
10492233d2500723e5594f3e7c70896ffeeef32b9c950ywan               ++gen_it) {
10493233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const string& instantiation_name = gen_it->first;
10494233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ParamGenerator<ParamType> generator((*gen_it->second)());
10495233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10496233d2500723e5594f3e7c70896ffeeef32b9c950ywan        string test_case_name;
10497233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if ( !instantiation_name.empty() )
10498233d2500723e5594f3e7c70896ffeeef32b9c950ywan          test_case_name = instantiation_name + "/";
10499233d2500723e5594f3e7c70896ffeeef32b9c950ywan        test_case_name += test_info->test_case_base_name;
10500233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10501233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int i = 0;
10502233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (typename ParamGenerator<ParamType>::iterator param_it =
10503233d2500723e5594f3e7c70896ffeeef32b9c950ywan                 generator.begin();
10504233d2500723e5594f3e7c70896ffeeef32b9c950ywan             param_it != generator.end(); ++param_it, ++i) {
10505233d2500723e5594f3e7c70896ffeeef32b9c950ywan          Message test_name_stream;
10506233d2500723e5594f3e7c70896ffeeef32b9c950ywan          test_name_stream << test_info->test_base_name << "/" << i;
10507233d2500723e5594f3e7c70896ffeeef32b9c950ywan          MakeAndRegisterTestInfo(
10508233d2500723e5594f3e7c70896ffeeef32b9c950ywan              test_case_name.c_str(),
10509233d2500723e5594f3e7c70896ffeeef32b9c950ywan              test_name_stream.GetString().c_str(),
10510233d2500723e5594f3e7c70896ffeeef32b9c950ywan              NULL,  // No type parameter.
10511233d2500723e5594f3e7c70896ffeeef32b9c950ywan              PrintToString(*param_it).c_str(),
10512233d2500723e5594f3e7c70896ffeeef32b9c950ywan              GetTestCaseTypeId(),
10513233d2500723e5594f3e7c70896ffeeef32b9c950ywan              TestCase::SetUpTestCase,
10514233d2500723e5594f3e7c70896ffeeef32b9c950ywan              TestCase::TearDownTestCase,
10515233d2500723e5594f3e7c70896ffeeef32b9c950ywan              test_info->test_meta_factory->CreateTestFactory(*param_it));
10516233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }  // for param_it
10517233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }  // for gen_it
10518233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }  // for test_it
10519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }  // RegisterTests
10520233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10521233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10522233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // LocalTestInfo structure keeps information about a single test registered
10523233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // with TEST_P macro.
10524233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct TestInfo {
10525233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TestInfo(const char* a_test_case_base_name,
10526233d2500723e5594f3e7c70896ffeeef32b9c950ywan             const char* a_test_base_name,
10527233d2500723e5594f3e7c70896ffeeef32b9c950ywan             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
10528233d2500723e5594f3e7c70896ffeeef32b9c950ywan        test_case_base_name(a_test_case_base_name),
10529233d2500723e5594f3e7c70896ffeeef32b9c950ywan        test_base_name(a_test_base_name),
10530233d2500723e5594f3e7c70896ffeeef32b9c950ywan        test_meta_factory(a_test_meta_factory) {}
10531233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const string test_case_base_name;
10533233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const string test_base_name;
10534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
10535233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
10536233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
10537233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Keeps pairs of <Instantiation name, Sequence generator creation function>
10538233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // received from INSTANTIATE_TEST_CASE_P macros.
10539233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
10540233d2500723e5594f3e7c70896ffeeef32b9c950ywan      InstantiationContainer;
10541233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10542233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const string test_case_name_;
10543233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestInfoContainer tests_;
10544233d2500723e5594f3e7c70896ffeeef32b9c950ywan  InstantiationContainer instantiations_;
10545233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10546233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
10547233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class ParameterizedTestCaseInfo
10548233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10549233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
10550233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10551233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
10552233d2500723e5594f3e7c70896ffeeef32b9c950ywan// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
10553233d2500723e5594f3e7c70896ffeeef32b9c950ywan// macros use it to locate their corresponding ParameterizedTestCaseInfo
10554233d2500723e5594f3e7c70896ffeeef32b9c950ywan// descriptors.
10555233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ParameterizedTestCaseRegistry {
10556233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10557233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParameterizedTestCaseRegistry() {}
10558233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~ParameterizedTestCaseRegistry() {
10559233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10560233d2500723e5594f3e7c70896ffeeef32b9c950ywan         it != test_case_infos_.end(); ++it) {
10561233d2500723e5594f3e7c70896ffeeef32b9c950ywan      delete *it;
10562233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10563233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10564233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10565233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Looks up or creates and returns a structure containing information about
10566233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // tests and instantiations of a particular test case.
10567233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class TestCase>
10568233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
10569233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* test_case_name,
10570233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* file,
10571233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int line) {
10572233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
10573233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10574233d2500723e5594f3e7c70896ffeeef32b9c950ywan         it != test_case_infos_.end(); ++it) {
10575233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((*it)->GetTestCaseName() == test_case_name) {
10576233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
10577233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // Complain about incorrect usage of Google Test facilities
10578233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // and terminate the program since we cannot guaranty correct
10579233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // test case setup and tear-down in this case.
10580233d2500723e5594f3e7c70896ffeeef32b9c950ywan          ReportInvalidTestCaseType(test_case_name,  file, line);
10581233d2500723e5594f3e7c70896ffeeef32b9c950ywan          posix::Abort();
10582233d2500723e5594f3e7c70896ffeeef32b9c950ywan        } else {
10583233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // At this point we are sure that the object we found is of the same
10584233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // type we are looking for, so we downcast it to that type
10585233d2500723e5594f3e7c70896ffeeef32b9c950ywan          // without further checks.
10586233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typed_test_info = CheckedDowncastToActualType<
10587233d2500723e5594f3e7c70896ffeeef32b9c950ywan              ParameterizedTestCaseInfo<TestCase> >(*it);
10588233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
10589233d2500723e5594f3e7c70896ffeeef32b9c950ywan        break;
10590233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
10591233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10592233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (typed_test_info == NULL) {
10593233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
10594233d2500723e5594f3e7c70896ffeeef32b9c950ywan      test_case_infos_.push_back(typed_test_info);
10595233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10596233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return typed_test_info;
10597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RegisterTests() {
10599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
10600233d2500723e5594f3e7c70896ffeeef32b9c950ywan         it != test_case_infos_.end(); ++it) {
10601233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (*it)->RegisterTests();
10602233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
10603233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10604233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10605233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10606233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
10607233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10608233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestCaseInfoContainer test_case_infos_;
10609233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10610233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
10611233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10612233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10613233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
10614233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
10615233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10616233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  //  GTEST_HAS_PARAM_TEST
10617233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10618233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
10619233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file was GENERATED by command:
10620233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     pump.py gtest-param-util-generated.h.pump
10621233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DO NOT EDIT BY HAND!!!
10622233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10623233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008 Google Inc.
10624233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All Rights Reserved.
10625233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10626233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
10627233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
10628233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
10629233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10630233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
10631233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
10632233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
10633233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
10634233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
10635233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
10636233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
10637233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
10638233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
10639233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10640233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10641233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
10642233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10643233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
10644233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10645233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10646233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10647233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
10648233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
10649233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
10650233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10651233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10652233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: vladl@google.com (Vlad Losev)
10653233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10654233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Type and function utilities for implementing parameterized tests.
10655233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
10656233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
10657233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Currently Google Test supports at most 50 arguments in Values,
10658233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and at most 10 arguments in Combine. Please contact
10659233d2500723e5594f3e7c70896ffeeef32b9c950ywan// googletestframework@googlegroups.com if you need more.
10660233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Please note that the number of arguments to Combine is limited
10661233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by the maximum arity of the implementation of tr1::tuple which is
10662233d2500723e5594f3e7c70896ffeeef32b9c950ywan// currently set at 10.
10663233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10664233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
10665233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
10666233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10667233d2500723e5594f3e7c70896ffeeef32b9c950ywan// scripts/fuse_gtest.py depends on gtest's own header being #included
10668233d2500723e5594f3e7c70896ffeeef32b9c950ywan// *unconditionally*.  Therefore these #includes cannot be moved
10669233d2500723e5594f3e7c70896ffeeef32b9c950ywan// inside #if GTEST_HAS_PARAM_TEST.
10670233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10671233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PARAM_TEST
10672233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10673233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
10674233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10675233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Forward declarations of ValuesIn(), which is implemented in
10676233d2500723e5594f3e7c70896ffeeef32b9c950ywan// include/gtest/gtest-param-test.h.
10677233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename ForwardIterator>
10678233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<
10679233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
10680233d2500723e5594f3e7c70896ffeeef32b9c950ywanValuesIn(ForwardIterator begin, ForwardIterator end);
10681233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10682233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, size_t N>
10683233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
10684233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10685233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Container>
10686233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<typename Container::value_type> ValuesIn(
10687233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Container& container);
10688233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10689233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
10690233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10691233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Used in the Values() function to provide polymorphic capabilities.
10692233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1>
10693233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray1 {
10694233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit ValueArray1(T1 v1) : v1_(v1) {}
10696233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10697233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10698233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
10699233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10700233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10702233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray1& other);
10703233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10704233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10705233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10706233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10707233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
10708233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray2 {
10709233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10710233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
10711233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10712233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10713233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10714233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
10715233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10716233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10717233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10718233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10720233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray2& other);
10721233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10723233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10724233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10725233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10726233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3>
10727233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray3 {
10728233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10729233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
10730233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10731233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10732233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10733233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10734233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_)};
10735233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10736233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10737233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10738233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10739233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10740233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray3& other);
10741233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10742233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10744233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10745233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10746233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10747233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4>
10748233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray4 {
10749233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10750233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
10751233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4) {}
10752233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10753233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10754233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10755233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10756233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_)};
10757233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10759233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10760233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray4& other);
10763233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10764233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10766233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10768233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10769233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10770233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
10771233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray5 {
10772233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
10774233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4), v5_(v5) {}
10775233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10777233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10778233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10779233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
10780233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10782233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10783233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10784233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10785233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray5& other);
10786233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10787233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10788233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10789233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10790233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10791233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10792233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10793233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10794233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10795233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6>
10796233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray6 {
10797233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10798233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
10799233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
10800233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10801233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10802233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10803233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10804233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10805233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_)};
10806233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10807233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10808233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10809233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10810233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10811233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray6& other);
10812233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10813233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10814233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10815233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10816233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10817233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10818233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
10819233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10820233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10821233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10822233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7>
10823233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray7 {
10824233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10825233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
10826233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
10827233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10828233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10829233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10830233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10831233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10832233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_)};
10833233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10835233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10836233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10837233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10838233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray7& other);
10839233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10841233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10842233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10843233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10844233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10845233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
10846233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
10847233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10848233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10849233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10850233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8>
10851233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray8 {
10852233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
10854233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10855233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8) {}
10856233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10857233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10858233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10859233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10860233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10861233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
10862233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10863233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10864233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10865233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10866233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10867233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray8& other);
10868233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10869233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10870233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10871233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10872233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10873233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10874233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
10875233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
10876233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
10877233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10878233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10879233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10880233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9>
10881233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray9 {
10882233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10883233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
10884233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10885233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9) {}
10886233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10887233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10888233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10889233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10890233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10891233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10892233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_)};
10893233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10894233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10895233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10896233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10897233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10898233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray9& other);
10899233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10900233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10902233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10905233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
10906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
10907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
10908233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
10909233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10910233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10911233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10912233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10>
10913233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray10 {
10914233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10915233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10916233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
10917233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10) {}
10918233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10919233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10920233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10921233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10922233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10923233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10924233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_)};
10925233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10926233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10927233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10928233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10929233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10930233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray10& other);
10931233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10932233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10933233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10934233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10935233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10936233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
10938233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
10939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
10940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
10941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
10942233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10943233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10944233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10945233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
10946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11>
10947233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray11 {
10948233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10949233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10950233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
10951233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
10952233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10953233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10954233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10956233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10957233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10958233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
10959233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10960233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10961233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10962233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
10964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray11& other);
10965233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10966233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
10967233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
10968233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
10969233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
10970233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
10971233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
10972233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
10973233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
10974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
10975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
10976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
10977233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
10978233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10979233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
10980233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
10981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12>
10982233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray12 {
10983233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
10984233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
10985233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
10986233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
10987233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10988233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
10989233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
10990233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
10991233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
10992233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
10993233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
10994233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_)};
10995233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
10996233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
10997233d2500723e5594f3e7c70896ffeeef32b9c950ywan
10998233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
10999233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11000233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray12& other);
11001233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11002233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11003233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11004233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11005233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11006233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11007233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11008233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11009233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11011233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11012233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11013233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11014233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11015233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11016233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11017233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11018233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13>
11019233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray13 {
11020233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11021233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11022233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11023233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11024233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12_(v12), v13_(v13) {}
11025233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11026233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11027233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11028233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11029233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11030233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11031233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11032233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_)};
11033233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11034233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11035233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11036233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11038233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray13& other);
11039233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11041233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11042233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11043233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11044233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11045233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11046233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11047233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11048233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11049233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11050233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11051233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11053233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11054233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11055233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11056233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11057233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14>
11058233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray14 {
11059233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11060233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11061233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
11062233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11063233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
11064233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11065233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11066233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11067233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11068233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11069233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11070233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11071233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
11072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11073233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11074233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11075233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11076233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11077233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray14& other);
11078233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11080233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11082233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11083233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11084233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11085233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11086233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11087233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11088233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11089233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11090233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11091233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11092233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11093233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11094233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11095233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11096233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11097233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15>
11098233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray15 {
11099233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11100233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11101233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
11102233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11103233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
11104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11108233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11112233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_)};
11113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11115233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11116233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray15& other);
11119233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11132233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11135233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11136233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11137233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16>
11141233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray16 {
11142233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11144233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
11145233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
11146233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
11147233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16_(v16) {}
11148233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11150233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11152233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11153233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11154233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11155233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11156233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_)};
11157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11159233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11160233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11162233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray16& other);
11163233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11164233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11166233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11169233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11176233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11180233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11181233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11182233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17>
11186233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray17 {
11187233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11189233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
11190233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11191233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11192233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17) {}
11193233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11197233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11198233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11199233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11200233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11201233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
11202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11204233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11205233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11206233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray17& other);
11208233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11214233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11222233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11223233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11224233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11226233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11227233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11228233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11231233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18>
11232233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray18 {
11233233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11235233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11236233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11237233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11238233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
11239233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11242233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11243233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11244233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11245233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11246233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11247233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11248233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_)};
11249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11251233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11252233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray18& other);
11255233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11257233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11260233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11262233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11263233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11265233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11267233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11274233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11275233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11276233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19>
11280233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray19 {
11281233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11283233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11284233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11285233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11286233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
11287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11288233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11289233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11291233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11292233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11293233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11294233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11295233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11296233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_)};
11297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11299233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11300233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11301233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11302233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray19& other);
11303233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11304233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11306233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11310233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11311233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11317233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11320233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11322233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11323233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11324233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11325233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20>
11329233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray20 {
11330233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11332233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11333233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11334233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11335233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11336233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v19_(v19), v20_(v20) {}
11337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11338233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11339233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11340233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11341233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11342233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11343233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11344233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11345233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11346233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
11347233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11348233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11349233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11350233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11351233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11352233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray20& other);
11353233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11354233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11355233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11356233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11357233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11359233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11360233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11363233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11365233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11366233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11368233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11369233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11370233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11371233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11372233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11373233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11374233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11375233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11376233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11378233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11379233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11380233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21>
11381233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray21 {
11382233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11383233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11384233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11385233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11386233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11387233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11388233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
11389233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11390233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11391233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11393233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11394233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11395233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11396233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11397233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11398233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11399233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_)};
11400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11401233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11402233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11403233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray21& other);
11406233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11408233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11409233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11422233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11423233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11428233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11429233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11430233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11431233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11433233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11434233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22>
11435233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray22 {
11436233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11437233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11438233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11439233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
11440233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11441233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11442233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
11443233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11447233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11448233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11449233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11450233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11451233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11452233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11453233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_)};
11454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11456233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11457233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11458233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11459233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray22& other);
11460233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11461233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11462233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11464233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11465233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11466233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11467233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11468233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11469233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11470233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11474233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11475233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11476233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11477233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11479233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11480233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11482233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11483233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11484233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11485233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11487233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11488233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11489233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23>
11490233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray23 {
11491233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11493233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11494233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
11495233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11496233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11497233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
11498233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23) {}
11499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11500233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11501233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11503233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11504233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11505233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11506233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11507233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11508233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11509233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
11510233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11511233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11512233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11513233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray23& other);
11516233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11517233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11518233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11521233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11522233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11523233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11524233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11525233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11526233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11527233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11529233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11530233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11531233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11532233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11533233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11534233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11535233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11536233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11537233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11538233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11539233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11540233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11541233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11542233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11543233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11544233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11545233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11546233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24>
11547233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray24 {
11548233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11549233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11550233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11551233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
11552233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
11553233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
11554233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
11555233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v22_(v22), v23_(v23), v24_(v24) {}
11556233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11557233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11558233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11559233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11560233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11561233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11562233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11563233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11564233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11565233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11566233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11567233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_)};
11568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11569233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11570233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11571233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11572233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11573233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray24& other);
11574233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11575233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11576233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11577233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11578233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11581233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11583233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11584233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11585233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11588233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11589233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11590233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11591233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11593233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11594233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11595233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11596233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11599233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11600233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11601233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11602233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11603233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11604233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11605233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25>
11606233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray25 {
11607233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11608233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11609233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11610233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
11611233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11612233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11613233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
11614233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
11615233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11616233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11617233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11619233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11620233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11621233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11622233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11623233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11624233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11625233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11626233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_)};
11627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11628233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11629233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11630233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11631233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11632233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray25& other);
11633233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11634233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11635233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11636233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11637233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11638233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11639233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11641233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11642233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11643233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11644233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11645233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11646233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11647233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11648233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11650233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11651233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11653233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11654233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11655233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11658233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
11659233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11660233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11661233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11662233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11664233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
11666233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26>
11667233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray26 {
11668233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11669233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11670233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11671233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11672233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
11673233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
11674233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
11675233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
11676233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11677233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11678233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11679233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11680233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11681233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11682233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11683233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11684233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11685233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11686233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11687233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
11688233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11689233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11690233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11691233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11692233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11693233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray26& other);
11694233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11696233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11697233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11698233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11699233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11700233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11702233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11703233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11704233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11705233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11706233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11707233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11708233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11709233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11710233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11711233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11712233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11713233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11714233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11715233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11716233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11717233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
11720233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
11721233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11722233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11723233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11724233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11725233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11726233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11727233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
11728233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27>
11729233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray27 {
11730233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11731233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11732233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11733233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11734233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
11735233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
11736233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
11737233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
11738233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v26_(v26), v27_(v27) {}
11739233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11740233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11741233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11742233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11743233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11744233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11745233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11746233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11747233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11748233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11749233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11750233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11751233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_)};
11752233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11753233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11754233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11755233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11757233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray27& other);
11758233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11759233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11764233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11766233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11768233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11769233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11770233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11771233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11774233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11775233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11777233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11778233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11779233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11780233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11782233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11783233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
11784233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
11785233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
11786233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11787233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11788233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11790233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11792233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
11793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28>
11794233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray28 {
11795233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11796233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11797233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11798233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11799233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
11800233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
11801233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
11802233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
11803233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
11804233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11805233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11806233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11808233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11809233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11810233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11811233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11812233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11813233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11814233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11815233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11816233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_)};
11817233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11818233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11819233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11820233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11821233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11822233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray28& other);
11823233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11824233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11825233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11826233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11827233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11828233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11829233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11830233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11831233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11832233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11833233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11835233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11836233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11837233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11838233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11839233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11841233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11842233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11843233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11844233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11845233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11846233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11847233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11848233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
11849233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
11850233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
11851233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
11852233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11853233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11854233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11855233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11856233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11857233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11858233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
11859233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29>
11860233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray29 {
11861233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11862233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11863233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11864233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11865233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
11866233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
11867233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
11868233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
11869233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
11870233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11871233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11872233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11873233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11874233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11875233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11876233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11877233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11878233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11879233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11880233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11881233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11882233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
11883233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11884233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11885233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11886233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11887233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11888233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray29& other);
11889233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11890233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11892233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11893233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11894233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11895233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11896233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11897233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11898233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11899233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11900233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11902233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11905233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11908233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11909233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11910233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11911233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11912233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11913233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11914233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
11915233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
11916233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
11917233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
11918233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
11919233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11920233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11921233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11922233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11923233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11924233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11925233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
11926233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30>
11927233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray30 {
11928233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
11929233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
11930233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
11931233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
11932233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
11933233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
11934233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
11935233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
11936233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
11937233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29_(v29), v30_(v30) {}
11938233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
11940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
11941233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
11942233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
11943233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
11944233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
11945233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
11946233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
11947233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
11948233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
11949233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
11950233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
11951233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_)};
11952233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
11953233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
11954233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11955233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
11956233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
11957233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray30& other);
11958233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11959233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
11960233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
11961233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
11962233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
11963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
11964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
11965233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
11966233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
11967233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
11968233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
11969233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
11970233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
11971233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
11972233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
11973233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
11974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
11975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
11976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
11977233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
11978233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
11979233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
11980233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
11981233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
11982233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
11983233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
11984233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
11985233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
11986233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
11987233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
11988233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
11989233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
11990233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11991233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
11992233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
11993233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
11994233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
11995233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
11996233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
11997233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31>
11998233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray31 {
11999233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12000233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12001233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12002233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12003233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
12004233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12005233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12006233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12007233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12008233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29_(v29), v30_(v30), v31_(v31) {}
12009233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12011233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12012233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12013233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12014233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12015233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12016233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12017233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12018233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12019233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12020233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12021233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12022233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_)};
12023233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12024233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12025233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12026233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12027233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12028233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray31& other);
12029233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12030233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12031233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12032233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12033233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12034233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12035233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12038233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12039233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12041233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12042233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12043233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12044233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12045233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12046233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12047233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12048233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12049233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12050233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12051233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12053233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12054233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12055233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12056233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12057233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12059233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12060233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12061233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12062233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12063233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12064233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12066233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12067233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12068233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12069233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32>
12070233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray32 {
12071233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12072233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12073233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12074233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12075233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
12076233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
12077233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
12078233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
12079233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
12080233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
12081233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12082233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12083233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12084233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12085233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12086233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12087233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12088233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12089233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12090233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12091233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12092233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12093233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12094233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
12095233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12096233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12097233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12098233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12099233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12100233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray32& other);
12101233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12109233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12116233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12132233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12134233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12136233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12137233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33>
12143233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray33 {
12144233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12146233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12147233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12148233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
12149233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12150233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12151233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12152233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12153233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12154233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33_(v33) {}
12155233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12157233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12159233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12160233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12161233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12162233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12163233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12164233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12165233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12166233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12167233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12168233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12169233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_)};
12170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12172233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12173233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray33& other);
12176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12182233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12189233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12190233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12196233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12197233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12198233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12199233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12200233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12202233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12204233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12205233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12206233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12208233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12210233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12211233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12212233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12216233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34>
12219233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray34 {
12220233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12222233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12224233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12225233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12226233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12227233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12228233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12229233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12230233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33_(v33), v34_(v34) {}
12231233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12235233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12236233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12237233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12238233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12239233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12240233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12241233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12242233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12243233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12244233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12245233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_)};
12246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12247233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12248233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12249233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray34& other);
12252233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12254233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12257233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12260233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12262233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12263233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12265233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12267233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12269233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12275233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12277233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12281233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12287233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12288233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12289233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12295233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35>
12296233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray35 {
12297233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12299233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12300233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12301233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12302233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
12303233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
12304233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
12305233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
12306233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
12307233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
12308233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12310233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12311233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12312233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12313233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12314233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12315233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12316233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12317233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12318233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12319233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12320233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12321233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12322233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
12323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12325233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12326233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray35& other);
12329233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12330233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12332233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12337233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12338233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12339233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12340233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12341233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12342233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12343233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12344233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12345233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12346233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12347233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12348233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12349233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12350233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12351233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12352233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12353233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12354233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12355233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12356233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12357233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12359233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12360233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12363233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12365233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12366233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12367233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12369233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12371233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36>
12375233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray36 {
12376233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12377233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12378233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12379233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12380233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12381233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
12382233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
12383233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
12384233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
12385233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
12386233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
12387233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12388233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12389233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12391233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12392233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12393233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12394233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12395233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12396233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12397233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12398233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12399233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12400233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12401233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12402233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_)};
12403233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12405233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12406233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12408233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray36& other);
12409233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12422233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12423233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12428233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12429233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12431233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12436233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12437233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12438233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12439233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12441233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12442233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12443233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12446233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12447233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12448233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12449233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12451233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12452233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12453233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37>
12456233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray37 {
12457233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12458233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12459233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12460233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12461233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12462233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
12463233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
12464233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
12465233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
12466233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
12467233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
12468233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v36_(v36), v37_(v37) {}
12469233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12470233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12472233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12473233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12474233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12475233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12476233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12477233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12478233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12479233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12480233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12481233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12482233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12483233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12484233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_)};
12485233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12486233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12487233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12488233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12489233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12490233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray37& other);
12491233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12493233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12494233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12495233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12496233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12497233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12498233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12499233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12500233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12501233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12502233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12504233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12505233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12508233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12509233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12510233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12511233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12512233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12513233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12516233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12517233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12518233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12521233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12522233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12523233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12524233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12525233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12526233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12527233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
12529233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12530233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12531233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12533233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12534233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12535233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12537233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38>
12539233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray38 {
12540233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12541233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12542233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12543233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12544233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12545233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
12546233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12547233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12548233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12549233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12550233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
12551233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
12552233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12553233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12554233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12555233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12556233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12557233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12558233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12559233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12560233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12561233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12562233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12563233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12564233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12565233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12566233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12567233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
12568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12569233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12570233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12571233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12572233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12573233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray38& other);
12574233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12575233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12576233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12577233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12578233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12581233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12583233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12584233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12585233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12588233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12589233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12590233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12591233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12593233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12594233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12595233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12596233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12599233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12600233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12602233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12603233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12604233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12605233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12606233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12607233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12608233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12610233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12611233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
12612233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
12613233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12614233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12615233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12616233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12619233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12620233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12621233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12622233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39>
12623233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray39 {
12624233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12625233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12626233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12627233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12628233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12629233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
12630233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
12631233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
12632233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
12633233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
12634233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
12635233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
12636233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12637233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12638233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12639233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12640233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12641233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12642233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12643233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12644233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12645233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12646233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12647233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12648233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12649233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12650233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12651233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12652233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_)};
12653233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12654233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12655233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12656233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12658233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray39& other);
12659233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12660233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12661233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12662233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12663233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12664233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12665233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12666233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12667233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12668233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12669233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12670233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12671233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12672233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12673233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12674233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12675233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12676233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12677233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12678233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12679233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12680233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12681233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12682233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12683233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12684233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12685233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12686233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12687233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12688233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12689233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12690233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12691233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12692233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12693233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12694233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12696233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
12697233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
12698233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
12699233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12700233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12701233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12702233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12703233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12704233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12705233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12706233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12707233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40>
12709233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray40 {
12710233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12711233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12712233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12713233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12714233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12715233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
12716233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
12717233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
12718233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
12719233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
12720233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
12721233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
12722233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v40_(v40) {}
12723233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12724233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12725233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12726233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12727233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12728233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12729233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12730233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12731233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12732233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12733233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12734233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12735233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12736233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12737233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12738233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12739233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_)};
12740233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12741233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12742233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12743233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12744233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray40& other);
12746233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12747233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12748233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12749233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12750233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12751233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12752233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12753233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12754233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12755233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12757233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12759233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12764233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12766233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12768233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12769233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12770233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12771233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12774233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12775233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12777233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12778233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12779233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12780233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12782233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12783233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
12784233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
12785233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
12786233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
12787233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12788233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12789233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12790233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12792233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12794233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12795233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12796233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
12797233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41>
12798233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray41 {
12799233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12800233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12801233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12802233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12803233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12804233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
12805233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12806233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12807233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12808233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12809233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12810233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
12811233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v39_(v39), v40_(v40), v41_(v41) {}
12812233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12813233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12814233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12815233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12816233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12817233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12818233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12819233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12820233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12821233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12822233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12823233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12824233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12825233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12826233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12827233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12828233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
12829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12830233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12831233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12832233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12833233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray41& other);
12835233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12836233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12837233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12838233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12839233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12841233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12842233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12843233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12844233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12845233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12846233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12847233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12848233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12849233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12850233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12851233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12852233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12854233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12855233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12856233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12857233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12858233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12859233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12860233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12861233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12862233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12863233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12864233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12865233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12866233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12867233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12868233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12869233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12870233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12871233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12872233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
12873233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
12874233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
12875233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
12876233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
12877233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12878233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12879233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12880233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12881233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12882233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12883233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12884233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12885233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12886233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
12887233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42>
12888233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray42 {
12889233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12890233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12891233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12892233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12893233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12894233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
12895233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
12896233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
12897233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
12898233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
12899233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
12900233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
12901233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
12902233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12905233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12906233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12907233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
12908233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
12909233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
12910233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
12911233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
12912233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
12913233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
12914233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
12915233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
12916233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
12917233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
12918233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
12919233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_)};
12920233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
12921233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
12922233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12923233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
12924233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
12925233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray42& other);
12926233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12927233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
12928233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
12929233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
12930233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
12931233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
12932233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
12933233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
12934233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
12935233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
12936233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
12937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
12938233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
12939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
12940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
12941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
12942233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
12943233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
12944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
12945233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
12946233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
12947233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
12948233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
12949233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
12950233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
12951233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
12952233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
12953233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
12954233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
12955233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
12956233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
12957233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
12958233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
12959233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
12960233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
12961233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
12962233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
12963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
12964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
12965233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
12966233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
12967233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
12968233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
12969233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
12970233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12971233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
12972233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
12973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
12974233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
12975233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
12976233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
12977233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
12978233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
12979233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43>
12980233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray43 {
12981233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
12982233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
12983233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
12984233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
12985233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
12986233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
12987233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
12988233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
12989233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
12990233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
12991233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
12992233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
12993233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
12994233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12995233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
12996233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
12997233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
12998233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
12999233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13000233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13001233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13002233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13003233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13004233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13005233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13006233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13007233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13008233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13009233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13010233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13011233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_)};
13012233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13013233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13014233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13015233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13016233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13017233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray43& other);
13018233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13019233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13020233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13021233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13022233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13023233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13024233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13025233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13026233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13027233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13028233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13029233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13030233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13031233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13032233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13033233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13034233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13035233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13038233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13039233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13041233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13042233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13043233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13044233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13045233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13046233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13047233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13048233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13049233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13050233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13051233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13053233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13054233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13055233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13056233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13057233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13059233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13060233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13061233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13062233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13063233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13064233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13066233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13067233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13068233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13069233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13070233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13071233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44>
13073233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray44 {
13074233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13075233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13076233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13077233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13078233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13079233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13080233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
13081233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
13082233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
13083233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
13084233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
13085233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
13086233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
13087233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v43_(v43), v44_(v44) {}
13088233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13089233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13090233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13091233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13092233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13093233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13094233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13095233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13096233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13097233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13098233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13099233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13101233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13102233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13103233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13104233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13105233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
13106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13109233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray44& other);
13112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13116233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13132233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13140233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13142233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13144233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13146233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13148233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13150233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13152233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13153233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13155233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13157233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13158233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13159233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45>
13168233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray45 {
13169233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13171233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13172233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13173233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13174233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13175233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
13176233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
13177233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
13178233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
13179233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
13180233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
13181233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
13182233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
13183233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13186233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13187233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13188233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13189233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13190233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13191233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13192233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13193233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13194233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13195233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13196233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13197233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13198233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13199233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13200233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13201233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v45_)};
13202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13204233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13205233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13206233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray45& other);
13208233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13214233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13217233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13222233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13223233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13224233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13227233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13229233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13243233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13244233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13245233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13246233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13247233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13248233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13252233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T45 v45_;
13254233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13255233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13256233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13261233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13263233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
13265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46>
13266233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray46 {
13267233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13269233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13270233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13271233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13272233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13273233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
13274233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13275233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13276233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13277233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13278233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
13279233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
13280233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
13281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13285233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13286233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13287233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13288233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13289233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13290233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13291233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13292233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13293233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13294233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13295233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13296233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13297233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13298233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13299233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v45_), static_cast<T>(v46_)};
13300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13301233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13302233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13303233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13304233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray46& other);
13306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13310233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13311233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13317233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13320233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13322233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13323233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13330233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13332233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13337233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13338233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13339233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13340233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13341233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13342233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13343233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13344233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13345233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13346233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13347233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13348233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13349233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13350233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13351233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T45 v45_;
13352233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T46 v46_;
13353233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13354233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13355233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13360233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13361233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13362233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13363233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
13364233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47>
13365233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray47 {
13366233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13368233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13369233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13370233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13371233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13372233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
13373233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
13374233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
13375233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
13376233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
13377233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
13378233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
13379233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
13380233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v47_(v47) {}
13381233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13383233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13384233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13385233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13386233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13387233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13388233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13389233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13390233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13391233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13392233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13393233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13394233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13395233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13396233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13397233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13398233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13399233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
13400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13401233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13402233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13403233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray47& other);
13406233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13408233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13409233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13415233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13422233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13423233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13425233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13426233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13428233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13429233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13431233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13436233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13437233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13438233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13439233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13441233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13442233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13443233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13446233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13447233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13449233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13451233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T45 v45_;
13452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T46 v46_;
13453233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T47 v47_;
13454233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13455233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13456233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13459233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13460233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13461233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13462233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13463233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
13465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48>
13466233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray48 {
13467233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13468233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13469233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13470233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13471233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13472233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13473233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
13474233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
13475233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
13476233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
13477233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
13478233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
13479233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
13480233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
13481233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v46_(v46), v47_(v47), v48_(v48) {}
13482233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13484233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13485233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13486233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13487233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13488233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13489233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13490233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13491233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13492233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13493233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13494233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13495233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13496233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13497233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13498233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13499233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13500233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13501233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v48_)};
13502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13504233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13505233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray48& other);
13508233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13509233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13510233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13511233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13512233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13513233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13516233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13517233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13518233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13521233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13522233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13523233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13524233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13525233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13526233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13527233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13528233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13529233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13530233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13531233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13532233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13533233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13534233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13535233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13536233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13537233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13538233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13539233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13540233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13541233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13542233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13543233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13544233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13546233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13547233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13549233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13550233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13551233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13552233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13553233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T45 v45_;
13554233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T46 v46_;
13555233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T47 v47_;
13556233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T48 v48_;
13557233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13558233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13559233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13560233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13561233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13562233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13563233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13564233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13565233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13566233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13567233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
13568233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49>
13569233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray49 {
13570233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13571233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13572233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13573233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13574233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13575233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13576233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
13577233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
13578233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
13579233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
13580233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
13581233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
13582233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
13583233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
13584233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
13585233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13588233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13589233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13590233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13591233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13592233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13593233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13594233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13595233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13596233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13597233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13598233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13599233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13600233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13601233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13602233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13603233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13604233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v48_), static_cast<T>(v49_)};
13605233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13606233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13607233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13608233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13610233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray49& other);
13611233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13612233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13613233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13614233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13615233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13616233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13617233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13618233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13619233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13620233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13621233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13622233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13623233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13624233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13625233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13626233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13627233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13628233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13629233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13630233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13631233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13632233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13633233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13634233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13635233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13636233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13637233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13638233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13639233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13641233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13642233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13643233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13644233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13645233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13646233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13647233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13648233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13650233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13651233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13653233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13654233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13655233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T45 v45_;
13657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T46 v46_;
13658233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T47 v47_;
13659233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T48 v48_;
13660233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T49 v49_;
13661233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13662233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13663233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
13664233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
13665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
13666233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
13667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
13668233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
13669233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
13670233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
13671233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
13672233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49, typename T50>
13673233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ValueArray50 {
13674233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13675233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
13676233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
13677233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
13678233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
13679233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
13680233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
13681233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
13682233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
13683233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
13684233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
13685233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
13686233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
13687233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
13688233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
13689233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13690233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
13691233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator<T>() const {
13692233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
13693233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
13694233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
13695233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
13696233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
13697233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
13698233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
13699233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
13700233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
13701233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
13702233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
13703233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
13704233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
13705233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
13706233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
13707233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
13708233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
13709233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ValuesIn(array);
13710233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13711233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13712233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13713233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13714233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const ValueArray50& other);
13715233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13716233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T1 v1_;
13717233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T2 v2_;
13718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T3 v3_;
13719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T4 v4_;
13720233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T5 v5_;
13721233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T6 v6_;
13722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T7 v7_;
13723233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T8 v8_;
13724233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T9 v9_;
13725233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T10 v10_;
13726233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T11 v11_;
13727233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T12 v12_;
13728233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T13 v13_;
13729233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T14 v14_;
13730233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T15 v15_;
13731233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T16 v16_;
13732233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T17 v17_;
13733233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T18 v18_;
13734233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T19 v19_;
13735233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T20 v20_;
13736233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T21 v21_;
13737233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T22 v22_;
13738233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T23 v23_;
13739233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T24 v24_;
13740233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T25 v25_;
13741233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T26 v26_;
13742233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T27 v27_;
13743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T28 v28_;
13744233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T29 v29_;
13745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T30 v30_;
13746233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T31 v31_;
13747233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T32 v32_;
13748233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T33 v33_;
13749233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T34 v34_;
13750233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T35 v35_;
13751233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T36 v36_;
13752233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T37 v37_;
13753233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T38 v38_;
13754233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T39 v39_;
13755233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T40 v40_;
13756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T41 v41_;
13757233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T42 v42_;
13758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T43 v43_;
13759233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T44 v44_;
13760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T45 v45_;
13761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T46 v46_;
13762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T47 v47_;
13763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T48 v48_;
13764233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T49 v49_;
13765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const T50 v50_;
13766233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
13767233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13768233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_HAS_COMBINE
13769233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
13770233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
13771233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates values from the Cartesian product of values produced
13772233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by the argument generators.
13773233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
13774233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
13775233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator2
13776233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
13777233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13778233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2> ParamType;
13779233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13780233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
13781233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2)
13782233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2) {}
13783233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator2() {}
13784233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13785233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
13786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
13787233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13788233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
13789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
13790233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13791233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13792233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13793233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
13794233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
13795233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
13796233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
13797233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
13798233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
13799233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2)
13800233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
13801233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
13802233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
13803233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
13804233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13805233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
13806233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13807233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
13808233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
13809233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13810233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
13811233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
13812233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
13813233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
13814233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current2_;
13815233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
13816233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
13817233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
13818233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
13819233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
13820233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13821233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
13822233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
13823233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13824233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
13825233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
13826233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
13827233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
13828233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
13829233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
13830233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
13831233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
13832233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
13833233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
13834233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
13835233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
13836233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
13837233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
13838233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
13839233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_);
13840233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13841233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13842233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
13843233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
13844233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
13845233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
13846233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
13847233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
13848233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
13849233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
13850233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_) {
13851233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
13852233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13853233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13854233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
13855233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
13856233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_);
13857233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13858233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
13859233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
13860233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
13861233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
13862233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
13863233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_;
13864233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13865233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13866233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
13867233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
13868233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13869233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
13870233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
13871233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
13872233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
13873233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
13874233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
13875233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
13876233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
13877233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
13878233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
13879233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator2::Iterator
13880233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13881233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
13882233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator2& other);
13883233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13884233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
13885233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
13886233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator2
13887233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13888233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13889233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3>
13890233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator3
13891233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
13892233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
13893233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
13894233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13895233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
13896233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
13897233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3) {}
13898233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator3() {}
13899233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13900233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
13901233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
13902233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin());
13903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
13905233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
13906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
13907233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13908233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
13909233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
13910233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
13911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
13912233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
13913233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
13914233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
13915233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
13916233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
13917233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3)
13918233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
13919233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
13920233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
13921233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
13922233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
13923233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13924233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
13925233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13926233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
13927233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
13928233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
13930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
13931233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
13932233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
13933233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current3_;
13934233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
13935233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
13936233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
13937233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
13938233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
13939233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
13940233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
13941233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
13942233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
13943233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13944233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
13945233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
13946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
13948233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
13949233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
13950233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
13951233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
13952233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
13953233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
13954233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
13955233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
13956233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
13957233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
13958233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
13959233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
13960233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
13961233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
13962233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
13963233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_);
13964233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13965233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13966233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
13967233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
13968233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
13969233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
13970233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
13971233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
13972233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
13973233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
13974233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
13975233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
13976233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
13977233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_) {
13978233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
13979233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13980233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
13982233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
13983233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_);
13984233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13985233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
13986233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
13987233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
13988233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
13989233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
13990233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
13991233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_;
13992233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
13993233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13994233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
13995233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
13996233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13997233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
13998233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
13999233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
14000233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
14001233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
14002233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
14003233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
14004233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
14005233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
14006233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
14007233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
14008233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
14009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
14010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator3::Iterator
14011233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14012233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
14013233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator3& other);
14014233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14015233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
14016233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
14017233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
14018233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator3
14019233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14020233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14021233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4>
14022233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator4
14023233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
14024233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
14025233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
14026233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14027233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
14028233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14029233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4)
14030233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
14031233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator4() {}
14032233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14033233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
14034233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14035233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin());
14036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
14038233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14039233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end());
14040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14041233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14042233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
14043233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
14044233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
14045233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
14046233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
14047233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
14048233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
14049233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
14050233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
14051233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
14052233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
14053233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4)
14054233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
14055233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14056233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14057233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14058233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
14059233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14060233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14061233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
14062233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14063233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14064233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
14065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14066233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
14067233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
14068233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
14069233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
14070233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current4_;
14071233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
14072233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
14073233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
14074233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14075233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
14076233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
14077233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
14078233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14079233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
14080233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
14081233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
14082233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14083233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14084233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14085233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
14086233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
14087233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14088233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
14089233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14090233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
14091233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
14092233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14093233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
14094233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
14095233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
14096233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
14097233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
14098233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
14099233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
14100233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
14101233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
14102233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
14103233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
14104233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
14105233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_);
14106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14107233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14108233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
14109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
14110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
14111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
14112233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
14113233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
14114233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
14115233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
14116233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
14117233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
14118233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
14119233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
14120233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
14121233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
14122233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_) {
14123233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14125233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
14127233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
14128233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
14129233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_);
14130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
14132233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
14133233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
14134233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
14135233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
14136233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
14137233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
14138233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_;
14139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14140233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
14142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
14143233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
14145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
14147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
14148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
14149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
14150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
14151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
14152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
14153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
14154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
14155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
14156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
14157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
14158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
14159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
14160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator4::Iterator
14161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14162233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
14163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator4& other);
14164233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
14166233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
14167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
14168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
14169233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator4
14170233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14171233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14172233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
14173233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator5
14174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
14175233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
14176233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
14177233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
14179233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14180233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
14181233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
14182233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator5() {}
14183233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
14185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14186233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
14187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
14189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14190233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end(), g5_, g5_.end());
14191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14192233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14193233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
14194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
14195233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
14196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
14197233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
14198233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
14199233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
14200233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
14201233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
14202233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
14203233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
14204233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4,
14205233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T5>& g5,
14206233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T5>::iterator& current5)
14207233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
14208233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14209233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14210233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14211233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14212233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
14213233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
14216233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14218233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
14219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
14221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
14222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
14223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
14224233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current5_;
14225233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current5_ == end5_) {
14226233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_ = begin5_;
14227233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current4_;
14228233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14229233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
14230233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
14231233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
14232233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14233233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
14234233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
14235233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
14236233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14237233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
14238233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
14239233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
14240233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14241233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14242233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14243233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
14244233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
14245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
14247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14248233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
14249233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
14250233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14251233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
14252233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
14253233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
14254233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
14255233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
14256233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
14257233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
14258233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
14259233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
14260233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
14261233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
14262233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
14263233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_ &&
14264233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == typed_other->current5_);
14265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14266233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14267233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
14268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
14269233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
14270233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
14271233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
14272233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
14273233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
14274233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
14275233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
14276233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
14277233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
14278233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
14279233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
14280233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
14281233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_),
14282233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin5_(other.begin5_),
14283233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end5_(other.end5_),
14284233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_(other.current5_) {
14285233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
14289233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
14290233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
14291233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_, *current5_);
14292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
14294233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
14295233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
14296233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
14297233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
14298233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
14299233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
14300233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_ ||
14301233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == end5_;
14302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14303233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
14305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
14306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14307233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
14308233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14309233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
14310233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
14311233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
14312233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
14313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
14314233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
14315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
14316233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
14317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
14318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
14319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
14320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
14321233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
14322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator begin5_;
14323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator end5_;
14324233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T5>::iterator current5_;
14325233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
14326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator5::Iterator
14327233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
14329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator5& other);
14330233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
14332233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
14333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
14334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
14335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T5> g5_;
14336233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator5
14337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14338233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14339233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14340233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6>
14341233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator6
14342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
14343233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T6> > {
14344233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
14345233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
14346233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14347233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
14348233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14349233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14350233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6)
14351233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
14352233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator6() {}
14353233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14354233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
14355233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14356233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
14357233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
14359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14360233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
14361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14362233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14363233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
14364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
14365233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
14366233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
14367233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
14368233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
14369233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
14370233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
14371233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
14372233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
14373233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
14374233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4,
14375233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T5>& g5,
14376233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T5>::iterator& current5,
14377233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6,
14378233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T6>::iterator& current6)
14379233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
14380233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14381233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14382233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14383233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14384233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14385233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
14386233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14388233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
14389233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14391233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
14392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
14394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
14395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
14396233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
14397233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current6_;
14398233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current6_ == end6_) {
14399233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_ = begin6_;
14400233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current5_;
14401233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14402233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current5_ == end5_) {
14403233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_ = begin5_;
14404233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current4_;
14405233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14406233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
14407233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
14408233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
14409233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14410233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
14411233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
14412233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
14413233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14414233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
14415233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
14416233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
14417233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14418233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
14421233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
14422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
14424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14425233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
14426233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
14427233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14428233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
14429233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
14430233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
14431233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
14432233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
14433233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
14434233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
14435233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
14436233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
14437233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
14438233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
14439233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
14440233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_ &&
14441233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == typed_other->current5_ &&
14442233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == typed_other->current6_);
14443233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14444233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14445233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
14446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
14447233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
14448233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
14449233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
14450233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
14451233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
14452233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
14453233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
14454233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
14455233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
14456233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
14457233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
14458233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
14459233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_),
14460233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin5_(other.begin5_),
14461233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end5_(other.end5_),
14462233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_(other.current5_),
14463233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin6_(other.begin6_),
14464233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end6_(other.end6_),
14465233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_(other.current6_) {
14466233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14467233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14468233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14469233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
14470233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
14471233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
14472233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_, *current5_, *current6_);
14473233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14474233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
14475233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
14476233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
14477233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
14478233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
14479233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
14480233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
14481233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_ ||
14482233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == end5_ ||
14483233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == end6_;
14484233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14485233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
14487233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
14488233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14489233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
14490233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14491233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
14492233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
14493233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
14494233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
14495233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
14496233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
14497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
14498233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
14499233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
14500233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
14501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
14502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
14503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
14504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator begin5_;
14505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator end5_;
14506233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T5>::iterator current5_;
14507233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator begin6_;
14508233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator end6_;
14509233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T6>::iterator current6_;
14510233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
14511233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator6::Iterator
14512233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14513233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
14514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator6& other);
14515233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14516233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
14517233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
14518233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
14519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
14520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T5> g5_;
14521233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T6> g6_;
14522233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator6
14523233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14524233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14525233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14526233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7>
14527233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator7
14528233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14529233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T7> > {
14530233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
14531233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
14532233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14533233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
14534233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14535233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14536233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
14537233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
14538233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator7() {}
14539233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14540233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
14541233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14542233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14543233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g7_.begin());
14544233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
14546233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14547233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
14548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14549233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14550233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
14551233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
14552233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
14553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
14554233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
14555233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
14556233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
14557233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
14558233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
14559233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
14560233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
14561233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4,
14562233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T5>& g5,
14563233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T5>::iterator& current5,
14564233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6,
14565233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T6>::iterator& current6,
14566233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T7>& g7,
14567233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T7>::iterator& current7)
14568233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
14569233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14570233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14571233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14572233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14573233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14574233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
14575233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
14576233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14577233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14578233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
14579233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14580233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14581233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
14582233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14583233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
14584233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
14585233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
14586233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
14587233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current7_;
14588233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current7_ == end7_) {
14589233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_ = begin7_;
14590233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current6_;
14591233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14592233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current6_ == end6_) {
14593233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_ = begin6_;
14594233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current5_;
14595233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14596233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current5_ == end5_) {
14597233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_ = begin5_;
14598233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current4_;
14599233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14600233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
14601233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
14602233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
14603233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14604233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
14605233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
14606233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
14607233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14608233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
14609233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
14610233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
14611233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14612233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14613233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14614233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
14615233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
14616233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
14618233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14619233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
14620233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
14621233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14622233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
14623233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
14624233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
14625233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
14626233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
14627233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
14628233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
14629233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
14630233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
14631233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
14632233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
14633233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
14634233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_ &&
14635233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == typed_other->current5_ &&
14636233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == typed_other->current6_ &&
14637233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == typed_other->current7_);
14638233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14639233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14640233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
14641233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
14642233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
14643233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
14644233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
14645233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
14646233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
14647233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
14648233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
14649233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
14650233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
14651233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
14652233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
14653233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
14654233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_),
14655233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin5_(other.begin5_),
14656233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end5_(other.end5_),
14657233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_(other.current5_),
14658233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin6_(other.begin6_),
14659233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end6_(other.end6_),
14660233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_(other.current6_),
14661233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin7_(other.begin7_),
14662233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end7_(other.end7_),
14663233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_(other.current7_) {
14664233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14666233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
14668233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
14669233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
14670233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_, *current5_, *current6_, *current7_);
14671233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14672233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
14673233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
14674233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
14675233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
14676233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
14677233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
14678233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
14679233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_ ||
14680233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == end5_ ||
14681233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == end6_ ||
14682233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == end7_;
14683233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14684233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14685233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
14686233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
14687233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14688233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
14689233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14690233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
14691233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
14692233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
14693233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
14694233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
14695233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
14696233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
14697233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
14698233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
14699233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
14700233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
14701233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
14702233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
14703233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator begin5_;
14704233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator end5_;
14705233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T5>::iterator current5_;
14706233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator begin6_;
14707233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator end6_;
14708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T6>::iterator current6_;
14709233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator begin7_;
14710233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator end7_;
14711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T7>::iterator current7_;
14712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
14713233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator7::Iterator
14714233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14715233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
14716233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator7& other);
14717233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
14719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
14720233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
14721233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
14722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T5> g5_;
14723233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T6> g6_;
14724233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T7> g7_;
14725233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator7
14726233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14727233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14728233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14729233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8>
14730233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator8
14731233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14732233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T7, T8> > {
14733233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
14734233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
14735233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14736233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
14737233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14738233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14739233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
14740233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T8>& g8)
14741233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
14742233d2500723e5594f3e7c70896ffeeef32b9c950ywan          g8_(g8) {}
14743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator8() {}
14744233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
14746233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14747233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14748233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g7_.begin(), g8_, g8_.begin());
14749233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14750233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
14751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14752233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
14753233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g8_.end());
14754233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14755233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14756233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
14757233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
14758233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
14759233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
14760233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
14761233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
14762233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
14763233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
14764233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
14765233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
14766233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
14767233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4,
14768233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T5>& g5,
14769233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T5>::iterator& current5,
14770233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6,
14771233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T6>::iterator& current6,
14772233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T7>& g7,
14773233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T7>::iterator& current7,
14774233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T8>& g8,
14775233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T8>::iterator& current8)
14776233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
14777233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
14778233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
14779233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
14780233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
14781233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
14782233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
14783233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
14784233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
14785233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14786233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14787233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
14788233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14789233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
14790233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
14791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14792233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
14793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
14794233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
14795233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
14796233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current8_;
14797233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current8_ == end8_) {
14798233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current8_ = begin8_;
14799233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current7_;
14800233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14801233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current7_ == end7_) {
14802233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_ = begin7_;
14803233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current6_;
14804233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14805233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current6_ == end6_) {
14806233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_ = begin6_;
14807233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current5_;
14808233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14809233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current5_ == end5_) {
14810233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_ = begin5_;
14811233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current4_;
14812233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14813233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
14814233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
14815233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
14816233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14817233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
14818233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
14819233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
14820233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14821233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
14822233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
14823233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
14824233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
14825233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14826233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14827233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
14828233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
14829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14830233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
14831233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
14832233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
14833233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
14834233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
14835233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
14836233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
14837233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
14838233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
14839233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
14840233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
14841233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
14842233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
14843233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
14844233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
14845233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
14846233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
14847233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_ &&
14848233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == typed_other->current5_ &&
14849233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == typed_other->current6_ &&
14850233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == typed_other->current7_ &&
14851233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current8_ == typed_other->current8_);
14852233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14853233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14854233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
14855233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
14856233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
14857233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
14858233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
14859233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
14860233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
14861233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
14862233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
14863233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
14864233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
14865233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
14866233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
14867233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
14868233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_),
14869233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin5_(other.begin5_),
14870233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end5_(other.end5_),
14871233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_(other.current5_),
14872233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin6_(other.begin6_),
14873233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end6_(other.end6_),
14874233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_(other.current6_),
14875233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin7_(other.begin7_),
14876233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end7_(other.end7_),
14877233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_(other.current7_),
14878233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin8_(other.begin8_),
14879233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end8_(other.end8_),
14880233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current8_(other.current8_) {
14881233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
14882233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14883233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14884233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
14885233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
14886233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
14887233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_, *current5_, *current6_, *current7_, *current8_);
14888233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14889233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
14890233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
14891233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
14892233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
14893233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
14894233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
14895233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
14896233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_ ||
14897233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == end5_ ||
14898233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == end6_ ||
14899233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == end7_ ||
14900233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current8_ == end8_;
14901233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
14902233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
14904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
14905233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14906233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
14907233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
14908233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
14909233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
14910233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
14911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
14912233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
14913233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
14914233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
14915233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
14916233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
14917233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
14918233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
14919233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
14920233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
14921233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator begin5_;
14922233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator end5_;
14923233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T5>::iterator current5_;
14924233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator begin6_;
14925233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator end6_;
14926233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T6>::iterator current6_;
14927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator begin7_;
14928233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator end7_;
14929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T7>::iterator current7_;
14930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T8>::iterator begin8_;
14931233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T8>::iterator end8_;
14932233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T8>::iterator current8_;
14933233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
14934233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator8::Iterator
14935233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14936233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
14937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator8& other);
14938233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
14940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
14941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
14942233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
14943233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T5> g5_;
14944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T6> g6_;
14945233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T7> g7_;
14946233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T8> g8_;
14947233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator8
14948233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14949233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14950233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
14951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9>
14952233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator9
14953233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
14954233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T7, T8, T9> > {
14955233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
14956233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
14957233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14958233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
14959233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
14960233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
14961233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
14962233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
14963233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
14964233d2500723e5594f3e7c70896ffeeef32b9c950ywan          g9_(g9) {}
14965233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator9() {}
14966233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14967233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
14968233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
14969233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
14970233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
14971233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14972233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
14973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
14974233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
14975233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g8_.end(), g9_, g9_.end());
14976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
14977233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14978233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
14979233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
14980233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
14981233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
14982233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
14983233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
14984233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
14985233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
14986233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
14987233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
14988233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
14989233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4,
14990233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T5>& g5,
14991233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T5>::iterator& current5,
14992233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6,
14993233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T6>::iterator& current6,
14994233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T7>& g7,
14995233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T7>::iterator& current7,
14996233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T8>& g8,
14997233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T8>::iterator& current8,
14998233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T9>& g9,
14999233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T9>::iterator& current9)
15000233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
15001233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
15002233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
15003233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
15004233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
15005233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
15006233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
15007233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
15008233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
15009233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
15010233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
15011233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15012233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
15013233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15014233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
15015233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
15016233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15017233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
15018233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
15019233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
15020233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
15021233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current9_;
15022233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current9_ == end9_) {
15023233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current9_ = begin9_;
15024233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current8_;
15025233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15026233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current8_ == end8_) {
15027233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current8_ = begin8_;
15028233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current7_;
15029233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15030233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current7_ == end7_) {
15031233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_ = begin7_;
15032233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current6_;
15033233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15034233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current6_ == end6_) {
15035233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_ = begin6_;
15036233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current5_;
15037233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15038233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current5_ == end5_) {
15039233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_ = begin5_;
15040233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current4_;
15041233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15042233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
15043233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
15044233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
15045233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15046233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
15047233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
15048233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
15049233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15050233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
15051233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
15052233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
15053233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15054233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
15055233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15056233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
15057233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
15058233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15059233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
15060233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
15061233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
15062233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
15063233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
15064233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
15065233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
15066233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
15067233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
15068233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
15069233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
15070233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
15071233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
15072233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
15073233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
15074233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
15075233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
15076233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_ &&
15077233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == typed_other->current5_ &&
15078233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == typed_other->current6_ &&
15079233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == typed_other->current7_ &&
15080233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current8_ == typed_other->current8_ &&
15081233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current9_ == typed_other->current9_);
15082233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15083233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15084233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
15085233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
15086233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
15087233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
15088233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
15089233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
15090233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
15091233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
15092233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
15093233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
15094233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
15095233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
15096233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
15097233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
15098233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_),
15099233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin5_(other.begin5_),
15100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end5_(other.end5_),
15101233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_(other.current5_),
15102233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin6_(other.begin6_),
15103233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end6_(other.end6_),
15104233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_(other.current6_),
15105233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin7_(other.begin7_),
15106233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end7_(other.end7_),
15107233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_(other.current7_),
15108233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin8_(other.begin8_),
15109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end8_(other.end8_),
15110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current8_(other.current8_),
15111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin9_(other.begin9_),
15112233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end9_(other.end9_),
15113233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current9_(other.current9_) {
15114233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
15115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
15118233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
15119233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
15120233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_, *current5_, *current6_, *current7_, *current8_,
15121233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current9_);
15122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
15124233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
15125233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
15126233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
15127233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
15128233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
15129233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
15130233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_ ||
15131233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == end5_ ||
15132233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == end6_ ||
15133233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == end7_ ||
15134233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current8_ == end8_ ||
15135233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current9_ == end9_;
15136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15137233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
15139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
15140233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
15142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
15143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
15144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
15145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
15146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
15147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
15148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
15149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
15150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
15151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
15152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
15153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
15154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
15155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
15156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator begin5_;
15157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator end5_;
15158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T5>::iterator current5_;
15159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator begin6_;
15160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator end6_;
15161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T6>::iterator current6_;
15162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator begin7_;
15163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator end7_;
15164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T7>::iterator current7_;
15165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T8>::iterator begin8_;
15166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T8>::iterator end8_;
15167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T8>::iterator current8_;
15168233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T9>::iterator begin9_;
15169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T9>::iterator end9_;
15170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T9>::iterator current9_;
15171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
15172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator9::Iterator
15173233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator9& other);
15176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
15178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
15179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
15180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
15181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T5> g5_;
15182233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T6> g6_;
15183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T7> g7_;
15184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T8> g8_;
15185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T9> g9_;
15186233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator9
15187233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15188233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15189233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10>
15191233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductGenerator10
15192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
15193233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T7, T8, T9, T10> > {
15194233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
15196233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15197233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
15198233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
15199233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
15200233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
15201233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
15202233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T10>& g10)
15203233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15204233d2500723e5594f3e7c70896ffeeef32b9c950ywan          g9_(g9), g10_(g10) {}
15205233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~CartesianProductGenerator10() {}
15206233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* Begin() const {
15208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
15209233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
15210233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
15211233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ParamIteratorInterface<ParamType>* End() const {
15213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
15214233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
15215233d2500723e5594f3e7c70896ffeeef32b9c950ywan        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
15216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15218233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class Iterator : public ParamIteratorInterface<ParamType> {
15220233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:
15221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const ParamGeneratorInterface<ParamType>* base,
15222233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T1>& g1,
15223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T1>::iterator& current1,
15224233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T2>& g2,
15225233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T2>::iterator& current2,
15226233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T3>& g3,
15227233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T3>::iterator& current3,
15228233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T4>& g4,
15229233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T4>::iterator& current4,
15230233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T5>& g5,
15231233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T5>::iterator& current5,
15232233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T6>& g6,
15233233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T6>::iterator& current6,
15234233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T7>& g7,
15235233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T7>::iterator& current7,
15236233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T8>& g8,
15237233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T8>::iterator& current8,
15238233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T9>& g9,
15239233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T9>::iterator& current9,
15240233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const ParamGenerator<T10>& g10,
15241233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const typename ParamGenerator<T10>::iterator& current10)
15242233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(base),
15243233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
15244233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
15245233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
15246233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
15247233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
15248233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
15249233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
15250233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
15251233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
15252233d2500723e5594f3e7c70896ffeeef32b9c950ywan          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
15253233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
15254233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ~Iterator() {}
15256233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
15258233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return base_;
15259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Advance should not be called on beyond-of-range iterators
15261233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // so no component iterators must be beyond end of range, either.
15262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void Advance() {
15263233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(!AtEnd());
15264233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ++current10_;
15265233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current10_ == end10_) {
15266233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current10_ = begin10_;
15267233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current9_;
15268233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15269233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current9_ == end9_) {
15270233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current9_ = begin9_;
15271233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current8_;
15272233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15273233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current8_ == end8_) {
15274233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current8_ = begin8_;
15275233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current7_;
15276233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15277233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current7_ == end7_) {
15278233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_ = begin7_;
15279233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current6_;
15280233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15281233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current6_ == end6_) {
15282233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_ = begin6_;
15283233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current5_;
15284233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15285233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current5_ == end5_) {
15286233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_ = begin5_;
15287233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current4_;
15288233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15289233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current4_ == end4_) {
15290233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_ = begin4_;
15291233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current3_;
15292233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15293233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current3_ == end3_) {
15294233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_ = begin3_;
15295233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current2_;
15296233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15297233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (current2_ == end2_) {
15298233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_ = begin2_;
15299233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ++current1_;
15300233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
15301233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
15302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15303233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual ParamIteratorInterface<ParamType>* Clone() const {
15304233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return new Iterator(*this);
15305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15306233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual const ParamType* Current() const { return &current_value_; }
15307233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
15308233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Having the same base generator guarantees that the other
15309233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // iterator is of the same type and we can downcast.
15310233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
15311233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "The program attempted to compare iterators "
15312233d2500723e5594f3e7c70896ffeeef32b9c950ywan          << "from different generators." << std::endl;
15313233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const Iterator* typed_other =
15314233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CheckedDowncastToActualType<const Iterator>(&other);
15315233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterators equal if they both point beyond their
15316233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // respective ranges. That can happen in a variety of fashions,
15317233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // so we have to consult AtEnd().
15318233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return (AtEnd() && typed_other->AtEnd()) ||
15319233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (
15320233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == typed_other->current1_ &&
15321233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == typed_other->current2_ &&
15322233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == typed_other->current3_ &&
15323233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == typed_other->current4_ &&
15324233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == typed_other->current5_ &&
15325233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == typed_other->current6_ &&
15326233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == typed_other->current7_ &&
15327233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current8_ == typed_other->current8_ &&
15328233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current9_ == typed_other->current9_ &&
15329233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current10_ == typed_other->current10_);
15330233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15332233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
15333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Iterator(const Iterator& other)
15334233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : base_(other.base_),
15335233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin1_(other.begin1_),
15336233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end1_(other.end1_),
15337233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current1_(other.current1_),
15338233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin2_(other.begin2_),
15339233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end2_(other.end2_),
15340233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current2_(other.current2_),
15341233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin3_(other.begin3_),
15342233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end3_(other.end3_),
15343233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current3_(other.current3_),
15344233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin4_(other.begin4_),
15345233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end4_(other.end4_),
15346233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current4_(other.current4_),
15347233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin5_(other.begin5_),
15348233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end5_(other.end5_),
15349233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current5_(other.current5_),
15350233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin6_(other.begin6_),
15351233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end6_(other.end6_),
15352233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current6_(other.current6_),
15353233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin7_(other.begin7_),
15354233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end7_(other.end7_),
15355233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current7_(other.current7_),
15356233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin8_(other.begin8_),
15357233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end8_(other.end8_),
15358233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current8_(other.current8_),
15359233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin9_(other.begin9_),
15360233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end9_(other.end9_),
15361233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current9_(other.current9_),
15362233d2500723e5594f3e7c70896ffeeef32b9c950ywan        begin10_(other.begin10_),
15363233d2500723e5594f3e7c70896ffeeef32b9c950ywan        end10_(other.end10_),
15364233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current10_(other.current10_) {
15365233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ComputeCurrentValue();
15366233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15367233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void ComputeCurrentValue() {
15369233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!AtEnd())
15370233d2500723e5594f3e7c70896ffeeef32b9c950ywan        current_value_ = ParamType(*current1_, *current2_, *current3_,
15371233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current4_, *current5_, *current6_, *current7_, *current8_,
15372233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *current9_, *current10_);
15373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bool AtEnd() const {
15375233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We must report iterator past the end of the range when either of the
15376233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // component iterators has reached the end of its range.
15377233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return
15378233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current1_ == end1_ ||
15379233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current2_ == end2_ ||
15380233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current3_ == end3_ ||
15381233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current4_ == end4_ ||
15382233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current5_ == end5_ ||
15383233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current6_ == end6_ ||
15384233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current7_ == end7_ ||
15385233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current8_ == end8_ ||
15386233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current9_ == end9_ ||
15387233d2500723e5594f3e7c70896ffeeef32b9c950ywan          current10_ == end10_;
15388233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
15389233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // No implementation - assignment is unsupported.
15391233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void operator=(const Iterator& other);
15392233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ParamGeneratorInterface<ParamType>* const base_;
15394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
15395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // current[i]_ is the actual traversing iterator.
15396233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator begin1_;
15397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T1>::iterator end1_;
15398233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T1>::iterator current1_;
15399233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator begin2_;
15400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T2>::iterator end2_;
15401233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T2>::iterator current2_;
15402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator begin3_;
15403233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T3>::iterator end3_;
15404233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T3>::iterator current3_;
15405233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator begin4_;
15406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T4>::iterator end4_;
15407233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T4>::iterator current4_;
15408233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator begin5_;
15409233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T5>::iterator end5_;
15410233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T5>::iterator current5_;
15411233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator begin6_;
15412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T6>::iterator end6_;
15413233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T6>::iterator current6_;
15414233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator begin7_;
15415233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T7>::iterator end7_;
15416233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T7>::iterator current7_;
15417233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T8>::iterator begin8_;
15418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T8>::iterator end8_;
15419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T8>::iterator current8_;
15420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T9>::iterator begin9_;
15421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T9>::iterator end9_;
15422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T9>::iterator current9_;
15423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T10>::iterator begin10_;
15424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const typename ParamGenerator<T10>::iterator end10_;
15425233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename ParamGenerator<T10>::iterator current10_;
15426233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ParamType current_value_;
15427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };  // class CartesianProductGenerator10::Iterator
15428233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15429233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductGenerator10& other);
15431233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T1> g1_;
15433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T2> g2_;
15434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T3> g3_;
15435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T4> g4_;
15436233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T5> g5_;
15437233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T6> g6_;
15438233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T7> g7_;
15439233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T8> g8_;
15440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T9> g9_;
15441233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamGenerator<T10> g10_;
15442233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductGenerator10
15443233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15444233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15445233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
15446233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15447233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper classes providing Combine() with polymorphic features. They allow
15448233d2500723e5594f3e7c70896ffeeef32b9c950ywan// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
15449233d2500723e5594f3e7c70896ffeeef32b9c950ywan// convertible to U.
15450233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15451233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2>
15452233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder2 {
15453233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15454233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
15455233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2) {}
15456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2>
15457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
15458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
15459233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator2<T1, T2>(
15460233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15461233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_)));
15462233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15463233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15464233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15465233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15466233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder2& other);
15467233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15468233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15469233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15470233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder2
15471233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15472233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3>
15473233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder3 {
15474233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15475233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
15476233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3)
15477233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3) {}
15478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3>
15479233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
15480233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
15481233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator3<T1, T2, T3>(
15482233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15483233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15484233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_)));
15485233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15486233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15487233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15488233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15489233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder3& other);
15490233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15491233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15493233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15494233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder3
15495233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15496233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4>
15498233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder4 {
15499233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15500233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
15501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4)
15502233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
15503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4>
15504233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
15505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
15506233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator4<T1, T2, T3, T4>(
15507233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15508233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15509233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15510233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_)));
15511233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15512233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15513233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder4& other);
15516233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15517233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15518233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15520233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15521233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder4
15522233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15523233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15524233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4, class Generator5>
15525233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder5 {
15526233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15527233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
15528233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4, const Generator5& g5)
15529233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
15530233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4, typename T5>
15531233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
15532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
15533233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
15534233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15535233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15536233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15537233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_),
15538233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T5> >(g5_)));
15539233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15540233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15541233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15542233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15543233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder5& other);
15544233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15546233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15547233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15549233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator5 g5_;
15550233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder5
15551233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15552233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4, class Generator5, class Generator6>
15554233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder6 {
15555233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15556233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
15557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15558233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator6& g6)
15559233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
15560233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15561233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typename T6>
15562233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
15563233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
15564233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
15565233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15566233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15567233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15568233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_),
15569233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T5> >(g5_),
15570233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T6> >(g6_)));
15571233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15572233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15573233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15574233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15575233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder6& other);
15576233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15577233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15578233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15581233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator5 g5_;
15582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator6 g6_;
15583233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder6
15584233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15585233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15586233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4, class Generator5, class Generator6, class Generator7>
15587233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder7 {
15588233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15589233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
15590233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15591233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator6& g6, const Generator7& g7)
15592233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
15593233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15594233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typename T6, typename T7>
15595233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
15596233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T7> >() const {
15597233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
15598233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
15599233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15600233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15601233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15602233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_),
15603233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T5> >(g5_),
15604233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T6> >(g6_),
15605233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T7> >(g7_)));
15606233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15607233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15608233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15610233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder7& other);
15611233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15612233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15613233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15614233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15615233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15616233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator5 g5_;
15617233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator6 g6_;
15618233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator7 g7_;
15619233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder7
15620233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15621233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15622233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4, class Generator5, class Generator6, class Generator7,
15623233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator8>
15624233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder8 {
15625233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15626233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
15627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15628233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator6& g6, const Generator7& g7, const Generator8& g8)
15629233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
15630233d2500723e5594f3e7c70896ffeeef32b9c950ywan          g8_(g8) {}
15631233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15632233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typename T6, typename T7, typename T8>
15633233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
15634233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T8> >() const {
15635233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
15636233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
15637233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15638233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15639233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15640233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_),
15641233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T5> >(g5_),
15642233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T6> >(g6_),
15643233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T7> >(g7_),
15644233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T8> >(g8_)));
15645233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15646233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15647233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15648233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder8& other);
15650233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15651233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15653233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15654233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15655233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator5 g5_;
15656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator6 g6_;
15657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator7 g7_;
15658233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator8 g8_;
15659233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder8
15660233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15661233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15662233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4, class Generator5, class Generator6, class Generator7,
15663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator8, class Generator9>
15664233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder9 {
15665233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15666233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
15667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15668233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator6& g6, const Generator7& g7, const Generator8& g8,
15669233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator9& g9)
15670233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15671233d2500723e5594f3e7c70896ffeeef32b9c950ywan          g9_(g9) {}
15672233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15673233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typename T6, typename T7, typename T8, typename T9>
15674233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15675233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T9> >() const {
15676233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15677233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T9> >(
15678233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
15679233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15680233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15681233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15682233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_),
15683233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T5> >(g5_),
15684233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T6> >(g6_),
15685233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T7> >(g7_),
15686233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T8> >(g8_),
15687233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T9> >(g9_)));
15688233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15689233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15690233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15691233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15692233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder9& other);
15693233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15694233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15696233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15697233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15698233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator5 g5_;
15699233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator6 g6_;
15700233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator7 g7_;
15701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator8 g8_;
15702233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator9 g9_;
15703233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder9
15704233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15705233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Generator1, class Generator2, class Generator3,
15706233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator4, class Generator5, class Generator6, class Generator7,
15707233d2500723e5594f3e7c70896ffeeef32b9c950ywan    class Generator8, class Generator9, class Generator10>
15708233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass CartesianProductHolder10 {
15709233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
15710233d2500723e5594f3e7c70896ffeeef32b9c950ywanCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
15711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator3& g3, const Generator4& g4, const Generator5& g5,
15712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator6& g6, const Generator7& g7, const Generator8& g8,
15713233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator9& g9, const Generator10& g10)
15714233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
15715233d2500723e5594f3e7c70896ffeeef32b9c950ywan          g9_(g9), g10_(g10) {}
15716233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2, typename T3, typename T4, typename T5,
15717233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typename T6, typename T7, typename T8, typename T9, typename T10>
15718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15719233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T9, T10> >() const {
15720233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
15721233d2500723e5594f3e7c70896ffeeef32b9c950ywan        T9, T10> >(
15722233d2500723e5594f3e7c70896ffeeef32b9c950ywan        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
15723233d2500723e5594f3e7c70896ffeeef32b9c950ywan            T10>(
15724233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T1> >(g1_),
15725233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T2> >(g2_),
15726233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T3> >(g3_),
15727233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T4> >(g4_),
15728233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T5> >(g5_),
15729233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T6> >(g6_),
15730233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T7> >(g7_),
15731233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T8> >(g8_),
15732233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T9> >(g9_),
15733233d2500723e5594f3e7c70896ffeeef32b9c950ywan        static_cast<ParamGenerator<T10> >(g10_)));
15734233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
15735233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15736233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
15737233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // No implementation - assignment is unsupported.
15738233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const CartesianProductHolder10& other);
15739233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15740233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator1 g1_;
15741233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator2 g2_;
15742233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator3 g3_;
15743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator4 g4_;
15744233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator5 g5_;
15745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator6 g6_;
15746233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator7 g7_;
15747233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator8 g8_;
15748233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator9 g9_;
15749233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const Generator10 g10_;
15750233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class CartesianProductHolder10
15751233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15752233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_HAS_COMBINE
15753233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15754233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
15755233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
15756233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15757233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  //  GTEST_HAS_PARAM_TEST
15758233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15759233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
15760233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15761233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PARAM_TEST
15762233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15763233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
15764233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15765233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Functions producing parameter generators.
15766233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15767233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test uses these generators to produce parameters for value-
15768233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parameterized tests. When a parameterized test case is instantiated
15769233d2500723e5594f3e7c70896ffeeef32b9c950ywan// with a particular generator, Google Test creates and runs tests
15770233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for each element in the sequence produced by the generator.
15771233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15772233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In the following sample, tests from test case FooTest are instantiated
15773233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each three times with parameter values 3, 5, and 8:
15774233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15775233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class FooTest : public TestWithParam<int> { ... };
15776233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15777233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_P(FooTest, TestThis) {
15778233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
15779233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_P(FooTest, TestThat) {
15780233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
15781233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
15782233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15783233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15784233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Range() returns generators providing sequences of values in a range.
15785233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15786233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Synopsis:
15787233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Range(start, end)
15788233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing a sequence of values {start, start+1,
15789233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     start+2, ..., }.
15790233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Range(start, end, step)
15791233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing a sequence of values {start, start+step,
15792233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     start+step+step, ..., }.
15793233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Notes:
15794233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   * The generated sequences never include end. For example, Range(1, 5)
15795233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
15796233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     returns a generator producing {1, 3, 5, 7}.
15797233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   * start and end must have the same type. That type may be any integral or
15798233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     floating-point type or a user defined type satisfying these conditions:
15799233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * It must be assignable (have operator=() defined).
15800233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * It must have operator+() (operator+(int-compatible type) for
15801233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       two-operand version).
15802233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * It must have operator<() defined.
15803233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Elements in the resulting sequences will also have that type.
15804233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   * Condition start < end must be satisfied in order for resulting sequences
15805233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     to contain any elements.
15806233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15807233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, typename IncrementT>
15808233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
15809233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ParamGenerator<T>(
15810233d2500723e5594f3e7c70896ffeeef32b9c950ywan      new internal::RangeGenerator<T, IncrementT>(start, end, step));
15811233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15812233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15813233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
15814233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<T> Range(T start, T end) {
15815233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return Range(start, end, 1);
15816233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15817233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15818233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ValuesIn() function allows generation of tests with parameters coming from
15819233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a container.
15820233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15821233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Synopsis:
15822233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ValuesIn(const T (&array)[N])
15823233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing sequences with elements from
15824233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     a C-style array.
15825233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ValuesIn(const Container& container)
15826233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing sequences with elements from
15827233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     an STL-style container.
15828233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ValuesIn(Iterator begin, Iterator end)
15829233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing sequences with elements from
15830233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     a range [begin, end) defined by a pair of STL-style iterators. These
15831233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     iterators can also be plain C pointers.
15832233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15833233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Please note that ValuesIn copies the values from the containers
15834233d2500723e5594f3e7c70896ffeeef32b9c950ywan// passed in and keeps them to generate tests in RUN_ALL_TESTS().
15835233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15836233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Examples:
15837233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15838233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This instantiates tests from test case StringTest
15839233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each with C-string values of "foo", "bar", and "baz":
15840233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15841233d2500723e5594f3e7c70896ffeeef32b9c950ywan// const char* strings[] = {"foo", "bar", "baz"};
15842233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
15843233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15844233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This instantiates tests from test case StlStringTest
15845233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each with STL strings with values "a" and "b":
15846233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15847233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::std::vector< ::std::string> GetParameterStrings() {
15848233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ::std::vector< ::std::string> v;
15849233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   v.push_back("a");
15850233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   v.push_back("b");
15851233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   return v;
15852233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
15853233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15854233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(CharSequence,
15855233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         StlStringTest,
15856233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         ValuesIn(GetParameterStrings()));
15857233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15858233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15859233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This will also instantiate tests from CharTest
15860233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each with parameter values 'a' and 'b':
15861233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15862233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::std::list<char> GetParameterChars() {
15863233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ::std::list<char> list;
15864233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   list.push_back('a');
15865233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   list.push_back('b');
15866233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   return list;
15867233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
15868233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::std::list<char> l = GetParameterChars();
15869233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(CharSequence2,
15870233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         CharTest,
15871233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         ValuesIn(l.begin(), l.end()));
15872233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15873233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename ForwardIterator>
15874233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<
15875233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
15876233d2500723e5594f3e7c70896ffeeef32b9c950ywanValuesIn(ForwardIterator begin, ForwardIterator end) {
15877233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
15878233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::value_type ParamType;
15879233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ParamGenerator<ParamType>(
15880233d2500723e5594f3e7c70896ffeeef32b9c950ywan      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
15881233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15882233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15883233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T, size_t N>
15884233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
15885233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ValuesIn(array, array + N);
15886233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15887233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15888233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <class Container>
15889233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ParamGenerator<typename Container::value_type> ValuesIn(
15890233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Container& container) {
15891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ValuesIn(container.begin(), container.end());
15892233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15893233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15894233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Values() allows generating tests from explicitly specified list of
15895233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parameters.
15896233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15897233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Synopsis:
15898233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Values(T v1, T v2, ..., T vN)
15899233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing sequences with elements v1, v2, ..., vN.
15900233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15901233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For example, this instantiates tests from test case BarTest each
15902233d2500723e5594f3e7c70896ffeeef32b9c950ywan// with values "one", "two", and "three":
15903233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15904233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
15905233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15906233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
15907233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The exact type of values will depend on the type of parameter in BazTest.
15908233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15909233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
15910233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15911233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Currently, Values() supports from 1 to 50 parameters.
15912233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
15913233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1>
15914233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray1<T1> Values(T1 v1) {
15915233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray1<T1>(v1);
15916233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15917233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15918233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
15919233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
15920233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray2<T1, T2>(v1, v2);
15921233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15922233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15923233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3>
15924233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
15925233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
15926233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15927233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15928233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4>
15929233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
15930233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
15931233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15932233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15933233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
15934233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
15935233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T5 v5) {
15936233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
15937233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15938233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15939233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15940233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6>
15941233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
15942233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T4 v4, T5 v5, T6 v6) {
15943233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
15944233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15945233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15946233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7>
15948233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
15949233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T4 v4, T5 v5, T6 v6, T7 v7) {
15950233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
15951233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v6, v7);
15952233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15953233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15954233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8>
15956233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
15957233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
15958233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
15959233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5, v6, v7, v8);
15960233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15961233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15962233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15963233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9>
15964233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
15965233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
15966233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
15967233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4, v5, v6, v7, v8, v9);
15968233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15969233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15970233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15971233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10>
15972233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
15973233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
15974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
15975233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2, v3, v4, v5, v6, v7, v8, v9, v10);
15976233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15977233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15978233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15979233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
15980233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11>
15981233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
15982233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15983233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11) {
15984233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
15985233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
15986233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15987233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15988233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15989233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
15990233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12>
15991233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
15992233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
15993233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12) {
15994233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
15995233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
15996233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
15997233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15998233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
15999233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16000233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13>
16001233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
16002233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16003233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13) {
16004233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16005233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
16006233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16007233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16008233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16010233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14>
16011233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16012233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16013233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
16014233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16015233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16016233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14);
16017233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16018233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16019233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16020233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16021233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15>
16022233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16023233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16024233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
16025233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16026233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16027233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13, v14, v15);
16028233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16029233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16030233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16031233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16032233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16033233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16>
16034233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16035233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16036233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16037233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16) {
16038233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16039233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16040233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12, v13, v14, v15, v16);
16041233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16042233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16043233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16044233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16045233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16046233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17>
16047233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16048233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16049233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16050233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17) {
16051233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16052233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16053233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11, v12, v13, v14, v15, v16, v17);
16054233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16055233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16056233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16057233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16058233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16059233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18>
16060233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16061233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16062233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16063233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18) {
16064233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16065233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16066233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10, v11, v12, v13, v14, v15, v16, v17, v18);
16067233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16068233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16069233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16070233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16071233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19>
16073233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16075233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16076233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
16077233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16078233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
16079233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
16080233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16081233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16082233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16083233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16084233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16085233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20>
16086233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16087233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16088233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16089233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
16090233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16091233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
16092233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
16093233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16094233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16095233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16096233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16097233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16098233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16099233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21>
16100233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
16104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16105233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
16106233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
16107233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16109233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22>
16114233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
16116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T21 v21, T22 v22) {
16119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16120233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
16121233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16122233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20, v21, v22);
16123233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16124233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16125233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16128233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23>
16130233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
16132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T21 v21, T22 v22, T23 v23) {
16135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16136233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
16137233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16138233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20, v21, v22, v23);
16139233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16140233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16141233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24>
16146233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
16148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T21 v21, T22 v22, T23 v23, T24 v24) {
16151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16152233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
16153233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
16154233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v19, v20, v21, v22, v23, v24);
16155233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16156233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16157233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25>
16162233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
16164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
16165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
16166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
16167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16168233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
16169233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
16170233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v18, v19, v20, v21, v22, v23, v24, v25);
16171233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16172233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16173233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26>
16179233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16182233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26) {
16185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16186233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16187233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
16188233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
16189233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16190233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16191233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16194233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16195233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27>
16197233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16198233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
16199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16200233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27) {
16203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16204233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16205233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
16206233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
16207233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16208233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16209233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28>
16215233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16216233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
16217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27, T28 v28) {
16221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16222233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16224233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
16225233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v28);
16226233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16227233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16228233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16231233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16232233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29>
16234233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27, T28 v28, T29 v29) {
16240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16241233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16242233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16243233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
16244233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27, v28, v29);
16245233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16246233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16247233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16250233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16251233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16252233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30>
16253233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16254233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
16257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
16258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
16259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16260233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16261233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16262233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
16263233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v26, v27, v28, v29, v30);
16264233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16265233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16266233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16267233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16269233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16270233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16272233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31>
16273233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16274233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
16279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16280233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16281233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16282233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
16283233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v25, v26, v27, v28, v29, v30, v31);
16284233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16285233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16286233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16287233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32>
16293233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16295233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16296233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16298233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16299233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T32 v32) {
16300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16301233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16302233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16303233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16304233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24, v25, v26, v27, v28, v29, v30, v31, v32);
16305233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16307233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16308233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16309233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16310233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16311233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16312233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33>
16314233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16316233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T32 v32, T33 v33) {
16321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16322233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16323233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
16324233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16325233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
16326233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16327233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16328233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16330233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16331233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16332233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34>
16335233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16336233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16337233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16338233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
16340233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
16341233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31 v31, T32 v32, T33 v33, T34 v34) {
16342233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16343233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16344233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
16345233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
16346233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
16347233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16348233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16349233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16350233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16351233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16352233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16353233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16354233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16355233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35>
16356233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16359233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16360233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16361233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16362233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
16363233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16364233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16365233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
16366233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
16367233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
16368233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16369233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16370233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16371233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16374233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16376233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36>
16378233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16379233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16380233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16381233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16382233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16383233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16384233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
16385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16386233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16387233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
16388233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16389233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16390233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v34, v35, v36);
16391233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16392233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16393233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16396233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16398233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16399233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16400233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37>
16401233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16403233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
16404233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16405233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16407233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16408233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T37 v37) {
16409233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16410233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16411233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
16412233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16413233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16414233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v34, v35, v36, v37);
16415233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16416233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16417233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38>
16425233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16426233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16427233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
16428233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16430233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16431233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T37 v37, T38 v38) {
16433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16434233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16435233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
16436233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
16437233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
16438233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v33, v34, v35, v36, v37, v38);
16439233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16440233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16441233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16442233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16443233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16444233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16445233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16447233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39>
16449233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16451233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
16452233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
16453233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
16454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
16455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
16456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T37 v37, T38 v38, T39 v39) {
16457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16458233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16459233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
16460233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
16461233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
16462233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v32, v33, v34, v35, v36, v37, v38, v39);
16463233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16464233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16465233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16466233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16467233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16468233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16469233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16470233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16472233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40>
16473233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16474233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16475233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
16476233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
16477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
16478233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
16479233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
16480233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
16481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16482233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16483233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16484233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
16485233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
16486233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
16487233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16488233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16489233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16490233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16491233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16492233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16493233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16494233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16495233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16496233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16497233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41>
16498233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16499233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16500233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
16501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
16506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16507233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16508233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16509233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
16510233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
16511233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
16512233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16513233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16514233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16515233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16516233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16517233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16518233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16519233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16520233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16521233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16522233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42>
16523233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16524233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16525233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
16526233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16527233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16528233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16529233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16530233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16531233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T42 v42) {
16532233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16533233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16534233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16535233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
16536233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
16537233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
16538233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v42);
16539233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16540233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16541233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16543233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16544233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16545233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16546233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16547233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16548233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16549233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43>
16550233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16551233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16552233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
16553233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16554233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16555233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16556233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16557233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16558233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T42 v42, T43 v43) {
16559233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16560233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16561233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16562233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
16563233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
16564233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
16565233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v41, v42, v43);
16566233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16567233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16568233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16569233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16570233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16571233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16572233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16573233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16574233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16575233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16576233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44>
16577233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16578233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16579233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16580233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
16581233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
16582233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
16583233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
16584233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
16585233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T42 v42, T43 v43, T44 v44) {
16586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16587233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16588233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16589233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
16590233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
16591233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
16592233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v40, v41, v42, v43, v44);
16593233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16594233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16595233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16596233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16597233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16598233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16599233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16600233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16601233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16602233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16603233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45>
16604233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16605233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16606233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16607233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
16608233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
16609233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
16610233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
16611233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
16612233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
16613233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16614233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16615233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16616233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
16617233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
16618233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
16619233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v39, v40, v41, v42, v43, v44, v45);
16620233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16621233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16622233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16623233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16624233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16625233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16626233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16627233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16628233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16629233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16630233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
16631233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46>
16632233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16633233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16634233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16635233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16636233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16637233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16638233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16639233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16640233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
16641233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16642233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16643233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16644233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
16645233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16646233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
16647233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v38, v39, v40, v41, v42, v43, v44, v45, v46);
16648233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16649233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16650233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16651233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16652233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16653233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16654233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16655233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16656233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16657233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16658233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
16659233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47>
16660233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16661233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16662233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
16664233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16665233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16666233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16667233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16668233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
16669233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16670233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16671233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16672233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
16673233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
16674233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
16675233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
16676233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16677233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16678233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16679233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16680233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16681233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16682233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16683233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16684233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16685233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16686233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
16687233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48>
16688233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16689233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16690233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16691233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
16692233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
16693233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
16694233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
16695233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
16696233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
16697233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T48 v48) {
16698233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16699233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16700233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16701233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
16702233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
16703233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
16704233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
16705233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16706233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16707233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16708233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16709233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16710233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16712233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16713233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16714233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16715233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
16716233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49>
16717233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16718233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16719233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16720233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
16721233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
16722233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
16723233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
16724233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
16725233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
16726233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T47 v47, T48 v48, T49 v49) {
16727233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16728233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16729233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16730233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
16731233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
16732233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
16733233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
16734233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16735233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16736233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
16737233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T6, typename T7, typename T8, typename T9, typename T10,
16738233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T11, typename T12, typename T13, typename T14, typename T15,
16739233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T16, typename T17, typename T18, typename T19, typename T20,
16740233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T21, typename T22, typename T23, typename T24, typename T25,
16741233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T26, typename T27, typename T28, typename T29, typename T30,
16742233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T31, typename T32, typename T33, typename T34, typename T35,
16743233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T36, typename T37, typename T38, typename T39, typename T40,
16744233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T41, typename T42, typename T43, typename T44, typename T45,
16745233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename T46, typename T47, typename T48, typename T49, typename T50>
16746233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
16747233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
16748233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
16749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
16750233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
16751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
16752233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
16753233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
16754233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
16755233d2500723e5594f3e7c70896ffeeef32b9c950ywan    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
16756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
16757233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
16758233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
16759233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
16760233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
16761233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
16762233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
16763233d2500723e5594f3e7c70896ffeeef32b9c950ywan      v48, v49, v50);
16764233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16765233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16766233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Bool() allows generating tests with parameters in a set of (false, true).
16767233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16768233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Synopsis:
16769233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Bool()
16770233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing sequences with elements {false, true}.
16771233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16772233d2500723e5594f3e7c70896ffeeef32b9c950ywan// It is useful when testing code that depends on Boolean flags. Combinations
16773233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of multiple flags can be tested when several Bool()'s are combined using
16774233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Combine() function.
16775233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16776233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In the following example all tests in the test case FlagDependentTest
16777233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will be instantiated twice with parameters false and true.
16778233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16779233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class FlagDependentTest : public testing::TestWithParam<bool> {
16780233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   virtual void SetUp() {
16781233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     external_flag = GetParam();
16782233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
16783233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
16784233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
16785233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16786233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline internal::ParamGenerator<bool> Bool() {
16787233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return Values(false, true);
16788233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16789233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16790233d2500723e5594f3e7c70896ffeeef32b9c950ywan# if GTEST_HAS_COMBINE
16791233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Combine() allows the user to combine two or more sequences to produce
16792233d2500723e5594f3e7c70896ffeeef32b9c950ywan// values of a Cartesian product of those sequences' elements.
16793233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16794233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Synopsis:
16795233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Combine(gen1, gen2, ..., genN)
16796233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   - returns a generator producing sequences with elements coming from
16797233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     the Cartesian product of elements from the sequences generated by
16798233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     gen1, gen2, ..., genN. The sequence elements will have a type of
16799233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
16800233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     of elements from sequences produces by gen1, gen2, ..., genN.
16801233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16802233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Combine can have up to 10 arguments. This number is currently limited
16803233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by the maximum number of elements in the tuple implementation used by Google
16804233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Test.
16805233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16806233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Example:
16807233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16808233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This will instantiate tests in test case AnimalTest each one with
16809233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
16810233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tuple("dog", BLACK), and tuple("dog", WHITE):
16811233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16812233d2500723e5594f3e7c70896ffeeef32b9c950ywan// enum Color { BLACK, GRAY, WHITE };
16813233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class AnimalTest
16814233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
16815233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16816233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_P(AnimalTest, AnimalLooksNice) {...}
16817233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16818233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
16819233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         Combine(Values("cat", "dog"),
16820233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                                 Values(BLACK, WHITE)));
16821233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16822233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This will instantiate tests in FlagDependentTest with all variations of two
16823233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Boolean flags:
16824233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16825233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class FlagDependentTest
16826233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     : public testing::TestWithParam<tuple<bool, bool> > {
16827233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   virtual void SetUp() {
16828233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
16829233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     tie(external_flag_1, external_flag_2) = GetParam();
16830233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
16831233d2500723e5594f3e7c70896ffeeef32b9c950ywan// };
16832233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16833233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_P(FlagDependentTest, TestFeature1) {
16834233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Test your code using external_flag_1 and external_flag_2 here.
16835233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
16836233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
16837233d2500723e5594f3e7c70896ffeeef32b9c950ywan//                         Combine(Bool(), Bool()));
16838233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16839233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2>
16840233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder2<Generator1, Generator2> Combine(
16841233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2) {
16842233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder2<Generator1, Generator2>(
16843233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2);
16844233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16845233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16846233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3>
16847233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
16848233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
16849233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
16850233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3);
16851233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16852233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16853233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16854233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4>
16855233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
16856233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4> Combine(
16857233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16858233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4) {
16859233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
16860233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4>(
16861233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4);
16862233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16863233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16864233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16865233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4, typename Generator5>
16866233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
16867233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4, Generator5> Combine(
16868233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16869233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4, const Generator5& g5) {
16870233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
16871233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4, Generator5>(
16872233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4, g5);
16873233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16874233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16875233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16876233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4, typename Generator5, typename Generator6>
16877233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
16878233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4, Generator5, Generator6> Combine(
16879233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16880233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
16881233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
16882233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4, Generator5, Generator6>(
16883233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4, g5, g6);
16884233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16885233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16886233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16887233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4, typename Generator5, typename Generator6,
16888233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator7>
16889233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
16890233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4, Generator5, Generator6, Generator7> Combine(
16891233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16892233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16893233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator7& g7) {
16894233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
16895233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4, Generator5, Generator6, Generator7>(
16896233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4, g5, g6, g7);
16897233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16898233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16899233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16900233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4, typename Generator5, typename Generator6,
16901233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator7, typename Generator8>
16902233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
16903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
16904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16905233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16906233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator7& g7, const Generator8& g8) {
16907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
16908233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4, Generator5, Generator6, Generator7, Generator8>(
16909233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4, g5, g6, g7, g8);
16910233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16911233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16912233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16913233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4, typename Generator5, typename Generator6,
16914233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator7, typename Generator8, typename Generator9>
16915233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
16916233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4, Generator5, Generator6, Generator7, Generator8,
16917233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator9> Combine(
16918233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16919233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16920233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
16921233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
16922233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
16923233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4, g5, g6, g7, g8, g9);
16924233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16925233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16926233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Generator1, typename Generator2, typename Generator3,
16927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator4, typename Generator5, typename Generator6,
16928233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator7, typename Generator8, typename Generator9,
16929233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typename Generator10>
16930233d2500723e5594f3e7c70896ffeeef32b9c950ywaninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
16931233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
16932233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Generator10> Combine(
16933233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const Generator1& g1, const Generator2& g2, const Generator3& g3,
16934233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator4& g4, const Generator5& g5, const Generator6& g6,
16935233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator7& g7, const Generator8& g8, const Generator9& g9,
16936233d2500723e5594f3e7c70896ffeeef32b9c950ywan        const Generator10& g10) {
16937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
16938233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
16939233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Generator10>(
16940233d2500723e5594f3e7c70896ffeeef32b9c950ywan      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
16941233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
16942233d2500723e5594f3e7c70896ffeeef32b9c950ywan# endif  // GTEST_HAS_COMBINE
16943233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16944233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16945233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16946233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define TEST_P(test_case_name, test_name) \
16947233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
16948233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : public test_case_name { \
16949233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public: \
16950233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
16951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void TestBody(); \
16952233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private: \
16953233d2500723e5594f3e7c70896ffeeef32b9c950ywan    static int AddToRegistry() { \
16954233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
16955233d2500723e5594f3e7c70896ffeeef32b9c950ywan          GetTestCasePatternHolder<test_case_name>(\
16956233d2500723e5594f3e7c70896ffeeef32b9c950ywan              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
16957233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  #test_case_name, \
16958233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  #test_name, \
16959233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  new ::testing::internal::TestMetaFactory< \
16960233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
16961233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return 0; \
16962233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
16963233d2500723e5594f3e7c70896ffeeef32b9c950ywan    static int gtest_registering_dummy_; \
16964233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
16965233d2500723e5594f3e7c70896ffeeef32b9c950ywan        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
16966233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }; \
16967233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int GTEST_TEST_CLASS_NAME_(test_case_name, \
16968233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             test_name)::gtest_registering_dummy_ = \
16969233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
16970233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
16971233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16972233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
16973233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
16974233d2500723e5594f3e7c70896ffeeef32b9c950ywan      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
16975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int gtest_##prefix##test_case_name##_dummy_ = \
16976233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
16977233d2500723e5594f3e7c70896ffeeef32b9c950ywan          GetTestCasePatternHolder<test_case_name>(\
16978233d2500723e5594f3e7c70896ffeeef32b9c950ywan              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
16979233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  #prefix, \
16980233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
16981233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  __FILE__, __LINE__)
16982233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16983233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
16984233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16985233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_PARAM_TEST
16986233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16987233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
16988233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2006, Google Inc.
16989233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
16990233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16991233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
16992233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
16993233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
16994233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
16995233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
16996233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
16997233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
16998233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
16999233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
17000233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
17001233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
17002233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
17003233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
17004233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17005233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17006233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17007233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17008233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17009233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17010233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
17011233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17012233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
17013233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17014233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17015233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17016233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17017233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
17018233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17019233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google C++ Testing Framework definitions useful in production code.
17020233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17021233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17022233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17023233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17024233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When you need to test the private or protected members of a class,
17025233d2500723e5594f3e7c70896ffeeef32b9c950ywan// use the FRIEND_TEST macro to declare your tests as friends of the
17026233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class.  For example:
17027233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17028233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class MyClass {
17029233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  private:
17030233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void MyMethod();
17031233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   FRIEND_TEST(MyClassTest, MyMethod);
17032233d2500723e5594f3e7c70896ffeeef32b9c950ywan// };
17033233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17034233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class MyClassTest : public testing::Test {
17035233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // ...
17036233d2500723e5594f3e7c70896ffeeef32b9c950ywan// };
17037233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17038233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_F(MyClassTest, MyMethod) {
17039233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Can call MyClass::MyMethod() here.
17040233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
17041233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17042233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define FRIEND_TEST(test_case_name, test_name)\
17043233d2500723e5594f3e7c70896ffeeef32b9c950ywanfriend class test_case_name##_##test_name##_Test
17044233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17045233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
17046233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008, Google Inc.
17047233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
17048233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17049233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
17050233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
17051233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
17052233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17053233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
17054233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
17055233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
17056233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
17057233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
17058233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
17059233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
17060233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
17061233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
17062233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17063233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17064233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17065233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17066233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17067233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17068233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
17069233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17070233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
17071233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17072233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17073233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17074233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17075233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: mheule@google.com (Markus Heule)
17076233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17077233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17078233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17079233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17080233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17081233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <iosfwd>
17082233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <vector>
17083233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17084233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
17085233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17086233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A copyable object representing the result of a test part (i.e. an
17087233d2500723e5594f3e7c70896ffeeef32b9c950ywan// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
17088233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17089233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't inherit from TestPartResult as its destructor is not virtual.
17090233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TestPartResult {
17091233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17092233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The possible outcomes of a test part (i.e. an assertion or an
17093233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
17094233d2500723e5594f3e7c70896ffeeef32b9c950ywan  enum Type {
17095233d2500723e5594f3e7c70896ffeeef32b9c950ywan    kSuccess,          // Succeeded.
17096233d2500723e5594f3e7c70896ffeeef32b9c950ywan    kNonFatalFailure,  // Failed but the test can continue.
17097233d2500723e5594f3e7c70896ffeeef32b9c950ywan    kFatalFailure      // Failed and the test should be terminated.
17098233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
17099233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17100233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // C'tor.  TestPartResult does NOT have a default constructor.
17101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Always use this constructor (with parameters) to create a
17102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TestPartResult object.
17103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestPartResult(Type a_type,
17104233d2500723e5594f3e7c70896ffeeef32b9c950ywan                 const char* a_file_name,
17105233d2500723e5594f3e7c70896ffeeef32b9c950ywan                 int a_line_number,
17106233d2500723e5594f3e7c70896ffeeef32b9c950ywan                 const char* a_message)
17107233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : type_(a_type),
17108233d2500723e5594f3e7c70896ffeeef32b9c950ywan        file_name_(a_file_name == NULL ? "" : a_file_name),
17109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        line_number_(a_line_number),
17110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        summary_(ExtractSummary(a_message)),
17111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        message_(a_message) {
17112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17113233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the outcome of the test part.
17115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Type type() const { return type_; }
17116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the name of the source file where the test part took place, or
17118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NULL if it's unknown.
17119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* file_name() const {
17120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return file_name_.empty() ? NULL : file_name_.c_str();
17121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17122233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the line in the source file where the test part took place,
17124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // or -1 if it's unknown.
17125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int line_number() const { return line_number_; }
17126233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the summary of the failure message.
17128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* summary() const { return summary_.c_str(); }
17129233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the message associated with the test part.
17131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* message() const { return message_.c_str(); }
17132233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test part passed.
17134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool passed() const { return type_ == kSuccess; }
17135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test part failed.
17137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool failed() const { return type_ != kSuccess; }
17138233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test part non-fatally failed.
17140233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
17141233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17142233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test part fatally failed.
17143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool fatally_failed() const { return type_ == kFatalFailure; }
17144233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17145233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17146233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Type type_;
17147233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17148233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the summary of the failure message by omitting the stack
17149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // trace in it.
17150233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static std::string ExtractSummary(const char* message);
17151233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17152233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The name of the source file where the test part took place, or
17153233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // "" if the source file is unknown.
17154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string file_name_;
17155233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The line in the source file where the test part took place, or -1
17156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // if the line number is unknown.
17157233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int line_number_;
17158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string summary_;  // The test failure summary.
17159233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string message_;  // The test failure message.
17160233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17162233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Prints a TestPartResult object.
17163233d2500723e5594f3e7c70896ffeeef32b9c950ywanstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
17164233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17165233d2500723e5594f3e7c70896ffeeef32b9c950ywan// An array of TestPartResult objects.
17166233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17167233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't inherit from TestPartResultArray as its destructor is not
17168233d2500723e5594f3e7c70896ffeeef32b9c950ywan// virtual.
17169233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TestPartResultArray {
17170233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestPartResultArray() {}
17172233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Appends the given TestPartResult to the array.
17174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Append(const TestPartResult& result);
17175233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17176233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the TestPartResult at the given index (0-based).
17177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestPartResult& GetTestPartResult(int index) const;
17178233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the number of TestPartResult objects in the array.
17180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int size() const;
17181233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17182233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::vector<TestPartResult> array_;
17184233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
17186233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17187233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17188233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This interface knows how to report a test part result.
17189233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestPartResultReporterInterface {
17190233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~TestPartResultReporterInterface() {}
17192233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
17194233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17195233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17196233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
17197233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17198233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
17199233d2500723e5594f3e7c70896ffeeef32b9c950ywan// statement generates new fatal failures. To do so it registers itself as the
17200233d2500723e5594f3e7c70896ffeeef32b9c950ywan// current test part result reporter. Besides checking if fatal failures were
17201233d2500723e5594f3e7c70896ffeeef32b9c950ywan// reported, it only delegates the reporting to the former result reporter.
17202233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The original result reporter is restored in the destructor.
17203233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
17204233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ HasNewFatalFailureHelper
17205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    : public TestPartResultReporterInterface {
17206233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  HasNewFatalFailureHelper();
17208233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~HasNewFatalFailureHelper();
17209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void ReportTestPartResult(const TestPartResult& result);
17210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
17211233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool has_new_fatal_failure_;
17213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestPartResultReporterInterface* original_reporter_;
17214233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
17216233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17218233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
17219233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17220233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
17221233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17222233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
17223233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2008 Google Inc.
17224233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All Rights Reserved.
17225233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17226233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
17227233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
17228233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
17229233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17230233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
17231233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
17232233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
17233233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
17234233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
17235233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
17236233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
17237233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
17238233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
17239233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17240233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17241233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17242233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17243233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17244233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17245233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
17246233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17247233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
17248233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
17249233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17250233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17251233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17252233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Author: wan@google.com (Zhanyong Wan)
17253233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17254233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17255233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17256233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17257233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header implements typed tests and type-parameterized tests.
17258233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17259233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Typed (aka type-driven) tests repeat the same test for types in a
17260233d2500723e5594f3e7c70896ffeeef32b9c950ywan// list.  You must know which types you want to test with when writing
17261233d2500723e5594f3e7c70896ffeeef32b9c950ywan// typed tests. Here's how you do it:
17262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17263233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0
17264233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17265233d2500723e5594f3e7c70896ffeeef32b9c950ywan// First, define a fixture class template.  It should be parameterized
17266233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by a type.  Remember to derive it from testing::Test.
17267233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
17268233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FooTest : public testing::Test {
17269233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ...
17271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef std::list<T> List;
17272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static T shared_;
17273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  T value_;
17274233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17275233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17276233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Next, associate a list of types with the test case, which will be
17277233d2500723e5594f3e7c70896ffeeef32b9c950ywan// repeated for each type in the list.  The typedef is necessary for
17278233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the macro to parse correctly.
17279233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef testing::Types<char, int, unsigned int> MyTypes;
17280233d2500723e5594f3e7c70896ffeeef32b9c950ywanTYPED_TEST_CASE(FooTest, MyTypes);
17281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17282233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If the type list contains only one type, you can write that type
17283233d2500723e5594f3e7c70896ffeeef32b9c950ywan// directly without Types<...>:
17284233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TYPED_TEST_CASE(FooTest, int);
17285233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17286233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
17287233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tests for this test case as you want.
17288233d2500723e5594f3e7c70896ffeeef32b9c950ywanTYPED_TEST(FooTest, DoesBlah) {
17289233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Inside a test, refer to TypeParam to get the type parameter.
17290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Since we are inside a derived class template, C++ requires use to
17291233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // visit the members of FooTest via 'this'.
17292233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TypeParam n = this->value_;
17293233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17294233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // To visit static members of the fixture, add the TestFixture::
17295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // prefix.
17296233d2500723e5594f3e7c70896ffeeef32b9c950ywan  n += TestFixture::shared_;
17297233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // To refer to typedefs in the fixture, add the "typename
17299233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TestFixture::" prefix.
17300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typename TestFixture::List values;
17301233d2500723e5594f3e7c70896ffeeef32b9c950ywan  values.push_back(n);
17302233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ...
17303233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
17304233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17305233d2500723e5594f3e7c70896ffeeef32b9c950ywanTYPED_TEST(FooTest, HasPropertyA) { ... }
17306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17307233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // 0
17308233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17309233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Type-parameterized tests are abstract test patterns parameterized
17310233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by a type.  Compared with typed tests, type-parameterized tests
17311233d2500723e5594f3e7c70896ffeeef32b9c950ywan// allow you to define the test pattern without knowing what the type
17312233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parameters are.  The defined pattern can be instantiated with
17313233d2500723e5594f3e7c70896ffeeef32b9c950ywan// different types any number of times, in any number of translation
17314233d2500723e5594f3e7c70896ffeeef32b9c950ywan// units.
17315233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17316233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If you are designing an interface or concept, you can define a
17317233d2500723e5594f3e7c70896ffeeef32b9c950ywan// suite of type-parameterized tests to verify properties that any
17318233d2500723e5594f3e7c70896ffeeef32b9c950ywan// valid implementation of the interface/concept should have.  Then,
17319233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each implementation can easily instantiate the test suite to verify
17320233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that it conforms to the requirements, without having to write
17321233d2500723e5594f3e7c70896ffeeef32b9c950ywan// similar tests repeatedly.  Here's an example:
17322233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17323233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if 0
17324233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17325233d2500723e5594f3e7c70896ffeeef32b9c950ywan// First, define a fixture class template.  It should be parameterized
17326233d2500723e5594f3e7c70896ffeeef32b9c950ywan// by a type.  Remember to derive it from testing::Test.
17327233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
17328233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FooTest : public testing::Test {
17329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ...
17330233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17332233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Next, declare that you will define a type-parameterized test case
17333233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (the _P suffix is for "parameterized" or "pattern", whichever you
17334233d2500723e5594f3e7c70896ffeeef32b9c950ywan// prefer):
17335233d2500723e5594f3e7c70896ffeeef32b9c950ywanTYPED_TEST_CASE_P(FooTest);
17336233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17337233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Then, use TYPED_TEST_P() to define as many type-parameterized tests
17338233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for this type-parameterized test case as you want.
17339233d2500723e5594f3e7c70896ffeeef32b9c950ywanTYPED_TEST_P(FooTest, DoesBlah) {
17340233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Inside a test, refer to TypeParam to get the type parameter.
17341233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TypeParam n = 0;
17342233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ...
17343233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
17344233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17345233d2500723e5594f3e7c70896ffeeef32b9c950ywanTYPED_TEST_P(FooTest, HasPropertyA) { ... }
17346233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17347233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Now the tricky part: you need to register all test patterns before
17348233d2500723e5594f3e7c70896ffeeef32b9c950ywan// you can instantiate them.  The first argument of the macro is the
17349233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test case name; the rest are the names of the tests in this test
17350233d2500723e5594f3e7c70896ffeeef32b9c950ywan// case.
17351233d2500723e5594f3e7c70896ffeeef32b9c950ywanREGISTER_TYPED_TEST_CASE_P(FooTest,
17352233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           DoesBlah, HasPropertyA);
17353233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17354233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Finally, you are free to instantiate the pattern with the types you
17355233d2500723e5594f3e7c70896ffeeef32b9c950ywan// want.  If you put the above code in a header file, you can #include
17356233d2500723e5594f3e7c70896ffeeef32b9c950ywan// it in multiple C++ source files and instantiate it multiple times.
17357233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17358233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To distinguish different instances of the pattern, the first
17359233d2500723e5594f3e7c70896ffeeef32b9c950ywan// argument to the INSTANTIATE_* macro is a prefix that will be added
17360233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to the actual test case name.  Remember to pick unique prefixes for
17361233d2500723e5594f3e7c70896ffeeef32b9c950ywan// different instances.
17362233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef testing::Types<char, int, unsigned int> MyTypes;
17363233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
17364233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17365233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If the type list contains only one type, you can write that type
17366233d2500723e5594f3e7c70896ffeeef32b9c950ywan// directly without Types<...>:
17367233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
17368233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17369233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // 0
17370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17371233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17372233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements typed tests.
17373233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17374233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TYPED_TEST
17375233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17376233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17377233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17378233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Expands to the name of the typedef for the type parameters of the
17379233d2500723e5594f3e7c70896ffeeef32b9c950ywan// given test case.
17380233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
17381233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17382233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The 'Types' template argument below must have spaces around it
17383233d2500723e5594f3e7c70896ffeeef32b9c950ywan// since some compilers may choke on '>>' when passing a template
17384233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instance (e.g. Types<int>)
17385233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define TYPED_TEST_CASE(CaseName, Types) \
17386233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::testing::internal::TypeList< Types >::type \
17387233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_TYPE_PARAMS_(CaseName)
17388233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17389233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define TYPED_TEST(CaseName, TestName) \
17390233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename gtest_TypeParam_> \
17391233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
17392233d2500723e5594f3e7c70896ffeeef32b9c950ywan      : public CaseName<gtest_TypeParam_> { \
17393233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private: \
17394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef CaseName<gtest_TypeParam_> TestFixture; \
17395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef gtest_TypeParam_ TypeParam; \
17396233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void TestBody(); \
17397233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }; \
17398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
17399233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::internal::TypeParameterizedTest< \
17400233d2500723e5594f3e7c70896ffeeef32b9c950ywan          CaseName, \
17401233d2500723e5594f3e7c70896ffeeef32b9c950ywan          ::testing::internal::TemplateSel< \
17402233d2500723e5594f3e7c70896ffeeef32b9c950ywan              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
17403233d2500723e5594f3e7c70896ffeeef32b9c950ywan          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
17404233d2500723e5594f3e7c70896ffeeef32b9c950ywan              "", #CaseName, #TestName, 0); \
17405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename gtest_TypeParam_> \
17406233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
17407233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17408233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TYPED_TEST
17409233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17410233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements type-parameterized tests.
17411233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17412233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_TYPED_TEST_P
17413233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17414233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17415233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17416233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Expands to the namespace name that the type-parameterized tests for
17417233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the given type-parameterized test case are defined in.  The exact
17418233d2500723e5594f3e7c70896ffeeef32b9c950ywan// name of the namespace is subject to change without notice.
17419233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_CASE_NAMESPACE_(TestCaseName) \
17420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  gtest_case_##TestCaseName##_
17421233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17422233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
17423233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17424233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Expands to the name of the variable used to remember the names of
17425233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the defined tests in the given test case.
17426233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
17427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  gtest_typed_test_case_p_state_##TestCaseName##_
17428233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17429233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
17430233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17431233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Expands to the name of the variable used to remember the names of
17432233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the registered tests in the given test case.
17433233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
17434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  gtest_registered_test_names_##TestCaseName##_
17435233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17436233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The variables defined in the type-parameterized test macros are
17437233d2500723e5594f3e7c70896ffeeef32b9c950ywan// static as typically these macros are used in a .h file that can be
17438233d2500723e5594f3e7c70896ffeeef32b9c950ywan// #included in multiple translation units linked together.
17439233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define TYPED_TEST_CASE_P(CaseName) \
17440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static ::testing::internal::TypedTestCasePState \
17441233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
17442233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17443233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define TYPED_TEST_P(CaseName, TestName) \
17444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
17445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename gtest_TypeParam_> \
17446233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class TestName : public CaseName<gtest_TypeParam_> { \
17447233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private: \
17448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef CaseName<gtest_TypeParam_> TestFixture; \
17449233d2500723e5594f3e7c70896ffeeef32b9c950ywan    typedef gtest_TypeParam_ TypeParam; \
17450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    virtual void TestBody(); \
17451233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }; \
17452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
17453233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
17454233d2500723e5594f3e7c70896ffeeef32b9c950ywan          __FILE__, __LINE__, #CaseName, #TestName); \
17455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } \
17456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename gtest_TypeParam_> \
17457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
17458233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17459233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
17460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
17461233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
17462233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } \
17463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
17464233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
17465233d2500723e5594f3e7c70896ffeeef32b9c950ywan          __FILE__, __LINE__, #__VA_ARGS__)
17466233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17467233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The 'Types' template argument below must have spaces around it
17468233d2500723e5594f3e7c70896ffeeef32b9c950ywan// since some compilers may choke on '>>' when passing a template
17469233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instance (e.g. Types<int>)
17470233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
17471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
17472233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::testing::internal::TypeParameterizedTestCase<CaseName, \
17473233d2500723e5594f3e7c70896ffeeef32b9c950ywan          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
17474233d2500723e5594f3e7c70896ffeeef32b9c950ywan          ::testing::internal::TypeList< Types >::type>::Register(\
17475233d2500723e5594f3e7c70896ffeeef32b9c950ywan              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
17476233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17477233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_TYPED_TEST_P
17478233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17479233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
17480233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17481233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Depending on the platform, different string classes are available.
17482233d2500723e5594f3e7c70896ffeeef32b9c950ywan// On Linux, in addition to ::std::string, Google also makes use of
17483233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class ::string, which has the same interface as ::std::string, but
17484233d2500723e5594f3e7c70896ffeeef32b9c950ywan// has a different implementation.
17485233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17486233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
17487233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::string is available AND is a distinct type to ::std::string, or
17488233d2500723e5594f3e7c70896ffeeef32b9c950ywan// define it to 0 to indicate otherwise.
17489233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17490233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If the user's ::std::string and ::string are the same class due to
17491233d2500723e5594f3e7c70896ffeeef32b9c950ywan// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
17492233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17493233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
17494233d2500723e5594f3e7c70896ffeeef32b9c950ywan// heuristically.
17495233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17496233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace testing {
17497233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17498233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Declares the flags.
17499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17500233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag temporary enables the disabled tests.
17501233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(also_run_disabled_tests);
17502233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17503233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag brings the debugger on an assertion failure.
17504233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(break_on_failure);
17505233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17506233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag controls whether Google Test catches all test-thrown exceptions
17507233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and logs them as failures.
17508233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(catch_exceptions);
17509233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17510233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag enables using colors in terminal output. Available values are
17511233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
17512233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to let Google Test decide.
17513233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_string_(color);
17514233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17515233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag sets up the filter to select by name using a glob pattern
17516233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the tests to run. If the filter is not given all tests are executed.
17517233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_string_(filter);
17518233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17519233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag causes the Google Test to list tests. None of the tests listed
17520233d2500723e5594f3e7c70896ffeeef32b9c950ywan// are actually run if the flag is provided.
17521233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(list_tests);
17522233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17523233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag controls whether Google Test emits a detailed XML report to a file
17524233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in addition to its normal textual output.
17525233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_string_(output);
17526233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17527233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flags control whether Google Test prints the elapsed time for each
17528233d2500723e5594f3e7c70896ffeeef32b9c950ywan// test.
17529233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(print_time);
17530233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17531233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag specifies the random number seed.
17532233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_int32_(random_seed);
17533233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17534233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag sets how many times the tests are repeated. The default value
17535233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is 1. If the value is -1 the tests are repeating forever.
17536233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_int32_(repeat);
17537233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17538233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag controls whether Google Test includes Google Test internal
17539233d2500723e5594f3e7c70896ffeeef32b9c950ywan// stack frames in failure stack traces.
17540233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(show_internal_stack_frames);
17541233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17542233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When this flag is specified, tests' order is randomized on every iteration.
17543233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(shuffle);
17544233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17545233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This flag specifies the maximum number of stack frames to be
17546233d2500723e5594f3e7c70896ffeeef32b9c950ywan// printed in a failure message.
17547233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_int32_(stack_trace_depth);
17548233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17549233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When this flag is specified, a failed assertion will throw an
17550233d2500723e5594f3e7c70896ffeeef32b9c950ywan// exception if exceptions are enabled, or exit the program with a
17551233d2500723e5594f3e7c70896ffeeef32b9c950ywan// non-zero code otherwise.
17552233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_bool_(throw_on_failure);
17553233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17554233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When this flag is set with a "host:port" string, on supported
17555233d2500723e5594f3e7c70896ffeeef32b9c950ywan// platforms test results are streamed to the specified port on
17556233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the specified host machine.
17557233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_DECLARE_string_(stream_result_to);
17558233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17559233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The upper limit for valid stack trace depths.
17560233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst int kMaxStackTraceDepth = 100;
17561233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17562233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
17563233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17564233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass AssertHelper;
17565233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass DefaultGlobalTestPartResultReporter;
17566233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass ExecDeathTest;
17567233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass NoExecDeathTest;
17568233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FinalSuccessChecker;
17569233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTestFlagSaver;
17570233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass StreamingListenerTest;
17571233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestResultAccessor;
17572233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestEventListenersAccessor;
17573233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestEventRepeater;
17574233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UnitTestRecordPropertyTestHelper;
17575233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass WindowsDeathTest;
17576233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UnitTestImpl* GetUnitTestImpl();
17577233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
17578233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                    const std::string& message);
17579233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17580233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
17581233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17582233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The friend relationship of some of these classes is cyclic.
17583233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If we don't forward declare them the compiler might confuse the classes
17584233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in friendship clauses with same named classes on the scope.
17585233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Test;
17586233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestCase;
17587233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestInfo;
17588233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass UnitTest;
17589233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17590233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A class for indicating whether an assertion was successful.  When
17591233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the assertion wasn't successful, the AssertionResult object
17592233d2500723e5594f3e7c70896ffeeef32b9c950ywan// remembers a non-empty message that describes how it failed.
17593233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17594233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To create an instance of this class, use one of the factory functions
17595233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (AssertionSuccess() and AssertionFailure()).
17596233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17597233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This class is useful for two purposes:
17598233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   1. Defining predicate functions to be used with Boolean test assertions
17599233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
17600233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   2. Defining predicate-format functions to be
17601233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
17602233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17603233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For example, if you define IsEven predicate:
17604233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17605233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   testing::AssertionResult IsEven(int n) {
17606233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     if ((n % 2) == 0)
17607233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       return testing::AssertionSuccess();
17608233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     else
17609233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       return testing::AssertionFailure() << n << " is odd";
17610233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
17611233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17612233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
17613233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will print the message
17614233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17615233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Value of: IsEven(Fib(5))
17616233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Actual: false (5 is odd)
17617233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Expected: true
17618233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17619233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instead of a more opaque
17620233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17621233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Value of: IsEven(Fib(5))
17622233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Actual: false
17623233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Expected: true
17624233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17625233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in case IsEven is a simple Boolean predicate.
17626233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17627233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If you expect your predicate to be reused and want to support informative
17628233d2500723e5594f3e7c70896ffeeef32b9c950ywan// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
17629233d2500723e5594f3e7c70896ffeeef32b9c950ywan// about half as often as positive ones in our tests), supply messages for
17630233d2500723e5594f3e7c70896ffeeef32b9c950ywan// both success and failure cases:
17631233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17632233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   testing::AssertionResult IsEven(int n) {
17633233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     if ((n % 2) == 0)
17634233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       return testing::AssertionSuccess() << n << " is even";
17635233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     else
17636233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       return testing::AssertionFailure() << n << " is odd";
17637233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
17638233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17639233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
17640233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17641233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Value of: IsEven(Fib(6))
17642233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Actual: true (8 is even)
17643233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Expected: false
17644233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17645233d2500723e5594f3e7c70896ffeeef32b9c950ywan// NB: Predicates that support negative Boolean assertions have reduced
17646233d2500723e5594f3e7c70896ffeeef32b9c950ywan// performance in positive ones so be careful not to use them in tests
17647233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that have lots (tens of thousands) of positive Boolean assertions.
17648233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17649233d2500723e5594f3e7c70896ffeeef32b9c950ywan// To use this class with EXPECT_PRED_FORMAT assertions such as:
17650233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17651233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Verifies that Foo() returns an even number.
17652233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_PRED_FORMAT1(IsEven, Foo());
17653233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17654233d2500723e5594f3e7c70896ffeeef32b9c950ywan// you need to define:
17655233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17656233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   testing::AssertionResult IsEven(const char* expr, int n) {
17657233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     if ((n % 2) == 0)
17658233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       return testing::AssertionSuccess();
17659233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     else
17660233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       return testing::AssertionFailure()
17661233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
17662233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
17663233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17664233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If Foo() returns 5, you will see the following message:
17665233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17666233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Expected: Foo() is even
17667233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Actual: it's 5
17668233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17669233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ AssertionResult {
17670233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17671233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Copy constructor.
17672233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Used in EXPECT_TRUE/FALSE(assertion_result).
17673233d2500723e5594f3e7c70896ffeeef32b9c950ywan  AssertionResult(const AssertionResult& other);
17674233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Used in the EXPECT_TRUE/FALSE(bool_expression).
17675233d2500723e5594f3e7c70896ffeeef32b9c950ywan  explicit AssertionResult(bool success) : success_(success) {}
17676233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17677233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the assertion succeeded.
17678233d2500723e5594f3e7c70896ffeeef32b9c950ywan  operator bool() const { return success_; }  // NOLINT
17679233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17680233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
17681233d2500723e5594f3e7c70896ffeeef32b9c950ywan  AssertionResult operator!() const;
17682233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17683233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the text streamed into this AssertionResult. Test assertions
17684233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // use it when they fail (i.e., the predicate's outcome doesn't match the
17685233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // assertion's expectation). When nothing has been streamed into the
17686233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // object, returns an empty string.
17687233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* message() const {
17688233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return message_.get() != NULL ?  message_->c_str() : "";
17689233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17690233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TODO(vladl@google.com): Remove this after making sure no clients use it.
17691233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Deprecated; please use message() instead.
17692233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* failure_message() const { return message(); }
17693233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17694233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Streams a custom failure message into this object.
17695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T> AssertionResult& operator<<(const T& value) {
17696233d2500723e5594f3e7c70896ffeeef32b9c950ywan    AppendMessage(Message() << value);
17697233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
17698233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17699233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17700233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Allows streaming basic output manipulators such as endl or flush into
17701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // this object.
17702233d2500723e5594f3e7c70896ffeeef32b9c950ywan  AssertionResult& operator<<(
17703233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
17704233d2500723e5594f3e7c70896ffeeef32b9c950ywan    AppendMessage(Message() << basic_manipulator);
17705233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *this;
17706233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17707233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17708233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17709233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Appends the contents of message to message_.
17710233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AppendMessage(const Message& a_message) {
17711233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (message_.get() == NULL)
17712233d2500723e5594f3e7c70896ffeeef32b9c950ywan      message_.reset(new ::std::string);
17713233d2500723e5594f3e7c70896ffeeef32b9c950ywan    message_->append(a_message.GetString().c_str());
17714233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17715233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17716233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Stores result of the assertion predicate.
17717233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool success_;
17718233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Stores the message describing the condition in case the expectation
17719233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // construct is not satisfied with the predicate's outcome.
17720233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Referenced via a pointer to avoid taking too much stack frame space
17721233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // with test assertions.
17722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::scoped_ptr< ::std::string> message_;
17723233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17724233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_ASSIGN_(AssertionResult);
17725233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17726233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17727233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Makes a successful assertion result.
17728233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult AssertionSuccess();
17729233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17730233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Makes a failed assertion result.
17731233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult AssertionFailure();
17732233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17733233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Makes a failed assertion result with the given failure message.
17734233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Deprecated; use AssertionFailure() << msg.
17735233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult AssertionFailure(const Message& msg);
17736233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17737233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The abstract class that all tests inherit from.
17738233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17739233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In Google Test, a unit test program contains one or many TestCases, and
17740233d2500723e5594f3e7c70896ffeeef32b9c950ywan// each TestCase contains one or many Tests.
17741233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17742233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When you define a test using the TEST macro, you don't need to
17743233d2500723e5594f3e7c70896ffeeef32b9c950ywan// explicitly derive from Test - the TEST macro automatically does
17744233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this for you.
17745233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17746233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The only time you derive from Test is when defining a test fixture
17747233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to be used a TEST_F.  For example:
17748233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17749233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   class FooTest : public testing::Test {
17750233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    protected:
17751233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     virtual void SetUp() { ... }
17752233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     virtual void TearDown() { ... }
17753233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     ...
17754233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   };
17755233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17756233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TEST_F(FooTest, Bar) { ... }
17757233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TEST_F(FooTest, Baz) { ... }
17758233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17759233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Test is not copyable.
17760233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ Test {
17761233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17762233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class TestInfo;
17763233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17764233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Defines types for pointers to functions that set up and tear down
17765233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // a test case.
17766233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
17767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
17768233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17769233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The d'tor is virtual as we intend to inherit from Test.
17770233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~Test();
17771233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets up the stuff shared by all tests in this test case.
17773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17774233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Google Test will call Foo::SetUpTestCase() before running the first
17775233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test in test case Foo.  Hence a sub-class can define its own
17776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // SetUpTestCase() method to shadow the one defined in the super
17777233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // class.
17778233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void SetUpTestCase() {}
17779233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17780233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Tears down the stuff shared by all tests in this test case.
17781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17782233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Google Test will call Foo::TearDownTestCase() after running the last
17783233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test in test case Foo.  Hence a sub-class can define its own
17784233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TearDownTestCase() method to shadow the one defined in the super
17785233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // class.
17786233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void TearDownTestCase() {}
17787233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17788233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the current test has a fatal failure.
17789233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool HasFatalFailure();
17790233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17791233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the current test has a non-fatal failure.
17792233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool HasNonfatalFailure();
17793233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17794233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the current test has a (either fatal or
17795233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // non-fatal) failure.
17796233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
17797233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17798233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Logs a property for the current test, test case, or for the entire
17799233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // invocation of the test program when used outside of the context of a
17800233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test case.  Only the last value for a given key is remembered.  These
17801233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // are public static so they can be called from utility functions that are
17802233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // not members of the test fixture.  Calls to RecordProperty made during
17803233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // lifespan of the test (from the moment its constructor starts to the
17804233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // moment its destructor finishes) will be output in XML as attributes of
17805233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the <testcase> element.  Properties recorded from fixture's
17806233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // SetUpTestCase or TearDownTestCase are logged as attributes of the
17807233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // corresponding <testsuite> element.  Calls to RecordProperty made in the
17808233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // global context (before or after invocation of RUN_ALL_TESTS and from
17809233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // SetUp/TearDown method of Environment objects registered with Google
17810233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Test) will be output as attributes of the <testsuites> element.
17811233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void RecordProperty(const std::string& key, const std::string& value);
17812233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void RecordProperty(const std::string& key, int value);
17813233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17814233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected:
17815233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates a Test object.
17816233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Test();
17817233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17818233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets up the test fixture.
17819233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void SetUp();
17820233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17821233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Tears down the test fixture.
17822233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TearDown();
17823233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17824233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17825233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the current test has the same fixture class as
17826233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the first test in the current test case.
17827233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool HasSameFixtureClass();
17828233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17829233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Runs the test after the test fixture has been set up.
17830233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17831233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A sub-class must implement this to define the test logic.
17832233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17833233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
17834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Instead, use the TEST or TEST_F macro.
17835233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TestBody() = 0;
17836233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17837233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets up, executes, and tears down the test.
17838233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Run();
17839233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17840233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Deletes self.  We deliberately pick an unusual name for this
17841233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // internal method to avoid clashing with names used in user TESTs.
17842233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void DeleteSelf_() { delete this; }
17843233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17844233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Uses a GTestFlagSaver to save and restore all Google Test flags.
17845233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::GTestFlagSaver* const gtest_flag_saver_;
17846233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17847233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Often a user mis-spells SetUp() as Setup() and spends a long time
17848233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // wondering why it is never called by Google Test.  The declaration of
17849233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the following method is solely for catching such an error at
17850233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // compile time:
17851233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17852233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   - The return type is deliberately chosen to be not void, so it
17853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   will be a conflict if a user declares void Setup() in his test
17854233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   fixture.
17855233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17856233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   - This method is private, so it will be another compiler error
17857233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   if a user calls it from his test fixture.
17858233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17859233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // DO NOT OVERRIDE THIS FUNCTION.
17860233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
17861233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If you see an error about overriding the following function or
17862233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // about it being private, you have mis-spelled SetUp() as Setup().
17863233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct Setup_should_be_spelled_SetUp {};
17864233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
17865233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17866233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We disallow copying Tests.
17867233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
17868233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17869233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17870233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef internal::TimeInMillis TimeInMillis;
17871233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17872233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A copyable object representing a user specified test property which can be
17873233d2500723e5594f3e7c70896ffeeef32b9c950ywan// output as a key/value string pair.
17874233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17875233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't inherit from TestProperty as its destructor is not virtual.
17876233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestProperty {
17877233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17878233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // C'tor.  TestProperty does NOT have a default constructor.
17879233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Always use this constructor (with parameters) to create a
17880233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TestProperty object.
17881233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestProperty(const std::string& a_key, const std::string& a_value) :
17882233d2500723e5594f3e7c70896ffeeef32b9c950ywan    key_(a_key), value_(a_value) {
17883233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17884233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17885233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the user supplied key.
17886233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* key() const {
17887233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return key_.c_str();
17888233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17889233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17890233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the user supplied value.
17891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* value() const {
17892233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return value_.c_str();
17893233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17894233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17895233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets a new value, overriding the one supplied in the constructor.
17896233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void SetValue(const std::string& new_value) {
17897233d2500723e5594f3e7c70896ffeeef32b9c950ywan    value_ = new_value;
17898233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17899233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17900233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The key supplied by the user.
17902233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string key_;
17903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The value supplied by the user.
17904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string value_;
17905233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
17906233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17907233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The result of a single Test.  This includes a list of
17908233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestPartResults, a list of TestProperties, a count of how many
17909233d2500723e5594f3e7c70896ffeeef32b9c950ywan// death tests there are in the Test, and how much time it took to run
17910233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the Test.
17911233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
17912233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestResult is not copyable.
17913233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TestResult {
17914233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
17915233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates an empty TestResult.
17916233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestResult();
17917233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17918233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // D'tor.  Do not inherit from TestResult.
17919233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~TestResult();
17920233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17921233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of all test parts.  This is the sum of the number
17922233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // of successful test parts and the number of failed test parts.
17923233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int total_part_count() const;
17924233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17925233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the number of the test properties.
17926233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int test_property_count() const;
17927233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17928233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test passed (i.e. no test part failed).
17929233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool Passed() const { return !Failed(); }
17930233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17931233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test failed.
17932233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool Failed() const;
17933233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17934233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test fatally failed.
17935233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool HasFatalFailure() const;
17936233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17937233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test has a non-fatal failure.
17938233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool HasNonfatalFailure() const;
17939233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17940233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the elapsed time, in milliseconds.
17941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TimeInMillis elapsed_time() const { return elapsed_time_; }
17942233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17943233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the i-th test part result among all the results. i can range
17944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // from 0 to test_property_count() - 1. If i is not in that range, aborts
17945233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the program.
17946233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestPartResult& GetTestPartResult(int i) const;
17947233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17948233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the i-th test property. i can range from 0 to
17949233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test_property_count() - 1. If i is not in that range, aborts the
17950233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // program.
17951233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestProperty& GetTestProperty(int i) const;
17952233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17953233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
17954233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class TestInfo;
17955233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class TestCase;
17956233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class UnitTest;
17957233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::DefaultGlobalTestPartResultReporter;
17958233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::ExecDeathTest;
17959233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::TestResultAccessor;
17960233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::UnitTestImpl;
17961233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::WindowsDeathTest;
17962233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the vector of TestPartResults.
17964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::vector<TestPartResult>& test_part_results() const {
17965233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_part_results_;
17966233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17967233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17968233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the vector of TestProperties.
17969233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::vector<TestProperty>& test_properties() const {
17970233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_properties_;
17971233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
17972233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17973233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets the elapsed time.
17974233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
17975233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds a test property to the list. The property is validated and may add
17977233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
17978233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // key names). If a property is already recorded for the same key, the
17979233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // value will be updated, rather than storing multiple values for the same
17980233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // key.  xml_element specifies the element for which the property is being
17981233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // recorded and is used for validation.
17982233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RecordProperty(const std::string& xml_element,
17983233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      const TestProperty& test_property);
17984233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17985233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds a failure if the key is a reserved attribute of Google Test
17986233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // testcase tags.  Returns true if the property is valid.
17987233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TODO(russr): Validate attribute names are legal and human readable.
17988233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool ValidateTestProperty(const std::string& xml_element,
17989233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                   const TestProperty& test_property);
17990233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17991233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds a test part result to the list.
17992233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AddTestPartResult(const TestPartResult& test_part_result);
17993233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17994233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the death test count.
17995233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int death_test_count() const { return death_test_count_; }
17996233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17997233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Increments the death test count, returning the new count.
17998233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int increment_death_test_count() { return ++death_test_count_; }
17999233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18000233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clears the test part results.
18001233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void ClearTestPartResults();
18002233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18003233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clears the object.
18004233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Clear();
18005233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18006233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Protects mutable state of the property vector and of owned
18007233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // properties, whose values may be updated.
18008233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::Mutex test_properites_mutex_;
18009233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18010233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The vector of TestPartResults
18011233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::vector<TestPartResult> test_part_results_;
18012233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The vector of TestProperties
18013233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::vector<TestProperty> test_properties_;
18014233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Running count of death tests.
18015233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int death_test_count_;
18016233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The elapsed time, in milliseconds.
18017233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TimeInMillis elapsed_time_;
18018233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18019233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We disallow copying TestResult.
18020233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
18021233d2500723e5594f3e7c70896ffeeef32b9c950ywan};  // class TestResult
18022233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18023233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A TestInfo object stores the following information about a test:
18024233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18025233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Test case name
18026233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Test name
18027233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Whether the test should be run
18028233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   A function pointer that creates the test object when invoked
18029233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Test result
18030233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18031233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The constructor of TestInfo registers itself with the UnitTest
18032233d2500723e5594f3e7c70896ffeeef32b9c950ywan// singleton such that the RUN_ALL_TESTS() macro knows which tests to
18033233d2500723e5594f3e7c70896ffeeef32b9c950ywan// run.
18034233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TestInfo {
18035233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Destructs a TestInfo object.  This function is not virtual, so
18037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // don't inherit from TestInfo.
18038233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~TestInfo();
18039233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the test case name.
18041233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* test_case_name() const { return test_case_name_.c_str(); }
18042233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18043233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the test name.
18044233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* name() const { return name_.c_str(); }
18045233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18046233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the name of the parameter type, or NULL if this is not a typed
18047233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // or a type-parameterized test.
18048233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* type_param() const {
18049233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (type_param_.get() != NULL)
18050233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return type_param_->c_str();
18051233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return NULL;
18052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18053233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18054233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the text representation of the value parameter, or NULL if this
18055233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // is not a value-parameterized test.
18056233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* value_param() const {
18057233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (value_param_.get() != NULL)
18058233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return value_param_->c_str();
18059233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return NULL;
18060233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18061233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18062233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if this test should run, that is if the test is not
18063233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // disabled (or it is disabled but the also_run_disabled_tests flag has
18064233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // been specified) and its full name matches the user-specified filter.
18065233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18066233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Google Test allows the user to filter the tests by their full names.
18067233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The full name of a test Bar in test case Foo is defined as
18068233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // "Foo.Bar".  Only the tests that match the filter will run.
18069233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18070233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // A filter is a colon-separated list of glob (not regex) patterns,
18071233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // optionally followed by a '-' and a colon-separated list of
18072233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // negative patterns (tests to exclude).  A test is run if it
18073233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // matches one of the positive patterns and does not match any of
18074233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the negative patterns.
18075233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18076233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // For example, *A*:Foo.* is a filter that matches any string that
18077233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // contains the character 'A' or starts with "Foo.".
18078233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool should_run() const { return should_run_; }
18079233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18080233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff this test will appear in the XML report.
18081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool is_reportable() const {
18082233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // For now, the XML report includes all tests matching the filter.
18083233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // In the future, we may trim tests that are excluded because of
18084233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // sharding.
18085233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return matches_filter_;
18086233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18087233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18088233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the result of the test.
18089233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestResult* result() const { return &result_; }
18090233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18091233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
18092233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_DEATH_TEST
18093233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::DefaultDeathTestFactory;
18094233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_DEATH_TEST
18095233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class Test;
18096233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class TestCase;
18097233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::UnitTestImpl;
18098233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::StreamingListenerTest;
18099233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend TestInfo* internal::MakeAndRegisterTestInfo(
18100233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* test_case_name,
18101233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* name,
18102233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* type_param,
18103233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* value_param,
18104233d2500723e5594f3e7c70896ffeeef32b9c950ywan      internal::TypeId fixture_class_id,
18105233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Test::SetUpTestCaseFunc set_up_tc,
18106233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Test::TearDownTestCaseFunc tear_down_tc,
18107233d2500723e5594f3e7c70896ffeeef32b9c950ywan      internal::TestFactoryBase* factory);
18108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18109233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructs a TestInfo object. The newly constructed instance assumes
18110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ownership of the factory object.
18111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestInfo(const std::string& test_case_name,
18112233d2500723e5594f3e7c70896ffeeef32b9c950ywan           const std::string& name,
18113233d2500723e5594f3e7c70896ffeeef32b9c950ywan           const char* a_type_param,   // NULL if not a type-parameterized test
18114233d2500723e5594f3e7c70896ffeeef32b9c950ywan           const char* a_value_param,  // NULL if not a value-parameterized test
18115233d2500723e5594f3e7c70896ffeeef32b9c950ywan           internal::TypeId fixture_class_id,
18116233d2500723e5594f3e7c70896ffeeef32b9c950ywan           internal::TestFactoryBase* factory);
18117233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Increments the number of death tests encountered in this test so
18119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // far.
18120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int increment_death_test_count() {
18121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return result_.increment_death_test_count();
18122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates the test object, runs it, records its result, and then
18125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // deletes it.
18126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Run();
18127233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void ClearTestResult(TestInfo* test_info) {
18129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    test_info->result_.Clear();
18130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18132233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // These fields are immutable properties of the test.
18133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::string test_case_name_;     // Test case name
18134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::string name_;               // Test name
18135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Name of the parameter type, or NULL if this is not a typed or a
18136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // type-parameterized test.
18137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::scoped_ptr<const ::std::string> type_param_;
18138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Text representation of the value parameter, or NULL if this is not a
18139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // value-parameterized test.
18140233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::scoped_ptr<const ::std::string> value_param_;
18141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
18142233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool should_run_;                 // True iff this test should run
18143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool is_disabled_;                // True iff this test is disabled
18144233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool matches_filter_;             // True if this test matches the
18145233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                    // user-specified filter.
18146233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::TestFactoryBase* const factory_;  // The factory that creates
18147233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              // the test object
18148233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This field is mutable and needs to be reset before running the
18150233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // test for the second time.
18151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestResult result_;
18152233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18153233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
18154233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18155233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18156233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A test case, which consists of a vector of TestInfos.
18157233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18158233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestCase is not copyable.
18159233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TestCase {
18160233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates a TestCase with the given name.
18162233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TestCase does NOT have a default constructor.  Always use this
18164233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // constructor to create a TestCase object.
18165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18166233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Arguments:
18167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   name:         name of the test case
18169233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   a_type_param: the name of the test's type parameter, or NULL if
18170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //                 this is not a type-parameterized test.
18171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   set_up_tc:    pointer to the function that sets up the test case
18172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //   tear_down_tc: pointer to the function that tears down the test case
18173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestCase(const char* name, const char* a_type_param,
18174233d2500723e5594f3e7c70896ffeeef32b9c950ywan           Test::SetUpTestCaseFunc set_up_tc,
18175233d2500723e5594f3e7c70896ffeeef32b9c950ywan           Test::TearDownTestCaseFunc tear_down_tc);
18176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Destructor of TestCase.
18178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~TestCase();
18179233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the name of the TestCase.
18181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* name() const { return name_.c_str(); }
18182233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the name of the parameter type, or NULL if this is not a
18184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // type-parameterized test case.
18185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* type_param() const {
18186233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (type_param_.get() != NULL)
18187233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return type_param_->c_str();
18188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return NULL;
18189233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18190233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if any test in this test case should run.
18192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool should_run() const { return should_run_; }
18193233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of successful tests in this test case.
18195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int successful_test_count() const;
18196233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18197233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of failed tests in this test case.
18198233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int failed_test_count() const;
18199233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18200233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of disabled tests that will be reported in the XML report.
18201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int reportable_disabled_test_count() const;
18202233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of disabled tests in this test case.
18204233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int disabled_test_count() const;
18205233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18206233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of tests to be printed in the XML report.
18207233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int reportable_test_count() const;
18208233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18209233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Get the number of tests in this test case that should run.
18210233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int test_to_run_count() const;
18211233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18212233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of all tests in this test case.
18213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int total_test_count() const;
18214233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test case passed.
18216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool Passed() const { return !Failed(); }
18217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test case failed.
18219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool Failed() const { return failed_test_count() > 0; }
18220233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the elapsed time, in milliseconds.
18222233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TimeInMillis elapsed_time() const { return elapsed_time_; }
18223233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18224233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the i-th test among all the tests. i can range from 0 to
18225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // total_test_count() - 1. If i is not in that range, returns NULL.
18226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestInfo* GetTestInfo(int i) const;
18227233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the TestResult that holds test properties recorded during
18229233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // execution of SetUpTestCase and TearDownTestCase.
18230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
18231233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18232233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
18233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class Test;
18234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::UnitTestImpl;
18235233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the (mutable) vector of TestInfos in this TestCase.
18237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
18238233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18239233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the (immutable) vector of TestInfos in this TestCase.
18240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const std::vector<TestInfo*>& test_info_list() const {
18241233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info_list_;
18242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18243233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18244233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the i-th test among all the tests. i can range from 0 to
18245233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // total_test_count() - 1. If i is not in that range, returns NULL.
18246233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestInfo* GetMutableTestInfo(int i);
18247233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18248233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets the should_run member.
18249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void set_should_run(bool should) { should_run_ = should; }
18250233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
18252233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // destruction of the TestCase object.
18253233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AddTestInfo(TestInfo * test_info);
18254233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clears the results of all tests in this test case.
18256233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void ClearResult();
18257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18258233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clears the results of all tests in the given test case.
18259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void ClearTestCaseResult(TestCase* test_case) {
18260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    test_case->ClearResult();
18261233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18263233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Runs every test in this TestCase.
18264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Run();
18265233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
18267233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // for catching exceptions thrown from SetUpTestCase().
18268233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RunSetUpTestCase() { (*set_up_tc_)(); }
18269233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Runs TearDownTestCase() for this TestCase.  This wrapper is
18271233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // needed for catching exceptions thrown from TearDownTestCase().
18272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RunTearDownTestCase() { (*tear_down_tc_)(); }
18273233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff test passed.
18275233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool TestPassed(const TestInfo* test_info) {
18276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info->should_run() && test_info->result()->Passed();
18277233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18278233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff test failed.
18280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool TestFailed(const TestInfo* test_info) {
18281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info->should_run() && test_info->result()->Failed();
18282233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18283233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the test is disabled and will be reported in the XML
18285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // report.
18286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool TestReportableDisabled(const TestInfo* test_info) {
18287233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info->is_reportable() && test_info->is_disabled_;
18288233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18289233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff test is disabled.
18291233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool TestDisabled(const TestInfo* test_info) {
18292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info->is_disabled_;
18293233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18294233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff this test will appear in the XML report.
18296233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool TestReportable(const TestInfo* test_info) {
18297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info->is_reportable();
18298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18299233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true if the given test should run.
18301233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static bool ShouldRunTest(const TestInfo* test_info) {
18302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return test_info->should_run();
18303233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18304233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Shuffles the tests in this test case.
18306233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void ShuffleTests(internal::Random* random);
18307233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Restores the test order to before the first shuffle.
18309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void UnshuffleTests();
18310233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18311233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Name of the test case.
18312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::string name_;
18313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Name of the parameter type, or NULL if this is not a typed or a
18314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // type-parameterized test.
18315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::scoped_ptr<const ::std::string> type_param_;
18316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The vector of TestInfos in their original order.  It owns the
18317233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // elements in the vector.
18318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::vector<TestInfo*> test_info_list_;
18319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Provides a level of indirection for the test list to allow easy
18320233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // shuffling and restoring the test order.  The i-th element in this
18321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // vector is the index of the i-th test in the shuffled test list.
18322233d2500723e5594f3e7c70896ffeeef32b9c950ywan  std::vector<int> test_indices_;
18323233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Pointer to the function that sets up the test case.
18324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Test::SetUpTestCaseFunc set_up_tc_;
18325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Pointer to the function that tears down the test case.
18326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Test::TearDownTestCaseFunc tear_down_tc_;
18327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // True iff any test in this test case should run.
18328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool should_run_;
18329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Elapsed time, in milliseconds.
18330233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TimeInMillis elapsed_time_;
18331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Holds test properties recorded during execution of SetUpTestCase and
18332233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TearDownTestCase.
18333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestResult ad_hoc_test_result_;
18334233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We disallow copying TestCases.
18336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
18337233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18338233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18339233d2500723e5594f3e7c70896ffeeef32b9c950ywan// An Environment object is capable of setting up and tearing down an
18340233d2500723e5594f3e7c70896ffeeef32b9c950ywan// environment.  The user should subclass this to define his own
18341233d2500723e5594f3e7c70896ffeeef32b9c950ywan// environment(s).
18342233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18343233d2500723e5594f3e7c70896ffeeef32b9c950ywan// An Environment object does the set-up and tear-down in virtual
18344233d2500723e5594f3e7c70896ffeeef32b9c950ywan// methods SetUp() and TearDown() instead of the constructor and the
18345233d2500723e5594f3e7c70896ffeeef32b9c950ywan// destructor, as:
18346233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18347233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   1. You cannot safely throw from a destructor.  This is a problem
18348233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      as in some cases Google Test is used where exceptions are enabled, and
18349233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      we may want to implement ASSERT_* using exceptions where they are
18350233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      available.
18351233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   2. You cannot use ASSERT_* directly in a constructor or
18352233d2500723e5594f3e7c70896ffeeef32b9c950ywan//      destructor.
18353233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass Environment {
18354233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18355233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The d'tor is virtual as we need to subclass Environment.
18356233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~Environment() {}
18357233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Override this to define how to set up the environment.
18359233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void SetUp() {}
18360233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Override this to define how to tear down the environment.
18362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void TearDown() {}
18363233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
18364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If you see an error about overriding the following function or
18365233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // about it being private, you have mis-spelled SetUp() as Setup().
18366233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct Setup_should_be_spelled_SetUp {};
18367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
18368233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18369233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18370233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The interface for tracing execution of tests. The methods are organized in
18371233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the order the corresponding events are fired.
18372233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestEventListener {
18373233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18374233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~TestEventListener() {}
18375233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18376233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired before any test activity starts.
18377233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
18378233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18379233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired before each iteration of tests starts.  There may be more than
18380233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
18381233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // index, starting from 0.
18382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestIterationStart(const UnitTest& unit_test,
18383233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                    int iteration) = 0;
18384233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired before environment set-up for each iteration of tests starts.
18386233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
18387233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18388233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after environment set-up for each iteration of tests ends.
18389233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
18390233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18391233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired before the test case starts.
18392233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
18393233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18394233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired before the test starts.
18395233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestStart(const TestInfo& test_info) = 0;
18396233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18397233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after a failed assertion or a SUCCEED() invocation.
18398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
18399233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18400233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after the test ends.
18401233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestEnd(const TestInfo& test_info) = 0;
18402233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18403233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after the test case ends.
18404233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
18405233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18406233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired before environment tear-down for each iteration of tests starts.
18407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
18408233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18409233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after environment tear-down for each iteration of tests ends.
18410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
18411233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after each iteration of tests finishes.
18413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestIterationEnd(const UnitTest& unit_test,
18414233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  int iteration) = 0;
18415233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18416233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Fired after all test activities have ended.
18417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
18418233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18419233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18420233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The convenience class for users who need to override just one or two
18421233d2500723e5594f3e7c70896ffeeef32b9c950ywan// methods and are not concerned that a possible change to a signature of
18422233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the methods they override will not be caught during the build.  For
18423233d2500723e5594f3e7c70896ffeeef32b9c950ywan// comments about each method please see the definition of TestEventListener
18424233d2500723e5594f3e7c70896ffeeef32b9c950ywan// above.
18425233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass EmptyTestEventListener : public TestEventListener {
18426233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18427233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
18428233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
18429233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                    int /*iteration*/) {}
18430233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
18431233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
18432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
18433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
18434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
18435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
18436233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
18437233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
18438233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
18439233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
18440233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  int /*iteration*/) {}
18441233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
18442233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18443233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18444233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TestEventListeners lets users add listeners to track events in Google Test.
18445233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ TestEventListeners {
18446233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18447233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListeners();
18448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~TestEventListeners();
18449233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Appends an event listener to the end of the list. Google Test assumes
18451233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the ownership of the listener (i.e. it will delete the listener when
18452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the test program finishes).
18453233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void Append(TestEventListener* listener);
18454233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Removes the given event listener from the list and returns it.  It then
18456233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // becomes the caller's responsibility to delete the listener. Returns
18457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NULL if the listener is not found in the list.
18458233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListener* Release(TestEventListener* listener);
18459233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the standard listener responsible for the default console
18461233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // output.  Can be removed from the listeners list to shut down default
18462233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // console output.  Note that removing this object from the listener list
18463233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // with Release transfers its ownership to the caller and makes this
18464233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // function return NULL the next time.
18465233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListener* default_result_printer() const {
18466233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return default_result_printer_;
18467233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18468233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18469233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the standard listener responsible for the default XML output
18470233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // controlled by the --gtest_output=xml flag.  Can be removed from the
18471233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // listeners list by users who want to shut down the default XML output
18472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // controlled by this flag and substitute it with custom one.  Note that
18473233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // removing this object from the listener list with Release transfers its
18474233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ownership to the caller and makes this function return NULL the next
18475233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // time.
18476233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListener* default_xml_generator() const {
18477233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return default_xml_generator_;
18478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18479233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18480233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
18481233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class TestCase;
18482233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class TestInfo;
18483233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::DefaultGlobalTestPartResultReporter;
18484233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::NoExecDeathTest;
18485233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::TestEventListenersAccessor;
18486233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::UnitTestImpl;
18487233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18488233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns repeater that broadcasts the TestEventListener events to all
18489233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // subscribers.
18490233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListener* repeater();
18491233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18492233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets the default_result_printer attribute to the provided listener.
18493233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The listener is also added to the listener list and previous
18494233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // default_result_printer is removed from it and deleted. The listener can
18495233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // also be NULL in which case it will not be added to the list. Does
18496233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // nothing if the previous and the current listener objects are the same.
18497233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void SetDefaultResultPrinter(TestEventListener* listener);
18498233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18499233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets the default_xml_generator attribute to the provided listener.  The
18500233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // listener is also added to the listener list and previous
18501233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // default_xml_generator is removed from it and deleted. The listener can
18502233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // also be NULL in which case it will not be added to the list. Does
18503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // nothing if the previous and the current listener objects are the same.
18504233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void SetDefaultXmlGenerator(TestEventListener* listener);
18505233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18506233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Controls whether events will be forwarded by the repeater to the
18507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // listeners in the list.
18508233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool EventForwardingEnabled() const;
18509233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void SuppressEventForwarding();
18510233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18511233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The actual list of listeners.
18512233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::TestEventRepeater* repeater_;
18513233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Listener responsible for the standard result output.
18514233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListener* default_result_printer_;
18515233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Listener responsible for the creation of the XML output file.
18516233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListener* default_xml_generator_;
18517233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18518233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We disallow copying TestEventListeners.
18519233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
18520233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18521233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18522233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A UnitTest consists of a vector of TestCases.
18523233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18524233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This is a singleton class.  The only instance of UnitTest is
18525233d2500723e5594f3e7c70896ffeeef32b9c950ywan// created when UnitTest::GetInstance() is first called.  This
18526233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instance is never deleted.
18527233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18528233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UnitTest is not copyable.
18529233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18530233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This class is thread-safe as long as the methods are called
18531233d2500723e5594f3e7c70896ffeeef32b9c950ywan// according to their specification.
18532233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ UnitTest {
18533233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18534233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the singleton UnitTest object.  The first time this method
18535233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // is called, a UnitTest object is constructed and returned.
18536233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Consecutive calls will return the same object.
18537233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static UnitTest* GetInstance();
18538233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18539233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Runs all tests in this UnitTest object and prints the result.
18540233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns 0 if successful, or 1 otherwise.
18541233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18542233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This method can only be called from the main thread.
18543233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18544233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18545233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int Run() GTEST_MUST_USE_RESULT_;
18546233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18547233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the working directory when the first TEST() or TEST_F()
18548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // was executed.  The UnitTest object owns the string.
18549233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const char* original_working_dir() const;
18550233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18551233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the TestCase object for the test that's currently running,
18552233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // or NULL if no test is running.
18553233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestCase* current_test_case() const
18554233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(mutex_);
18555233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18556233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the TestInfo object for the test that's currently running,
18557233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // or NULL if no test is running.
18558233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestInfo* current_test_info() const
18559233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(mutex_);
18560233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18561233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the random seed used at the start of the current test run.
18562233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int random_seed() const;
18563233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18564233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PARAM_TEST
18565233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the ParameterizedTestCaseRegistry object used to keep track of
18566233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // value-parameterized tests and instantiate and register them.
18567233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18568233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18569233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
18570233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(mutex_);
18571233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_PARAM_TEST
18572233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18573233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of successful test cases.
18574233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int successful_test_case_count() const;
18575233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18576233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of failed test cases.
18577233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int failed_test_case_count() const;
18578233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of all test cases.
18580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int total_test_case_count() const;
18581233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of all test cases that contain at least one test
18583233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // that should run.
18584233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int test_case_to_run_count() const;
18585233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18586233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of successful tests.
18587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int successful_test_count() const;
18588233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18589233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of failed tests.
18590233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int failed_test_count() const;
18591233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of disabled tests that will be reported in the XML report.
18593233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int reportable_disabled_test_count() const;
18594233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18595233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of disabled tests.
18596233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int disabled_test_count() const;
18597233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of tests to be printed in the XML report.
18599233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int reportable_test_count() const;
18600233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of all tests.
18602233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int total_test_count() const;
18603233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18604233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the number of tests that should run.
18605233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int test_to_run_count() const;
18606233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18607233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the time of the test program start, in ms from the start of the
18608233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // UNIX epoch.
18609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TimeInMillis start_timestamp() const;
18610233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18611233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the elapsed time, in milliseconds.
18612233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TimeInMillis elapsed_time() const;
18613233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18614233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the unit test passed (i.e. all test cases passed).
18615233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool Passed() const;
18616233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18617233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns true iff the unit test failed (i.e. some test case failed
18618233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // or something outside of all tests failed).
18619233d2500723e5594f3e7c70896ffeeef32b9c950ywan  bool Failed() const;
18620233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18621233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the i-th test case among all the test cases. i can range from 0 to
18622233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // total_test_case_count() - 1. If i is not in that range, returns NULL.
18623233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestCase* GetTestCase(int i) const;
18624233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18625233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the TestResult containing information on test failures and
18626233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // properties logged outside of individual test cases.
18627233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const TestResult& ad_hoc_test_result() const;
18628233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18629233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Returns the list of event listeners that can be used to track events
18630233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // inside Google Test.
18631233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestEventListeners& listeners();
18632233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18633233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
18634233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Registers and returns a global test environment.  When a test
18635233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // program is run, all global test environments will be set-up in
18636233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the order they were registered.  After all tests in the program
18637233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // have finished, all global test environments will be torn-down in
18638233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the *reverse* order they were registered.
18639233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18640233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The UnitTest object takes ownership of the given environment.
18641233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18642233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This method can only be called from the main thread.
18643233d2500723e5594f3e7c70896ffeeef32b9c950ywan  Environment* AddEnvironment(Environment* env);
18644233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18645233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds a TestPartResult to the current TestResult object.  All
18646233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
18647233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // eventually call this to report their results.  The user code
18648233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // should use the assertion macros instead of calling this directly.
18649233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void AddTestPartResult(TestPartResult::Type result_type,
18650233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         const char* file_name,
18651233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         int line_number,
18652233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         const std::string& message,
18653233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         const std::string& os_stack_trace)
18654233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(mutex_);
18655233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18656233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adds a TestProperty to the current TestResult object when invoked from
18657233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
18658233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // from SetUpTestCase or TearDownTestCase, or to the global property set
18659233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // when invoked elsewhere.  If the result already contains a property with
18660233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the same key, the value will be updated.
18661233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void RecordProperty(const std::string& key, const std::string& value);
18662233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18663233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Gets the i-th test case among all the test cases. i can range from 0 to
18664233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // total_test_case_count() - 1. If i is not in that range, returns NULL.
18665233d2500723e5594f3e7c70896ffeeef32b9c950ywan  TestCase* GetMutableTestCase(int i);
18666233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18667233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Accessors for the implementation object.
18668233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::UnitTestImpl* impl() { return impl_; }
18669233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const internal::UnitTestImpl* impl() const { return impl_; }
18670233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18671233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // These classes and funcions are friends as they need to access private
18672233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // members of UnitTest.
18673233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class Test;
18674233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::AssertHelper;
18675233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::ScopedTrace;
18676233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::StreamingListenerTest;
18677233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend class internal::UnitTestRecordPropertyTestHelper;
18678233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend Environment* AddGlobalTestEnvironment(Environment* env);
18679233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
18680233d2500723e5594f3e7c70896ffeeef32b9c950ywan  friend void internal::ReportFailureInUnknownLocation(
18681233d2500723e5594f3e7c70896ffeeef32b9c950ywan      TestPartResult::Type result_type,
18682233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const std::string& message);
18683233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18684233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Creates an empty UnitTest.
18685233d2500723e5594f3e7c70896ffeeef32b9c950ywan  UnitTest();
18686233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18687233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // D'tor
18688233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~UnitTest();
18689233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18690233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
18691233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Google Test trace stack.
18692233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void PushGTestTrace(const internal::TraceInfo& trace)
18693233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(mutex_);
18694233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Pops a trace from the per-thread Google Test trace stack.
18696233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void PopGTestTrace()
18697233d2500723e5594f3e7c70896ffeeef32b9c950ywan      GTEST_LOCK_EXCLUDED_(mutex_);
18698233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18699233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Protects mutable state in *impl_.  This is mutable as some const
18700233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // methods need to lock it too.
18701233d2500723e5594f3e7c70896ffeeef32b9c950ywan  mutable internal::Mutex mutex_;
18702233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18703233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Opaque implementation object.  This field is never changed once
18704233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the object is constructed.  We don't mark it as const here, as
18705233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // doing so will cause a warning in the constructor of UnitTest.
18706233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Mutable state in *impl_ is protected by mutex_.
18707233d2500723e5594f3e7c70896ffeeef32b9c950ywan  internal::UnitTestImpl* impl_;
18708233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18709233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We disallow copying UnitTest.
18710233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
18711233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18712233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18713233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A convenient wrapper for adding an environment for the test
18714233d2500723e5594f3e7c70896ffeeef32b9c950ywan// program.
18715233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18716233d2500723e5594f3e7c70896ffeeef32b9c950ywan// You should call this before RUN_ALL_TESTS() is called, probably in
18717233d2500723e5594f3e7c70896ffeeef32b9c950ywan// main().  If you use gtest_main, you need to call this before main()
18718233d2500723e5594f3e7c70896ffeeef32b9c950ywan// starts for it to take effect.  For example, you can define a global
18719233d2500723e5594f3e7c70896ffeeef32b9c950ywan// variable like this:
18720233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18721233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   testing::Environment* const foo_env =
18722233d2500723e5594f3e7c70896ffeeef32b9c950ywan//       testing::AddGlobalTestEnvironment(new FooEnvironment);
18723233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18724233d2500723e5594f3e7c70896ffeeef32b9c950ywan// However, we strongly recommend you to write your own main() and
18725233d2500723e5594f3e7c70896ffeeef32b9c950ywan// call AddGlobalTestEnvironment() there, as relying on initialization
18726233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of global variables makes the code harder to read and may cause
18727233d2500723e5594f3e7c70896ffeeef32b9c950ywan// problems when you register multiple environments from different
18728233d2500723e5594f3e7c70896ffeeef32b9c950ywan// translation units and the environments have dependencies among them
18729233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (remember that the compiler doesn't guarantee the order in which
18730233d2500723e5594f3e7c70896ffeeef32b9c950ywan// global variables from different translation units are initialized).
18731233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline Environment* AddGlobalTestEnvironment(Environment* env) {
18732233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return UnitTest::GetInstance()->AddEnvironment(env);
18733233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
18734233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18735233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Initializes Google Test.  This must be called before calling
18736233d2500723e5594f3e7c70896ffeeef32b9c950ywan// RUN_ALL_TESTS().  In particular, it parses a command line for the
18737233d2500723e5594f3e7c70896ffeeef32b9c950ywan// flags that Google Test recognizes.  Whenever a Google Test flag is
18738233d2500723e5594f3e7c70896ffeeef32b9c950ywan// seen, it is removed from argv, and *argc is decremented.
18739233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18740233d2500723e5594f3e7c70896ffeeef32b9c950ywan// No value is returned.  Instead, the Google Test flag variables are
18741233d2500723e5594f3e7c70896ffeeef32b9c950ywan// updated.
18742233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18743233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Calling the function for the second time has no user-visible effect.
18744233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void InitGoogleTest(int* argc, char** argv);
18745233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18746233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This overloaded version can be used in Windows programs compiled in
18747233d2500723e5594f3e7c70896ffeeef32b9c950ywan// UNICODE mode.
18748233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
18749233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18750233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
18751233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18752233d2500723e5594f3e7c70896ffeeef32b9c950ywan// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
18753233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value of type ToPrint that is an operand of a comparison assertion
18754233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
18755233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the comparison, and is used to help determine the best way to
18756233d2500723e5594f3e7c70896ffeeef32b9c950ywan// format the value.  In particular, when the value is a C string
18757233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (char pointer) and the other operand is an STL string object, we
18758233d2500723e5594f3e7c70896ffeeef32b9c950ywan// want to format the C string as a string, since we know it is
18759233d2500723e5594f3e7c70896ffeeef32b9c950ywan// compared by value with the string object.  If the value is a char
18760233d2500723e5594f3e7c70896ffeeef32b9c950ywan// pointer but the other operand is not an STL string object, we don't
18761233d2500723e5594f3e7c70896ffeeef32b9c950ywan// know whether the pointer is supposed to point to a NUL-terminated
18762233d2500723e5594f3e7c70896ffeeef32b9c950ywan// string, and thus want to print it as a pointer to be safe.
18763233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18764233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18765233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18766233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The default case.
18767233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename ToPrint, typename OtherOperand>
18768233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FormatForComparison {
18769233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18770233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static ::std::string Format(const ToPrint& value) {
18771233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return ::testing::PrintToString(value);
18772233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18773233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18774233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18775233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Array.
18776233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename ToPrint, size_t N, typename OtherOperand>
18777233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass FormatForComparison<ToPrint[N], OtherOperand> {
18778233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18779233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static ::std::string Format(const ToPrint* value) {
18780233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
18781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18782233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18783233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18784233d2500723e5594f3e7c70896ffeeef32b9c950ywan// By default, print C string as pointers to be safe, as we don't know
18785233d2500723e5594f3e7c70896ffeeef32b9c950ywan// whether they actually point to a NUL-terminated string.
18786233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18787233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
18788233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename OtherOperand>                                      \
18789233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class FormatForComparison<CharType*, OtherOperand> {                  \
18790233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:                                                              \
18791233d2500723e5594f3e7c70896ffeeef32b9c950ywan    static ::std::string Format(CharType* value) {                      \
18792233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return ::testing::PrintToString(static_cast<const void*>(value)); \
18793233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }                                                                   \
18794233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18795233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18796233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
18797233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
18798233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
18799233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
18800233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18801233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
18802233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18803233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If a C string is compared with an STL string object, we know it's meant
18804233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to point to a NUL-terminated string, and thus can print it as a string.
18805233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18806233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
18807233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <>                                                           \
18808233d2500723e5594f3e7c70896ffeeef32b9c950ywan  class FormatForComparison<CharType*, OtherStringType> {               \
18809233d2500723e5594f3e7c70896ffeeef32b9c950ywan   public:                                                              \
18810233d2500723e5594f3e7c70896ffeeef32b9c950ywan    static ::std::string Format(CharType* value) {                      \
18811233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return ::testing::PrintToString(value);                           \
18812233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }                                                                   \
18813233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18814233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18815233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
18816233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
18817233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18818233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_STRING
18819233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
18820233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
18821233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
18822233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18823233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_GLOBAL_WSTRING
18824233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
18825233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
18826233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
18827233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18828233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_STD_WSTRING
18829233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
18830233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
18831233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
18832233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18833233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
18834233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18835233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
18836233d2500723e5594f3e7c70896ffeeef32b9c950ywan// operand to be used in a failure message.  The type (but not value)
18837233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of the other operand may affect the format.  This allows us to
18838233d2500723e5594f3e7c70896ffeeef32b9c950ywan// print a char* as a raw pointer when it is compared against another
18839233d2500723e5594f3e7c70896ffeeef32b9c950ywan// char* or void*, and print it as a C string when it is compared
18840233d2500723e5594f3e7c70896ffeeef32b9c950ywan// against an std::string object, for example.
18841233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18842233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18843233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
18844233d2500723e5594f3e7c70896ffeeef32b9c950ywanstd::string FormatForComparisonFailureMessage(
18845233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const T1& value, const T2& /* other_operand */) {
18846233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return FormatForComparison<T1, T2>::Format(value);
18847233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
18848233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18849233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The helper function for {ASSERT|EXPECT}_EQ.
18850233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
18851233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult CmpHelperEQ(const char* expected_expression,
18852233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            const char* actual_expression,
18853233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            const T1& expected,
18854233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            const T2& actual) {
18855233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
18856233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(push)          // Saves the current warning state.
18857233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(disable:4389)  // Temporarily disables warning on
18858233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                // signed/unsigned mismatch.
18859233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
18860233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18861233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (expected == actual) {
18862233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return AssertionSuccess();
18863233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18864233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18865233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef _MSC_VER
18866233d2500723e5594f3e7c70896ffeeef32b9c950ywan# pragma warning(pop)          // Restores the warning state.
18867233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
18868233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18869233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return EqFailure(expected_expression,
18870233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   actual_expression,
18871233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   FormatForComparisonFailureMessage(expected, actual),
18872233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   FormatForComparisonFailureMessage(actual, expected),
18873233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   false);
18874233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
18875233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18876233d2500723e5594f3e7c70896ffeeef32b9c950ywan// With this overloaded version, we allow anonymous enums to be used
18877233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
18878233d2500723e5594f3e7c70896ffeeef32b9c950ywan// can be implicitly cast to BiggestInt.
18879233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
18880233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                       const char* actual_expression,
18881233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                       BiggestInt expected,
18882233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                       BiggestInt actual);
18883233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18884233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
18885233d2500723e5594f3e7c70896ffeeef32b9c950ywan// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
18886233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is a null pointer literal.  The following default implementation is
18887233d2500723e5594f3e7c70896ffeeef32b9c950ywan// for lhs_is_null_literal being false.
18888233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <bool lhs_is_null_literal>
18889233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass EqHelper {
18890233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18891233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This templatized version is for the general case.
18892233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2>
18893233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static AssertionResult Compare(const char* expected_expression,
18894233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 const char* actual_expression,
18895233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 const T1& expected,
18896233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 const T2& actual) {
18897233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CmpHelperEQ(expected_expression, actual_expression, expected,
18898233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       actual);
18899233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18900233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18901233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // With this overloaded version, we allow anonymous enums to be used
18902233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
18903233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // enums can be implicitly cast to BiggestInt.
18904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  //
18905233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Even though its body looks the same as the above version, we
18906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // cannot merge the two, as it will make anonymous enums unhappy.
18907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static AssertionResult Compare(const char* expected_expression,
18908233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 const char* actual_expression,
18909233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 BiggestInt expected,
18910233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                 BiggestInt actual) {
18911233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CmpHelperEQ(expected_expression, actual_expression, expected,
18912233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       actual);
18913233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18914233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18915233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18916233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This specialization is used when the first argument to ASSERT_EQ()
18917233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is a null pointer literal, like NULL, false, or 0.
18918233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <>
18919233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass EqHelper<true> {
18920233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
18921233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We define two overloaded versions of Compare().  The first
18922233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // version will be picked when the second argument to ASSERT_EQ() is
18923233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
18924233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // EXPECT_EQ(false, a_bool).
18925233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T1, typename T2>
18926233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static AssertionResult Compare(
18927233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* expected_expression,
18928233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* actual_expression,
18929233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const T1& expected,
18930233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const T2& actual,
18931233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // The following line prevents this overload from being considered if T2
18932233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
18933233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
18934233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // to match the Secret* in the other overload, which would otherwise make
18935233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // this template match better.
18936233d2500723e5594f3e7c70896ffeeef32b9c950ywan      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
18937233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CmpHelperEQ(expected_expression, actual_expression, expected,
18938233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       actual);
18939233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18940233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This version will be picked when the second argument to ASSERT_EQ() is a
18942233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
18943233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <typename T>
18944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static AssertionResult Compare(
18945233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* expected_expression,
18946233d2500723e5594f3e7c70896ffeeef32b9c950ywan      const char* actual_expression,
18947233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // We used to have a second template parameter instead of Secret*.  That
18948233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // template parameter would deduce to 'long', making this a better match
18949233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // than the first overload even without the first overload's EnableIf.
18950233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
18951233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // non-pointer argument" (even a deduced integral argument), so the old
18952233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // implementation caused warnings in user code.
18953233d2500723e5594f3e7c70896ffeeef32b9c950ywan      Secret* /* expected (NULL) */,
18954233d2500723e5594f3e7c70896ffeeef32b9c950ywan      T* actual) {
18955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // We already know that 'expected' is a null pointer.
18956233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return CmpHelperEQ(expected_expression, actual_expression,
18957233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       static_cast<T*>(NULL), actual);
18958233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
18959233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
18960233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18961233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A macro for implementing the helper functions needed to implement
18962233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
18963233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of similar code.
18964233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18965233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For each templatized helper function, we also define an overloaded
18966233d2500723e5594f3e7c70896ffeeef32b9c950ywan// version for BiggestInt in order to reduce code bloat and allow
18967233d2500723e5594f3e7c70896ffeeef32b9c950ywan// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
18968233d2500723e5594f3e7c70896ffeeef32b9c950ywan// with gcc 4.
18969233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
18970233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18971233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
18972233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>\
18973233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
18974233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                   const T1& val1, const T2& val2) {\
18975233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (val1 op val2) {\
18976233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return AssertionSuccess();\
18977233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {\
18978233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return AssertionFailure() \
18979233d2500723e5594f3e7c70896ffeeef32b9c950ywan        << "Expected: (" << expr1 << ") " #op " (" << expr2\
18980233d2500723e5594f3e7c70896ffeeef32b9c950ywan        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
18981233d2500723e5594f3e7c70896ffeeef32b9c950ywan        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
18982233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }\
18983233d2500723e5594f3e7c70896ffeeef32b9c950ywan}\
18984233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelper##op_name(\
18985233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
18986233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18987233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
18988233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18989233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements the helper function for {ASSERT|EXPECT}_NE
18990233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_CMP_HELPER_(NE, !=);
18991233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements the helper function for {ASSERT|EXPECT}_LE
18992233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_CMP_HELPER_(LE, <=);
18993233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements the helper function for {ASSERT|EXPECT}_LT
18994233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_CMP_HELPER_(LT, <);
18995233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements the helper function for {ASSERT|EXPECT}_GE
18996233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_CMP_HELPER_(GE, >=);
18997233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements the helper function for {ASSERT|EXPECT}_GT
18998233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_IMPL_CMP_HELPER_(GT, >);
18999233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19000233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef GTEST_IMPL_CMP_HELPER_
19001233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19002233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The helper function for {ASSERT|EXPECT}_STREQ.
19003233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19004233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19005233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
19006233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* actual_expression,
19007233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* expected,
19008233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* actual);
19009233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19010233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
19011233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19012233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19013233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
19014233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              const char* actual_expression,
19015233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              const char* expected,
19016233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              const char* actual);
19017233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19018233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The helper function for {ASSERT|EXPECT}_STRNE.
19019233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19020233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19021233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
19022233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* s2_expression,
19023233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* s1,
19024233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* s2);
19025233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19026233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The helper function for {ASSERT|EXPECT}_STRCASENE.
19027233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19028233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19029233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
19030233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              const char* s2_expression,
19031233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              const char* s1,
19032233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              const char* s2);
19033233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19034233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19035233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for *_STREQ on wide strings.
19036233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19037233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19038233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
19039233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* actual_expression,
19040233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const wchar_t* expected,
19041233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const wchar_t* actual);
19042233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19043233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for *_STRNE on wide strings.
19044233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19045233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19046233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
19047233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const char* s2_expression,
19048233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const wchar_t* s1,
19049233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                          const wchar_t* s2);
19050233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19051233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
19052233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19053233d2500723e5594f3e7c70896ffeeef32b9c950ywan// IsSubstring() and IsNotSubstring() are intended to be used as the
19054233d2500723e5594f3e7c70896ffeeef32b9c950ywan// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
19055233d2500723e5594f3e7c70896ffeeef32b9c950ywan// themselves.  They check whether needle is a substring of haystack
19056233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (NULL is considered a substring of itself only), and return an
19057233d2500723e5594f3e7c70896ffeeef32b9c950ywan// appropriate error message when they fail.
19058233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19059233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The {needle,haystack}_expr arguments are the stringified
19060233d2500723e5594f3e7c70896ffeeef32b9c950ywan// expressions that generated the two real arguments.
19061233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsSubstring(
19062233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19063233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle, const char* haystack);
19064233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsSubstring(
19065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19066233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const wchar_t* needle, const wchar_t* haystack);
19067233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsNotSubstring(
19068233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19069233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle, const char* haystack);
19070233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsNotSubstring(
19071233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19072233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const wchar_t* needle, const wchar_t* haystack);
19073233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsSubstring(
19074233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19075233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::std::string& needle, const ::std::string& haystack);
19076233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsNotSubstring(
19077233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19078233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::std::string& needle, const ::std::string& haystack);
19079233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19080233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_STD_WSTRING
19081233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsSubstring(
19082233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19083233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::std::wstring& needle, const ::std::wstring& haystack);
19084233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult IsNotSubstring(
19085233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* needle_expr, const char* haystack_expr,
19086233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const ::std::wstring& needle, const ::std::wstring& haystack);
19087233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_STD_WSTRING
19088233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19089233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace internal {
19090233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19091233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper template function for comparing floating-points.
19092233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19093233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Template parameter:
19094233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19095233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   RawType: the raw floating-point type (either float or double)
19096233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19097233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19098233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename RawType>
19099233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
19100233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         const char* actual_expression,
19101233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         RawType expected,
19102233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         RawType actual) {
19103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const FloatingPoint<RawType> lhs(expected), rhs(actual);
19104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (lhs.AlmostEquals(rhs)) {
19106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return AssertionSuccess();
19107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
19108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19109233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::std::stringstream expected_ss;
19110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
19111233d2500723e5594f3e7c70896ffeeef32b9c950ywan              << expected;
19112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::std::stringstream actual_ss;
19114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
19115233d2500723e5594f3e7c70896ffeeef32b9c950ywan            << actual;
19116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return EqFailure(expected_expression,
19118233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   actual_expression,
19119233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   StringStreamToString(&expected_ss),
19120233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   StringStreamToString(&actual_ss),
19121233d2500723e5594f3e7c70896ffeeef32b9c950ywan                   false);
19122233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19124233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for implementing ASSERT_NEAR.
19125233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19126233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
19127233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
19128233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                const char* expr2,
19129233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                const char* abs_error_expr,
19130233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                double val1,
19131233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                double val2,
19132233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                double abs_error);
19133233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19134233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
19135233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A class that enables one to stream messages to assertion macros
19136233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass GTEST_API_ AssertHelper {
19137233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
19138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Constructor.
19139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  AssertHelper(TestPartResult::Type type,
19140233d2500723e5594f3e7c70896ffeeef32b9c950ywan               const char* file,
19141233d2500723e5594f3e7c70896ffeeef32b9c950ywan               int line,
19142233d2500723e5594f3e7c70896ffeeef32b9c950ywan               const char* message);
19143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ~AssertHelper();
19144233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Message assignment is a semantic trick to enable assertion
19146233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // streaming; see the GTEST_MESSAGE_ macro below.
19147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void operator=(const Message& message) const;
19148233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19149233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
19150233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // We put our data in a struct so that the size of the AssertHelper class can
19151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // be as small as possible.  This is important because gcc is incapable of
19152233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // re-using stack space even for temporary variables, so every EXPECT_EQ
19153233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // reserves stack space for another AssertHelper.
19154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct AssertHelperData {
19155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    AssertHelperData(TestPartResult::Type t,
19156233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     const char* srcfile,
19157233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     int line_num,
19158233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     const char* msg)
19159233d2500723e5594f3e7c70896ffeeef32b9c950ywan        : type(t), file(srcfile), line(line_num), message(msg) { }
19160233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TestPartResult::Type const type;
19162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const char* const file;
19163233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int const line;
19164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    std::string const message;
19165233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19166233d2500723e5594f3e7c70896ffeeef32b9c950ywan   private:
19167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
19168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  };
19169233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  AssertHelperData* const data_;
19171233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
19173233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
19174233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19175233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace internal
19176233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19177233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_HAS_PARAM_TEST
19178233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The pure interface class that all value-parameterized tests inherit from.
19179233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A value-parameterized class must inherit from both ::testing::Test and
19180233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::testing::WithParamInterface. In most cases that just means inheriting
19181233d2500723e5594f3e7c70896ffeeef32b9c950ywan// from ::testing::TestWithParam, but more complicated test hierarchies
19182233d2500723e5594f3e7c70896ffeeef32b9c950ywan// may need to inherit from Test and WithParamInterface at different levels.
19183233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19184233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This interface has support for accessing the test parameter value via
19185233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the GetParam() method.
19186233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19187233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Use it with one of the parameter generator defining functions, like Range(),
19188233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Values(), ValuesIn(), Bool(), and Combine().
19189233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19190233d2500723e5594f3e7c70896ffeeef32b9c950ywan// class FooTest : public ::testing::TestWithParam<int> {
19191233d2500723e5594f3e7c70896ffeeef32b9c950ywan//  protected:
19192233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   FooTest() {
19193233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     // Can use GetParam() here.
19194233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
19195233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   virtual ~FooTest() {
19196233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     // Can use GetParam() here.
19197233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
19198233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   virtual void SetUp() {
19199233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     // Can use GetParam() here.
19200233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
19201233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   virtual void TearDown {
19202233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     // Can use GetParam() here.
19203233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
19204233d2500723e5594f3e7c70896ffeeef32b9c950ywan// };
19205233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TEST_P(FooTest, DoesBar) {
19206233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   // Can use GetParam() method here.
19207233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Foo foo;
19208233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_TRUE(foo.DoesBar(GetParam()));
19209233d2500723e5594f3e7c70896ffeeef32b9c950ywan// }
19210233d2500723e5594f3e7c70896ffeeef32b9c950ywan// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
19211233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19212233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
19213233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass WithParamInterface {
19214233d2500723e5594f3e7c70896ffeeef32b9c950ywan public:
19215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  typedef T ParamType;
19216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  virtual ~WithParamInterface() {}
19217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19218233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // The current parameter value. Is also available in the test fixture's
19219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // constructor. This member function is non-static, even though it only
19220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // references static data, to reduce the opportunity for incorrect uses
19221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
19222233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // uses a fixture whose parameter type is int.
19223233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const ParamType& GetParam() const {
19224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_CHECK_(parameter_ != NULL)
19225233d2500723e5594f3e7c70896ffeeef32b9c950ywan        << "GetParam() can only be called inside a value-parameterized test "
19226233d2500723e5594f3e7c70896ffeeef32b9c950ywan        << "-- did you intend to write TEST_P instead of TEST_F?";
19227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return *parameter_;
19228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
19229233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19230233d2500723e5594f3e7c70896ffeeef32b9c950ywan private:
19231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Sets parameter value. The caller is responsible for making sure the value
19232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // remains alive and unchanged throughout the current test.
19233233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static void SetParam(const ParamType* parameter) {
19234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    parameter_ = parameter;
19235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
19236233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Static value used for accessing parameter during a test lifetime.
19238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const ParamType* parameter_;
19239233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TestClass must be a subclass of WithParamInterface<T> and Test.
19241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  template <class TestClass> friend class internal::ParameterizedTestFactory;
19242233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
19243233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19244233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
19245233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst T* WithParamInterface<T>::parameter_ = NULL;
19246233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19247233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Most value-parameterized classes can ignore the existence of
19248233d2500723e5594f3e7c70896ffeeef32b9c950ywan// WithParamInterface, and can just inherit from ::testing::TestWithParam.
19249233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19250233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T>
19251233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass TestWithParam : public Test, public WithParamInterface<T> {
19252233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
19253233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19254233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_HAS_PARAM_TEST
19255233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19256233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for indicating success/failure in test code.
19257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19258233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ADD_FAILURE unconditionally adds a failure to the current test.
19259233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SUCCEED generates a success - it doesn't automatically make the
19260233d2500723e5594f3e7c70896ffeeef32b9c950ywan// current test successful, as a test is only successful when it has
19261233d2500723e5594f3e7c70896ffeeef32b9c950ywan// no failure.
19262233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19263233d2500723e5594f3e7c70896ffeeef32b9c950ywan// EXPECT_* verifies that a certain condition is satisfied.  If not,
19264233d2500723e5594f3e7c70896ffeeef32b9c950ywan// it behaves like ADD_FAILURE.  In particular:
19265233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19266233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_TRUE  verifies that a Boolean condition is true.
19267233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_FALSE verifies that a Boolean condition is false.
19268233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19269233d2500723e5594f3e7c70896ffeeef32b9c950ywan// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
19270233d2500723e5594f3e7c70896ffeeef32b9c950ywan// that they will also abort the current function on failure.  People
19271233d2500723e5594f3e7c70896ffeeef32b9c950ywan// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
19272233d2500723e5594f3e7c70896ffeeef32b9c950ywan// writing data-driven tests often find themselves using ADD_FAILURE
19273233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and EXPECT_* more.
19274233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19275233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates a nonfatal failure with a generic message.
19276233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
19277233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19278233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates a nonfatal failure at the given source file location with
19279233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a generic message.
19280233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ADD_FAILURE_AT(file, line) \
19281233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_MESSAGE_AT_(file, line, "Failed", \
19282233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    ::testing::TestPartResult::kNonFatalFailure)
19283233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19284233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates a fatal failure with a generic message.
19285233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
19286233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19287233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Define this macro to 1 to omit the definition of FAIL(), which is a
19288233d2500723e5594f3e7c70896ffeeef32b9c950ywan// generic name and clashes with some other libraries.
19289233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_FAIL
19290233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define FAIL() GTEST_FAIL()
19291233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19293233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Generates a success with a generic message.
19294233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
19295233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19296233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Define this macro to 1 to omit the definition of SUCCEED(), which
19297233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is a generic name and clashes with some other libraries.
19298233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_SUCCEED
19299233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define SUCCEED() GTEST_SUCCEED()
19300233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19301233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19302233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for testing exceptions.
19303233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19304233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
19305233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         Tests that the statement throws the expected exception.
19306233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_NO_THROW(statement):
19307233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         Tests that the statement doesn't throw any exception.
19308233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_ANY_THROW(statement):
19309233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         Tests that the statement throws an exception.
19310233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19311233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_THROW(statement, expected_exception) \
19312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
19313233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_NO_THROW(statement) \
19314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
19315233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_ANY_THROW(statement) \
19316233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
19317233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_THROW(statement, expected_exception) \
19318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
19319233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_NO_THROW(statement) \
19320233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
19321233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_ANY_THROW(statement) \
19322233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
19323233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19324233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Boolean assertions. Condition can be either a Boolean expression or an
19325233d2500723e5594f3e7c70896ffeeef32b9c950ywan// AssertionResult. For more information on how to use AssertionResult with
19326233d2500723e5594f3e7c70896ffeeef32b9c950ywan// these macros see comments on that class.
19327233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_TRUE(condition) \
19328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
19329233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      GTEST_NONFATAL_FAILURE_)
19330233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_FALSE(condition) \
19331233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
19332233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      GTEST_NONFATAL_FAILURE_)
19333233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_TRUE(condition) \
19334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
19335233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      GTEST_FATAL_FAILURE_)
19336233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_FALSE(condition) \
19337233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
19338233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      GTEST_FATAL_FAILURE_)
19339233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19340233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Includes the auto-generated header that implements a family of
19341233d2500723e5594f3e7c70896ffeeef32b9c950ywan// generic predicate assertion macros.
19342233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Copyright 2006, Google Inc.
19343233d2500723e5594f3e7c70896ffeeef32b9c950ywan// All rights reserved.
19344233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19345233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Redistribution and use in source and binary forms, with or without
19346233d2500723e5594f3e7c70896ffeeef32b9c950ywan// modification, are permitted provided that the following conditions are
19347233d2500723e5594f3e7c70896ffeeef32b9c950ywan// met:
19348233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19349233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions of source code must retain the above copyright
19350233d2500723e5594f3e7c70896ffeeef32b9c950ywan// notice, this list of conditions and the following disclaimer.
19351233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Redistributions in binary form must reproduce the above
19352233d2500723e5594f3e7c70896ffeeef32b9c950ywan// copyright notice, this list of conditions and the following disclaimer
19353233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in the documentation and/or other materials provided with the
19354233d2500723e5594f3e7c70896ffeeef32b9c950ywan// distribution.
19355233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     * Neither the name of Google Inc. nor the names of its
19356233d2500723e5594f3e7c70896ffeeef32b9c950ywan// contributors may be used to endorse or promote products derived from
19357233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this software without specific prior written permission.
19358233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19359233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19360233d2500723e5594f3e7c70896ffeeef32b9c950ywan// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19361233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19362233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19363233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19364233d2500723e5594f3e7c70896ffeeef32b9c950ywan// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19365233d2500723e5594f3e7c70896ffeeef32b9c950ywan// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19366233d2500723e5594f3e7c70896ffeeef32b9c950ywan// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
19367233d2500723e5594f3e7c70896ffeeef32b9c950ywan// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19368233d2500723e5594f3e7c70896ffeeef32b9c950ywan// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
19369233d2500723e5594f3e7c70896ffeeef32b9c950ywan// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19371233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
19372233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
19373233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19374233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Implements a family of generic predicate assertion macros.
19375233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19376233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19377233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19378233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19379233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Makes sure this header is not included before gtest.h.
19380233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
19381233d2500723e5594f3e7c70896ffeeef32b9c950ywan# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
19382233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
19383233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19384233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This header implements a family of generic predicate assertion
19385233d2500723e5594f3e7c70896ffeeef32b9c950ywan// macros:
19386233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19387233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_PRED_FORMAT1(pred_format, v1)
19388233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
19389233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ...
19390233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19391233d2500723e5594f3e7c70896ffeeef32b9c950ywan// where pred_format is a function or functor that takes n (in the
19392233d2500723e5594f3e7c70896ffeeef32b9c950ywan// case of ASSERT_PRED_FORMATn) values and their source expression
19393233d2500723e5594f3e7c70896ffeeef32b9c950ywan// text, and returns a testing::AssertionResult.  See the definition
19394233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of ASSERT_EQ in gtest.h for an example.
19395233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19396233d2500723e5594f3e7c70896ffeeef32b9c950ywan// If you don't care about formatting, you can use the more
19397233d2500723e5594f3e7c70896ffeeef32b9c950ywan// restrictive version:
19398233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19399233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_PRED1(pred, v1)
19400233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_PRED2(pred, v1, v2)
19401233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ...
19402233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19403233d2500723e5594f3e7c70896ffeeef32b9c950ywan// where pred is an n-ary function or functor that returns bool,
19404233d2500723e5594f3e7c70896ffeeef32b9c950ywan// and the values v1, v2, ..., must support the << operator for
19405233d2500723e5594f3e7c70896ffeeef32b9c950ywan// streaming to std::ostream.
19406233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19407233d2500723e5594f3e7c70896ffeeef32b9c950ywan// We also define the EXPECT_* variations.
19408233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19409233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For now we only support predicates whose arity is at most 5.
19410233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Please email googletestframework@googlegroups.com if you need
19411233d2500723e5594f3e7c70896ffeeef32b9c950ywan// support for higher arities.
19412233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19413233d2500723e5594f3e7c70896ffeeef32b9c950ywan// GTEST_ASSERT_ is the basic statement to which all of the assertions
19414233d2500723e5594f3e7c70896ffeeef32b9c950ywan// in this file reduce.  Don't use this in your code.
19415233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19416233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_(expression, on_failure) \
19417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
19418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (const ::testing::AssertionResult gtest_ar = (expression)) \
19419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; \
19420233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else \
19421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    on_failure(gtest_ar.failure_message())
19422233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19423233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19424233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
19425233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19426233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Pred,
19427233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T1>
19428233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult AssertPred1Helper(const char* pred_text,
19429233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e1,
19430233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  Pred pred,
19431233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T1& v1) {
19432233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (pred(v1)) return AssertionSuccess();
19433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19434233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return AssertionFailure() << pred_text << "("
19435233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e1 << ") evaluates to false, where"
19436233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e1 << " evaluates to " << v1;
19437233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19438233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19439233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
19440233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't use this in your code.
19441233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
19442233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(pred_format(#v1, v1), \
19443233d2500723e5594f3e7c70896ffeeef32b9c950ywan                on_failure)
19444233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19445233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
19446233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19447233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED1_(pred, v1, on_failure)\
19448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
19449233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v1, \
19450233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             pred, \
19451233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v1), on_failure)
19452233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19453233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Unary predicate assertion macros.
19454233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED_FORMAT1(pred_format, v1) \
19455233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
19456233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED1(pred, v1) \
19457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
19458233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED_FORMAT1(pred_format, v1) \
19459233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
19460233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED1(pred, v1) \
19461233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
19462233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19463233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19464233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19465233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
19466233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19467233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Pred,
19468233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T1,
19469233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T2>
19470233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult AssertPred2Helper(const char* pred_text,
19471233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e1,
19472233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e2,
19473233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  Pred pred,
19474233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T1& v1,
19475233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T2& v2) {
19476233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (pred(v1, v2)) return AssertionSuccess();
19477233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19478233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return AssertionFailure() << pred_text << "("
19479233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e1 << ", "
19480233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e2 << ") evaluates to false, where"
19481233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e1 << " evaluates to " << v1
19482233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e2 << " evaluates to " << v2;
19483233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19484233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19485233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
19486233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't use this in your code.
19487233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
19488233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
19489233d2500723e5594f3e7c70896ffeeef32b9c950ywan                on_failure)
19490233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19491233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
19492233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19493233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED2_(pred, v1, v2, on_failure)\
19494233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
19495233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v1, \
19496233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v2, \
19497233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             pred, \
19498233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v1, \
19499233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v2), on_failure)
19500233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19501233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Binary predicate assertion macros.
19502233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
19503233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
19504233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED2(pred, v1, v2) \
19505233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
19506233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
19507233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
19508233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED2(pred, v1, v2) \
19509233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
19510233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19511233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19512233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19513233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
19514233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19515233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Pred,
19516233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T1,
19517233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T2,
19518233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T3>
19519233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult AssertPred3Helper(const char* pred_text,
19520233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e1,
19521233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e2,
19522233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e3,
19523233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  Pred pred,
19524233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T1& v1,
19525233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T2& v2,
19526233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T3& v3) {
19527233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (pred(v1, v2, v3)) return AssertionSuccess();
19528233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19529233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return AssertionFailure() << pred_text << "("
19530233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e1 << ", "
19531233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e2 << ", "
19532233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e3 << ") evaluates to false, where"
19533233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e1 << " evaluates to " << v1
19534233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e2 << " evaluates to " << v2
19535233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e3 << " evaluates to " << v3;
19536233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19537233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19538233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
19539233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't use this in your code.
19540233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
19541233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
19542233d2500723e5594f3e7c70896ffeeef32b9c950ywan                on_failure)
19543233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19544233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
19545233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19546233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
19547233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
19548233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v1, \
19549233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v2, \
19550233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v3, \
19551233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             pred, \
19552233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v1, \
19553233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v2, \
19554233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v3), on_failure)
19555233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19556233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Ternary predicate assertion macros.
19557233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
19558233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
19559233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED3(pred, v1, v2, v3) \
19560233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
19561233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
19562233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
19563233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED3(pred, v1, v2, v3) \
19564233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
19565233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19566233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19567233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19568233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
19569233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19570233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Pred,
19571233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T1,
19572233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T2,
19573233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T3,
19574233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T4>
19575233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult AssertPred4Helper(const char* pred_text,
19576233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e1,
19577233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e2,
19578233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e3,
19579233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e4,
19580233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  Pred pred,
19581233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T1& v1,
19582233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T2& v2,
19583233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T3& v3,
19584233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T4& v4) {
19585233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
19586233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19587233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return AssertionFailure() << pred_text << "("
19588233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e1 << ", "
19589233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e2 << ", "
19590233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e3 << ", "
19591233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e4 << ") evaluates to false, where"
19592233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e1 << " evaluates to " << v1
19593233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e2 << " evaluates to " << v2
19594233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e3 << " evaluates to " << v3
19595233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e4 << " evaluates to " << v4;
19596233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19597233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19598233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
19599233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't use this in your code.
19600233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
19601233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
19602233d2500723e5594f3e7c70896ffeeef32b9c950ywan                on_failure)
19603233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19604233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
19605233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19606233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
19607233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
19608233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v1, \
19609233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v2, \
19610233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v3, \
19611233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v4, \
19612233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             pred, \
19613233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v1, \
19614233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v2, \
19615233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v3, \
19616233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v4), on_failure)
19617233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19618233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 4-ary predicate assertion macros.
19619233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
19620233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
19621233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
19622233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
19623233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
19624233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
19625233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
19626233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
19627233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19628233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19629233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19630233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
19631233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19632233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename Pred,
19633233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T1,
19634233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T2,
19635233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T3,
19636233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T4,
19637233d2500723e5594f3e7c70896ffeeef32b9c950ywan          typename T5>
19638233d2500723e5594f3e7c70896ffeeef32b9c950ywanAssertionResult AssertPred5Helper(const char* pred_text,
19639233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e1,
19640233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e2,
19641233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e3,
19642233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e4,
19643233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const char* e5,
19644233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  Pred pred,
19645233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T1& v1,
19646233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T2& v2,
19647233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T3& v3,
19648233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T4& v4,
19649233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  const T5& v5) {
19650233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
19651233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return AssertionFailure() << pred_text << "("
19653233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e1 << ", "
19654233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e2 << ", "
19655233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e3 << ", "
19656233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e4 << ", "
19657233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << e5 << ") evaluates to false, where"
19658233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e1 << " evaluates to " << v1
19659233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e2 << " evaluates to " << v2
19660233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e3 << " evaluates to " << v3
19661233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e4 << " evaluates to " << v4
19662233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            << "\n" << e5 << " evaluates to " << v5;
19663233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19664233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19665233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
19666233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't use this in your code.
19667233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
19668233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
19669233d2500723e5594f3e7c70896ffeeef32b9c950ywan                on_failure)
19670233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19671233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
19672233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this in your code.
19673233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
19674233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
19675233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v1, \
19676233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v2, \
19677233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v3, \
19678233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v4, \
19679233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             #v5, \
19680233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             pred, \
19681233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v1, \
19682233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v2, \
19683233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v3, \
19684233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v4, \
19685233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             v5), on_failure)
19686233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19687233d2500723e5594f3e7c70896ffeeef32b9c950ywan// 5-ary predicate assertion macros.
19688233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
19689233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
19690233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
19691233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
19692233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
19693233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
19694233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
19695233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
19696233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19697233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19698233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19699233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
19700233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19701233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for testing equalities and inequalities.
19702233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19703233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
19704233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
19705233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
19706233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
19707233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
19708233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
19709233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19710233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When they are not, Google Test prints both the tested expressions and
19711233d2500723e5594f3e7c70896ffeeef32b9c950ywan// their actual values.  The values must be compatible built-in types,
19712233d2500723e5594f3e7c70896ffeeef32b9c950ywan// or you will get a compiler error.  By "compatible" we mean that the
19713233d2500723e5594f3e7c70896ffeeef32b9c950ywan// values can be compared by the respective operator.
19714233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19715233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note:
19716233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19717233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   1. It is possible to make a user-defined type work with
19718233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   {ASSERT|EXPECT}_??(), but that requires overloading the
19719233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   comparison operators and is thus discouraged by the Google C++
19720233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   Usage Guide.  Therefore, you are advised to use the
19721233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
19722233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   equal.
19723233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19724233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
19725233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   pointers (in particular, C strings).  Therefore, if you use it
19726233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   with two C strings, you are testing how their locations in memory
19727233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   are related, not how their content is related.  To compare two C
19728233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   strings by content, use {ASSERT|EXPECT}_STR*().
19729233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19730233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
19731233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
19732233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   what the actual value is when it fails, and similarly for the
19733233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   other comparisons.
19734233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19735233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
19736233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   evaluate their arguments, which is undefined.
19737233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19738233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   5. These macros evaluate their arguments exactly once.
19739233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19740233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Examples:
19741233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19742233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_NE(5, Foo());
19743233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_EQ(NULL, a_pointer);
19744233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_LT(i, array_size);
19745233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_GT(records.size(), 0) << "There is no record left.";
19746233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19747233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_EQ(expected, actual) \
19748233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal:: \
19749233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
19750233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      expected, actual)
19751233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_NE(expected, actual) \
19752233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
19753233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_LE(val1, val2) \
19754233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
19755233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_LT(val1, val2) \
19756233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
19757233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_GE(val1, val2) \
19758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
19759233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_GT(val1, val2) \
19760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
19761233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19762233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_EQ(expected, actual) \
19763233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal:: \
19764233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
19765233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      expected, actual)
19766233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_NE(val1, val2) \
19767233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
19768233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_LE(val1, val2) \
19769233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
19770233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_LT(val1, val2) \
19771233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
19772233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_GE(val1, val2) \
19773233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
19774233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_ASSERT_GT(val1, val2) \
19775233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
19776233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19777233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
19778233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ASSERT_XY(), which clashes with some users' own code.
19779233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19780233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_ASSERT_EQ
19781233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
19782233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19783233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19784233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_ASSERT_NE
19785233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
19786233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19787233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19788233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_ASSERT_LE
19789233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
19790233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19791233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19792233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_ASSERT_LT
19793233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
19794233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19795233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19796233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_ASSERT_GE
19797233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
19798233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19799233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19800233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_ASSERT_GT
19801233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
19802233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
19803233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19804233d2500723e5594f3e7c70896ffeeef32b9c950ywan// C-string Comparisons.  All tests treat NULL and any non-NULL string
19805233d2500723e5594f3e7c70896ffeeef32b9c950ywan// as different.  Two NULLs are equal.
19806233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19807233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
19808233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
19809233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
19810233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
19811233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19812233d2500723e5594f3e7c70896ffeeef32b9c950ywan// For wide or narrow string objects, you can use the
19813233d2500723e5594f3e7c70896ffeeef32b9c950ywan// {ASSERT|EXPECT}_??() macros.
19814233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19815233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Don't depend on the order in which the arguments are evaluated,
19816233d2500723e5594f3e7c70896ffeeef32b9c950ywan// which is undefined.
19817233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19818233d2500723e5594f3e7c70896ffeeef32b9c950ywan// These macros evaluate their arguments exactly once.
19819233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19820233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_STREQ(expected, actual) \
19821233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19822233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_STRNE(s1, s2) \
19823233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19824233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_STRCASEEQ(expected, actual) \
19825233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19826233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_STRCASENE(s1, s2)\
19827233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19828233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19829233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_STREQ(expected, actual) \
19830233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19831233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_STRNE(s1, s2) \
19832233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19833233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_STRCASEEQ(expected, actual) \
19834233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19835233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_STRCASENE(s1, s2)\
19836233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19837233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19838233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros for comparing floating-point numbers.
19839233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19840233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
19841233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         Tests that two float values are almost equal.
19842233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
19843233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         Tests that two double values are almost equal.
19844233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
19845233d2500723e5594f3e7c70896ffeeef32b9c950ywan//         Tests that v1 and v2 are within the given distance to each other.
19846233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19847233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Google Test uses ULP-based comparison to automatically pick a default
19848233d2500723e5594f3e7c70896ffeeef32b9c950ywan// error bound that is appropriate for the operands.  See the
19849233d2500723e5594f3e7c70896ffeeef32b9c950ywan// FloatingPoint template class in gtest-internal.h if you are
19850233d2500723e5594f3e7c70896ffeeef32b9c950ywan// interested in the implementation details.
19851233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19852233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_FLOAT_EQ(expected, actual)\
19853233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19854233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      expected, actual)
19855233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19856233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_DOUBLE_EQ(expected, actual)\
19857233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19858233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      expected, actual)
19859233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19860233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_FLOAT_EQ(expected, actual)\
19861233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19862233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      expected, actual)
19863233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19864233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_DOUBLE_EQ(expected, actual)\
19865233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19866233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      expected, actual)
19867233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19868233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_NEAR(val1, val2, abs_error)\
19869233d2500723e5594f3e7c70896ffeeef32b9c950ywan  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19870233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      val1, val2, abs_error)
19871233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19872233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_NEAR(val1, val2, abs_error)\
19873233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19874233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      val1, val2, abs_error)
19875233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19876233d2500723e5594f3e7c70896ffeeef32b9c950ywan// These predicate format functions work on floating-point values, and
19877233d2500723e5594f3e7c70896ffeeef32b9c950ywan// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
19878233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19879233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
19880233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19881233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Asserts that val1 is less than, or almost equal to, val2.  Fails
19882233d2500723e5594f3e7c70896ffeeef32b9c950ywan// otherwise.  In particular, it fails if either val1 or val2 is NaN.
19883233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
19884233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                   float val1, float val2);
19885233d2500723e5594f3e7c70896ffeeef32b9c950ywanGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
19886233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                    double val1, double val2);
19887233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19888233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19889233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if GTEST_OS_WINDOWS
19890233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19891233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros that test for HRESULT failure and success, these are only useful
19892233d2500723e5594f3e7c70896ffeeef32b9c950ywan// on Windows, and rely on Windows SDK macros and APIs to compile.
19893233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19894233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
19895233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19896233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When expr unexpectedly fails or succeeds, Google Test prints the
19897233d2500723e5594f3e7c70896ffeeef32b9c950ywan// expected result and the actual result with both a human-readable
19898233d2500723e5594f3e7c70896ffeeef32b9c950ywan// string representation of the error, if available, as well as the
19899233d2500723e5594f3e7c70896ffeeef32b9c950ywan// hex result code.
19900233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define EXPECT_HRESULT_SUCCEEDED(expr) \
19901233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
19902233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19903233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_HRESULT_SUCCEEDED(expr) \
19904233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
19905233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19906233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define EXPECT_HRESULT_FAILED(expr) \
19907233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
19908233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19909233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define ASSERT_HRESULT_FAILED(expr) \
19910233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
19911233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19912233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_OS_WINDOWS
19913233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19914233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Macros that execute statement and check that it doesn't generate new fatal
19915233d2500723e5594f3e7c70896ffeeef32b9c950ywan// failures in the current thread.
19916233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19917233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
19918233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19919233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Examples:
19920233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19921233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   EXPECT_NO_FATAL_FAILURE(Process());
19922233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
19923233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19924233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ASSERT_NO_FATAL_FAILURE(statement) \
19925233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
19926233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define EXPECT_NO_FATAL_FAILURE(statement) \
19927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
19928233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19929233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Causes a trace (including the source file path, the current line
19930233d2500723e5594f3e7c70896ffeeef32b9c950ywan// number, and the given message) to be included in every test failure
19931233d2500723e5594f3e7c70896ffeeef32b9c950ywan// message generated by code in the current scope.  The effect is
19932233d2500723e5594f3e7c70896ffeeef32b9c950ywan// undone when the control leaves the current scope.
19933233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19934233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The message argument can be anything streamable to std::ostream.
19935233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19936233d2500723e5594f3e7c70896ffeeef32b9c950ywan// In the implementation, we include the current line number as part
19937233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
19938233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to appear in the same block - as long as they are on different
19939233d2500723e5594f3e7c70896ffeeef32b9c950ywan// lines.
19940233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define SCOPED_TRACE(message) \
19941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
19942233d2500723e5594f3e7c70896ffeeef32b9c950ywan    __FILE__, __LINE__, ::testing::Message() << (message))
19943233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19944233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Compile-time assertion for type equality.
19945233d2500723e5594f3e7c70896ffeeef32b9c950ywan// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
19946233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the same type.  The value it returns is not interesting.
19947233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19948233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Instead of making StaticAssertTypeEq a class template, we make it a
19949233d2500723e5594f3e7c70896ffeeef32b9c950ywan// function template that invokes a helper class template.  This
19950233d2500723e5594f3e7c70896ffeeef32b9c950ywan// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
19951233d2500723e5594f3e7c70896ffeeef32b9c950ywan// defining objects of that type.
19952233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19953233d2500723e5594f3e7c70896ffeeef32b9c950ywan// CAVEAT:
19954233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19955233d2500723e5594f3e7c70896ffeeef32b9c950ywan// When used inside a method of a class template,
19956233d2500723e5594f3e7c70896ffeeef32b9c950ywan// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
19957233d2500723e5594f3e7c70896ffeeef32b9c950ywan// instantiated.  For example, given:
19958233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19959233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   template <typename T> class Foo {
19960233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    public:
19961233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
19962233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   };
19963233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19964233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the code:
19965233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19966233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void Test1() { Foo<bool> foo; }
19967233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19968233d2500723e5594f3e7c70896ffeeef32b9c950ywan// will NOT generate a compiler error, as Foo<bool>::Bar() is never
19969233d2500723e5594f3e7c70896ffeeef32b9c950ywan// actually instantiated.  Instead, you need:
19970233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19971233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   void Test2() { Foo<bool> foo; foo.Bar(); }
19972233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19973233d2500723e5594f3e7c70896ffeeef32b9c950ywan// to cause a compiler error.
19974233d2500723e5594f3e7c70896ffeeef32b9c950ywantemplate <typename T1, typename T2>
19975233d2500723e5594f3e7c70896ffeeef32b9c950ywanbool StaticAssertTypeEq() {
19976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
19977233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return true;
19978233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
19979233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19980233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines a test.
19981233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19982233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The first parameter is the name of the test case, and the second
19983233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parameter is the name of the test within the test case.
19984233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19985233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The convention is to end the test case name with "Test".  For
19986233d2500723e5594f3e7c70896ffeeef32b9c950ywan// example, a test case for the Foo class can be named FooTest.
19987233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19988233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The user should put his test code between braces after using this
19989233d2500723e5594f3e7c70896ffeeef32b9c950ywan// macro.  Example:
19990233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
19991233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TEST(FooTest, InitializesCorrectly) {
19992233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Foo foo;
19993233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     EXPECT_TRUE(foo.StatusIsOK());
19994233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
19995233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19996233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Note that we call GetTestTypeId() instead of GetTypeId<
19997233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::testing::Test>() here to get the type ID of testing::Test.  This
19998233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is to work around a suspected linker bug when using Google Test as
19999233d2500723e5594f3e7c70896ffeeef32b9c950ywan// a framework on Mac OS X.  The bug causes GetTypeId<
20000233d2500723e5594f3e7c70896ffeeef32b9c950ywan// ::testing::Test>() to return different values depending on whether
20001233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the call is from the Google Test framework itself or from user test
20002233d2500723e5594f3e7c70896ffeeef32b9c950ywan// code.  GetTestTypeId() is guaranteed to always return the same
20003233d2500723e5594f3e7c70896ffeeef32b9c950ywan// value, as it always calls GetTypeId<>() from the Google Test
20004233d2500723e5594f3e7c70896ffeeef32b9c950ywan// framework.
20005233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define GTEST_TEST(test_case_name, test_name)\
20006233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_(test_case_name, test_name, \
20007233d2500723e5594f3e7c70896ffeeef32b9c950ywan              ::testing::Test, ::testing::internal::GetTestTypeId())
20008233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20009233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Define this macro to 1 to omit the definition of TEST(), which
20010233d2500723e5594f3e7c70896ffeeef32b9c950ywan// is a generic name and clashes with some other libraries.
20011233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !GTEST_DONT_DEFINE_TEST
20012233d2500723e5594f3e7c70896ffeeef32b9c950ywan# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
20013233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
20014233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20015233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Defines a test that uses a test fixture.
20016233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20017233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The first parameter is the name of the test fixture class, which
20018233d2500723e5594f3e7c70896ffeeef32b9c950ywan// also doubles as the test case name.  The second parameter is the
20019233d2500723e5594f3e7c70896ffeeef32b9c950ywan// name of the test within the test case.
20020233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20021233d2500723e5594f3e7c70896ffeeef32b9c950ywan// A test fixture class must be declared earlier.  The user should put
20022233d2500723e5594f3e7c70896ffeeef32b9c950ywan// his test code between braces after using this macro.  Example:
20023233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20024233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   class FooTest : public testing::Test {
20025233d2500723e5594f3e7c70896ffeeef32b9c950ywan//    protected:
20026233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     virtual void SetUp() { b_.AddElement(3); }
20027233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20028233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Foo a_;
20029233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     Foo b_;
20030233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   };
20031233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20032233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TEST_F(FooTest, InitializesCorrectly) {
20033233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     EXPECT_TRUE(a_.StatusIsOK());
20034233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
20035233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20036233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
20037233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     EXPECT_EQ(0, a_.size());
20038233d2500723e5594f3e7c70896ffeeef32b9c950ywan//     EXPECT_EQ(1, b_.size());
20039233d2500723e5594f3e7c70896ffeeef32b9c950ywan//   }
20040233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20041233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define TEST_F(test_fixture, test_name)\
20042233d2500723e5594f3e7c70896ffeeef32b9c950ywan  GTEST_TEST_(test_fixture, test_name, test_fixture, \
20043233d2500723e5594f3e7c70896ffeeef32b9c950ywan              ::testing::internal::GetTypeId<test_fixture>())
20044233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20045233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // namespace testing
20046233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20047233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Use this function in main() to run all tests.  It returns 0 if all
20048233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tests are successful, or 1 otherwise.
20049233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20050233d2500723e5594f3e7c70896ffeeef32b9c950ywan// RUN_ALL_TESTS() should be invoked after the command line has been
20051233d2500723e5594f3e7c70896ffeeef32b9c950ywan// parsed by InitGoogleTest().
20052233d2500723e5594f3e7c70896ffeeef32b9c950ywan//
20053233d2500723e5594f3e7c70896ffeeef32b9c950ywan// This function was formerly a macro; thus, it is in the global
20054233d2500723e5594f3e7c70896ffeeef32b9c950ywan// namespace and has an all-caps name.
20055233d2500723e5594f3e7c70896ffeeef32b9c950ywanint RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
20056233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20057233d2500723e5594f3e7c70896ffeeef32b9c950ywaninline int RUN_ALL_TESTS() {
20058233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return ::testing::UnitTest::GetInstance()->Run();
20059233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
20060233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20061233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
20062