11b362b15af34006e6a11974088a46d42b903418eJohann// Copyright 2005, Google Inc.
21b362b15af34006e6a11974088a46d42b903418eJohann// All rights reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann//
41b362b15af34006e6a11974088a46d42b903418eJohann// Redistribution and use in source and binary forms, with or without
51b362b15af34006e6a11974088a46d42b903418eJohann// modification, are permitted provided that the following conditions are
61b362b15af34006e6a11974088a46d42b903418eJohann// met:
71b362b15af34006e6a11974088a46d42b903418eJohann//
81b362b15af34006e6a11974088a46d42b903418eJohann//     * Redistributions of source code must retain the above copyright
91b362b15af34006e6a11974088a46d42b903418eJohann// notice, this list of conditions and the following disclaimer.
101b362b15af34006e6a11974088a46d42b903418eJohann//     * Redistributions in binary form must reproduce the above
111b362b15af34006e6a11974088a46d42b903418eJohann// copyright notice, this list of conditions and the following disclaimer
121b362b15af34006e6a11974088a46d42b903418eJohann// in the documentation and/or other materials provided with the
131b362b15af34006e6a11974088a46d42b903418eJohann// distribution.
141b362b15af34006e6a11974088a46d42b903418eJohann//     * Neither the name of Google Inc. nor the names of its
151b362b15af34006e6a11974088a46d42b903418eJohann// contributors may be used to endorse or promote products derived from
161b362b15af34006e6a11974088a46d42b903418eJohann// this software without specific prior written permission.
171b362b15af34006e6a11974088a46d42b903418eJohann//
181b362b15af34006e6a11974088a46d42b903418eJohann// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
191b362b15af34006e6a11974088a46d42b903418eJohann// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
201b362b15af34006e6a11974088a46d42b903418eJohann// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
211b362b15af34006e6a11974088a46d42b903418eJohann// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
221b362b15af34006e6a11974088a46d42b903418eJohann// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
231b362b15af34006e6a11974088a46d42b903418eJohann// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
241b362b15af34006e6a11974088a46d42b903418eJohann// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
251b362b15af34006e6a11974088a46d42b903418eJohann// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
261b362b15af34006e6a11974088a46d42b903418eJohann// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
271b362b15af34006e6a11974088a46d42b903418eJohann// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
281b362b15af34006e6a11974088a46d42b903418eJohann// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
291b362b15af34006e6a11974088a46d42b903418eJohann//
301b362b15af34006e6a11974088a46d42b903418eJohann// Author: wan@google.com (Zhanyong Wan)
311b362b15af34006e6a11974088a46d42b903418eJohann//
321b362b15af34006e6a11974088a46d42b903418eJohann// The Google C++ Testing Framework (Google Test)
331b362b15af34006e6a11974088a46d42b903418eJohann//
341b362b15af34006e6a11974088a46d42b903418eJohann// This header file defines the public API for Google Test.  It should be
351b362b15af34006e6a11974088a46d42b903418eJohann// included by any test program that uses Google Test.
361b362b15af34006e6a11974088a46d42b903418eJohann//
371b362b15af34006e6a11974088a46d42b903418eJohann// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
381b362b15af34006e6a11974088a46d42b903418eJohann// leave some internal implementation details in this header file.
391b362b15af34006e6a11974088a46d42b903418eJohann// They are clearly marked by comments like this:
401b362b15af34006e6a11974088a46d42b903418eJohann//
411b362b15af34006e6a11974088a46d42b903418eJohann//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
421b362b15af34006e6a11974088a46d42b903418eJohann//
431b362b15af34006e6a11974088a46d42b903418eJohann// Such code is NOT meant to be used by a user directly, and is subject
441b362b15af34006e6a11974088a46d42b903418eJohann// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
451b362b15af34006e6a11974088a46d42b903418eJohann// program!
461b362b15af34006e6a11974088a46d42b903418eJohann//
471b362b15af34006e6a11974088a46d42b903418eJohann// Acknowledgment: Google Test borrowed the idea of automatic test
481b362b15af34006e6a11974088a46d42b903418eJohann// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
491b362b15af34006e6a11974088a46d42b903418eJohann// easyUnit framework.
501b362b15af34006e6a11974088a46d42b903418eJohann
511b362b15af34006e6a11974088a46d42b903418eJohann#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
521b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_INCLUDE_GTEST_GTEST_H_
531b362b15af34006e6a11974088a46d42b903418eJohann
541b362b15af34006e6a11974088a46d42b903418eJohann#include <limits>
555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ostream>
561b362b15af34006e6a11974088a46d42b903418eJohann#include <vector>
571b362b15af34006e6a11974088a46d42b903418eJohann
585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file declares functions and macros used internally by
925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test.  They are subject to change without notice.
935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
1015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
1025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
1035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
1055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
1065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
1075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
1085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
1095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
1105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
1115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
1125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: wan@google.com (Zhanyong Wan)
1275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Low-level types and utilities for porting Google Test to various
1295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// platforms.  They are subject to change without notice.  DO NOT USE
1305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEM IN USER CODE.
1315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file is fundamental to Google Test.  All other Google Test source
1335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// files are expected to #include this.  Therefore, it cannot #include
1345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// any other Google Test header.
1355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
1375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
1385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user can define the following macros in the build script to
1405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// control Google Test's behavior.  If the user doesn't define a macro
1415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in this list, Google Test will define it.
1425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
1445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              is/isn't available.
1455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
1465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              are enabled.
1475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
1485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              is/isn't available (some systems define
1495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              ::string, which is different to std::string).
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
1515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              is/isn't available (some systems define
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              ::wstring, which is different to std::wstring).
1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
1545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              expressions are/aren't available.
1555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
1565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              is/isn't available.
1575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
1585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              enabled.
1595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
1605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              std::wstring does/doesn't work (Google Test can
1615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              be used where std::wstring is unavailable).
1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              is/isn't available.
1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              compiler supports Microsoft's "Structured
1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              Exception Handling".
1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_STREAM_REDIRECTION
1685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            - Define it to 1/0 to indicate whether the
1695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              platform supports I/O stream redirection using
1705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              dup() and dup2().
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
1725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              Test's own tr1 tuple implementation should be
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              used.  Unused when the user sets
1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              GTEST_HAS_TR1_TUPLE to 0.
1755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
1765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              is building in C++11/C++98 mode.
1775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_LINKED_AS_SHARED_LIBRARY
1785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            - Define to 1 when compiling tests that use
1795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              Google Test as a shared library (known as
1805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              DLL on Windows).
1815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_CREATE_SHARED_LIBRARY
1825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            - Define to 1 when compiling Google Test itself
1835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              as a shared library.
1845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header defines the following utilities:
1865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macros indicating the current platform (defined to 1 if compiled on
1885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the given platform; otherwise undefined):
1895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_AIX      - IBM AIX
1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_CYGWIN   - Cygwin
1915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_HPUX     - HP-UX
1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_LINUX    - Linux
1935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_OS_LINUX_ANDROID - Google Android
1945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_MAC      - Mac OS X
1955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_OS_IOS    - iOS
1965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       GTEST_OS_IOS_SIMULATOR - iOS simulator
1975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_NACL     - Google Native Client (NaCl)
1985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_OPENBSD  - OpenBSD
1995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_QNX      - QNX
2005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_SOLARIS  - Sun Solaris
2015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_SYMBIAN  - Symbian
2025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
2035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
2045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_OS_WINDOWS_MINGW    - MinGW
2055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
2065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_OS_ZOS      - z/OS
2075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
2095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// most stable support.  Since core members of the Google Test project
2105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// don't have access to other platforms, support for them may be less
2115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// stable.  If you notice any problems on your platform, please notify
2125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// googletestframework@googlegroups.com (patches for fixing them are
2135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// even more welcome!).
2145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that it is possible that none of the GTEST_OS_* macros are defined.
2165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macros indicating available Google Test features (defined to 1 if
2185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the corresponding feature is supported; otherwise undefined):
2195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
2205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            tests)
2215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_DEATH_TEST   - death tests
2225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
2235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_TYPED_TEST   - typed tests
2245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
2255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
2265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            GTEST_HAS_POSIX_RE (see above) which users can
2275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            define themselves.
2285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
2295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            the above two are mutually exclusive.
2305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
2315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macros for basic C++ coding:
2335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
2345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
2355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                              variable don't have to be used.
2365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
2375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
2385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
2395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Synchronization:
2415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
2425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                  - synchronization primitives.
2435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
2445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         synchronization primitives have real implementations
2455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         and Google Test is thread-safe; or 0 otherwise.
2465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Template meta programming:
2485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
2495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   IteratorTraits - partial implementation of std::iterator_traits, which
2505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                    is not available in libCstd when compiled with Sun C++.
2515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Smart pointers:
2535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   scoped_ptr     - as in TR2.
2545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Regular expressions:
2565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   RE             - a simple regular expression class using the POSIX
2575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                    Extended Regular Expression syntax on UNIX-like
2585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                    platforms, or a reduced regular exception syntax on
2595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                    other platforms, including Windows.
2605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Logging:
2625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_LOG_()   - logs messages at the specified severity level.
2635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   LogToStderr()  - directs all log messages to stderr.
2645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   FlushInfoLog() - flushes informational log messages.
2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Stdout and stderr capturing:
2675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   CaptureStdout()     - starts capturing stdout.
2685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GetCapturedStdout() - stops capturing stdout and returns the captured
2695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         string.
2705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   CaptureStderr()     - starts capturing stderr.
2715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GetCapturedStderr() - stops capturing stderr and returns the captured
2725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         string.
2735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Integer types:
2755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   TypeWithSize   - maps an integer to a int type.
2765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Int32, UInt32, Int64, UInt64, TimeInMillis
2775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                  - integers of known sizes.
2785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   BiggestInt     - the biggest signed integer type.
2795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Command-line utilities:
2815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_FLAG()       - references a flag.
2825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_DECLARE_*()  - declares a flag.
2835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_DEFINE_*()   - defines a flag.
2845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GetInjectableArgvs() - returns the command line as a vector of strings.
2855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Environment variable utilities:
2875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GetEnv()             - gets the value of an environment variable.
2885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   BoolFromGTestEnv()   - parses a bool environment variable.
2895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Int32FromGTestEnv()  - parses an Int32 environment variable.
2905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   StringFromGTestEnv() - parses a string environment variable.
2915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ctype.h>   // for isspace, etc
2935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stddef.h>  // for ptrdiff_t
2945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>
2955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
2965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string.h>
2975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef _WIN32_WCE
2985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/types.h>
2995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/stat.h>
3005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // !_WIN32_WCE
3015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined __APPLE__
3035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <AvailabilityMacros.h>
3045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <TargetConditionals.h>
3055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <iostream>  // NOLINT
3085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <sstream>  // NOLINT
3095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string>  // NOLINT
3105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
3125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_FLAG_PREFIX_ "gtest_"
3135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
3145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
3155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_NAME_ "Google Test"
3165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
3175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines the version of gcc that is used to compile this.
3195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __GNUC__
3205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 40302 means version 4.3.2.
3215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_GCC_VER_ \
3225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
3235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // __GNUC__
3245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines the platform on which Google Test is compiled.
3265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __CYGWIN__
3275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_CYGWIN 1
3285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __SYMBIAN32__
3295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_SYMBIAN 1
3305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined _WIN32
3315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_WINDOWS 1
3325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# ifdef _WIN32_WCE
3335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_OS_WINDOWS_MOBILE 1
3345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__MINGW__) || defined(__MINGW32__)
3355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_OS_WINDOWS_MINGW 1
3365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
3375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_OS_WINDOWS_DESKTOP 1
3385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // _WIN32_WCE
3395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __APPLE__
3405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_MAC 1
3415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if TARGET_OS_IPHONE
3425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_OS_IOS 1
3435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if TARGET_IPHONE_SIMULATOR
3445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_OS_IOS_SIMULATOR 1
3455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif
3465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
3475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __linux__
3485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_LINUX 1
3495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if defined __ANDROID__
3505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_OS_LINUX_ANDROID 1
3515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
3525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __MVS__
3535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_ZOS 1
3545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(__sun) && defined(__SVR4)
3555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_SOLARIS 1
3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(_AIX)
3575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_AIX 1
3585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(__hpux)
3595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_HPUX 1
3605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __native_client__
3615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_NACL 1
3625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __OpenBSD__
3635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_OPENBSD 1
3645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined __QNX__
3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_OS_QNX 1
3665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // __CYGWIN__
3675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_LANG_CXX11
3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
3715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value for __cplusplus, and recent versions of clang, gcc, and
3725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// probably other compilers set that too in C++11 mode.
3735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
3745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Compiling in at least C++11 mode.
3755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_LANG_CXX11 1
3765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
3775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_LANG_CXX11 0
3785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
3795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Brings in definitions for functions used in the testing::internal::posix
3825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// namespace (read, write, close, chdir, isatty, stat). We do not currently
3835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use them on Windows Mobile.
3845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !GTEST_OS_WINDOWS
3855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This assumes that non-Windows OSes provide unistd.h. For OSes where this
3865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is not the case, we need to include headers that provide the functions
3875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// mentioned above.
3885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <unistd.h>
3895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <strings.h>
3905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif !GTEST_OS_WINDOWS_MOBILE
3915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <direct.h>
3925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <io.h>
3935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_LINUX_ANDROID
3965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used to define __ANDROID_API__ matching the target NDK API level.
3975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <android/api-level.h>  // NOLINT
3985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines this to true iff Google Test can use POSIX regular expressions.
4015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_POSIX_RE
4025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_LINUX_ANDROID
4035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Android, <regex.h> is only available starting with Gingerbread.
4045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
4055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
4065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
4075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
4085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
4095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_POSIX_RE
4115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On some platforms, <regex.h> needs someone to define size_t, and
4135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// won't compile otherwise.  We can #include it here as we already
4145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// included <stdlib.h>, which is guaranteed to define size_t through
4155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// <stddef.h>.
4165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <regex.h>  // NOLINT
4175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_USES_POSIX_RE 1
4195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS
4215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// <regex.h> is not available on Windows.  Use our own simple regex
4235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation instead.
4245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_USES_SIMPLE_RE 1
4255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
4275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// <regex.h> may not be available on this platform.  Use our own
4295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// simple regex implementation instead.
4305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_USES_SIMPLE_RE 1
4315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_POSIX_RE
4335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_EXCEPTIONS
4355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us whether exceptions are enabled, so we need
4365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to figure it out.
4375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if defined(_MSC_VER) || defined(__BORLANDC__)
4385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
4395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macro to enable exceptions, so we'll do the same.
4405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Assumes that exceptions are enabled by default.
4415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  ifndef _HAS_EXCEPTIONS
4425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define _HAS_EXCEPTIONS 1
4435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // _HAS_EXCEPTIONS
4445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
4455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__GNUC__) && __EXCEPTIONS
4465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
4475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_EXCEPTIONS 1
4485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__SUNPRO_CC)
4495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sun Pro CC supports exceptions.  However, there is no compile-time way of
4505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// detecting whether they are enabled or not.  Therefore, we assume that
4515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// they are enabled unless the user tells us otherwise.
4525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_EXCEPTIONS 1
4535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__IBMCPP__) && __EXCEPTIONS
4545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
4555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_EXCEPTIONS 1
4565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__HP_aCC)
4575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Exception handling is in effect by default in HP aCC compiler. It has to
4585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// be turned of by +noeh compiler option if desired.
4595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_EXCEPTIONS 1
4605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
4615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For other compilers, we assume exceptions are disabled to be
4625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// conservative.
4635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_EXCEPTIONS 0
4645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
4655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_EXCEPTIONS
4665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !defined(GTEST_HAS_STD_STRING)
4685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Even though we don't use this macro any longer, we keep it in case
4695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// some clients still depend on it.
4705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_STD_STRING 1
4715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif !GTEST_HAS_STD_STRING
4725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user told us that ::std::string isn't available.
4735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# error "Google Test cannot be used where ::std::string isn't available."
4745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // !defined(GTEST_HAS_STD_STRING)
4755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_GLOBAL_STRING
4775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us whether ::string is available, so we need
4785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to figure it out.
4795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_GLOBAL_STRING 0
4815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_STRING
4835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_STD_WSTRING
4855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us whether ::std::wstring is available, so we need
4865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to figure it out.
4875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring
4885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   is available.
4895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Cygwin 1.7 and below doesn't support ::std::wstring.
4915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Solaris' libc++ doesn't support it either.  Android has
4925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// no support for it at least as recent as Froyo (2.2).
4935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_STD_WSTRING \
4945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
4955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING
4975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_GLOBAL_WSTRING
4995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us whether ::wstring is available, so we need
5005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to figure it out.
5015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_GLOBAL_WSTRING \
5025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
5035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_WSTRING
5045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether RTTI is available.
5065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_RTTI
5075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us whether RTTI is enabled, so we need to
5085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// figure it out.
5095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# ifdef _MSC_VER
5115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
5135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_HAS_RTTI 1
5145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
5155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_HAS_RTTI 0
5165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif
5175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
5195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
5205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  ifdef __GXX_RTTI
5225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// When building against STLport with the Android NDK and with
5235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// -frtti -fno-exceptions, the build fails at link time with undefined
5245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
5255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// so disable RTTI when detected.
5265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
5275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       !defined(__EXCEPTIONS)
5285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#    define GTEST_HAS_RTTI 0
5295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   else
5305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#    define GTEST_HAS_RTTI 1
5315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
5325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
5335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_HAS_RTTI 0
5345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // __GXX_RTTI
5355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
5375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
5385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// first version with C++ support.
5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__clang__)
5405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
5425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
5445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// both the typeid and dynamic_cast features are present.
5455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
5465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  ifdef __RTTI_ALL__
5485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_HAS_RTTI 1
5495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
5505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_HAS_RTTI 0
5515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif
5525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
5545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For all other compilers, we assume RTTI is enabled.
5565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_RTTI 1
5575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // _MSC_VER
5595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_RTTI
5615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// It's this header's responsibility to #include <typeinfo> when RTTI
5635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is enabled.
5645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_RTTI
5655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <typeinfo>
5665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
5675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether Google Test can use the pthreads library.
5695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_PTHREAD
5705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us explicitly, so we assume pthreads support is
5715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// available on Linux and Mac.
5725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
5735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
5745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to your compiler flags.
5755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
5765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    || GTEST_OS_QNX)
5775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PTHREAD
5785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PTHREAD
5805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
5815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// true.
5825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <pthread.h>  // NOLINT
5835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For timespec and nanosleep, used below.
5855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <time.h>  // NOLINT
5865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
5875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether Google Test can use tr1/tuple.  You can define
5895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this macro to 0 to prevent Google Test from using tuple (any
5905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// feature depending on tuple with be disabled in this mode).
5915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_TR1_TUPLE
5925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
5935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
5945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_TR1_TUPLE 0
5955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
5965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us not to do it, so we assume it's OK.
5975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_TR1_TUPLE 1
5985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
5995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TR1_TUPLE
6005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether Google Test's own tr1 tuple implementation
6025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// should be used.
6035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_USE_OWN_TR1_TUPLE
6045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us, so we need to figure it out.
6055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We use our own TR1 tuple if we aren't sure the user has an
6075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation of it already.  At this time, libstdc++ 4.0.0+ and
6085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC 2010 are the only mainstream standard libraries that come
6095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
6105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pretends to be GCC by defining __GNUC__ and friends, but cannot
6115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
6125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tuple in a 323 MB Feature Pack download, which we cannot assume the
6135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// user has.  QNX's QCC compiler is a modified GCC but it doesn't
6145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
6155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and it can be used with some compilers that define __GNUC__.
6165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
6175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
6185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
6195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
6205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
6225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
6235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// can build with clang but need to use gcc4.2's libstdc++).
6245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
6255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_ENV_HAS_STD_TUPLE_ 1
6265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
6275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
6295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_USE_OWN_TR1_TUPLE 0
6305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
6315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_USE_OWN_TR1_TUPLE 1
6325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
6335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_USE_OWN_TR1_TUPLE
6355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To avoid conditional compilation everywhere, we make it
6375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gtest-port.h's responsibility to #include the header implementing
6385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tr1/tuple.
6395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TR1_TUPLE
6405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_USE_OWN_TR1_TUPLE
6425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file was GENERATED by command:
6435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     pump.py gtest-tuple.h.pump
6445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DO NOT EDIT BY HAND!!!
6455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2009 Google Inc.
6475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All Rights Reserved.
6485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
6495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
6505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
6515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
6525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
6535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
6545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
6555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
6565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
6575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
6585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
6595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
6605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
6615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
6625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
6635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
6655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
6675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
6685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
6695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
6705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
6715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
6725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
6735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
6755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
6765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
6785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
6805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
6815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <utility>  // For ::std::pair.
6835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The compiler used in Symbian has a bug that prevents us from declaring the
6855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tuple template as a friend (it complains that tuple is redefined).  This
6865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// hack bypasses the bug by declaring the members that should otherwise be
6875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// private as public.
6885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sun Studio versions < 12 also have the above bug.
6895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
6905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
6915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
6925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
6935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
6945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
6955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
6965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_n_TUPLE_(T) is the type of an n-tuple.
6985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_0_TUPLE_(T) tuple<>
6995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
7005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
7025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
7045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
7065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
7085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
7105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
7125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void, void, void>
7135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
7145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T##7, void, void>
7155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
7165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T##7, T##8, void>
7175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
7185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T##7, T##8, T##9>
7195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
7215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_0_TYPENAMES_(T)
7225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_1_TYPENAMES_(T) typename T##0
7235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
7245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
7255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3
7275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3, typename T##4
7295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3, typename T##4, typename T##5
7315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3, typename T##4, typename T##5, typename T##6
7335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
7355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3, typename T##4, typename T##5, typename T##6, \
7375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##7, typename T##8
7385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
7395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##3, typename T##4, typename T##5, typename T##6, \
7405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T##7, typename T##8, typename T##9
7415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In theory, defining stuff in the ::std namespace is undefined
7435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// behavior.  We can do this as we are playing the role of a standard
7445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// library vendor.
7455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace std {
7465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace tr1 {
7475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T0 = void, typename T1 = void, typename T2 = void,
7495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T3 = void, typename T4 = void, typename T5 = void,
7505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6 = void, typename T7 = void, typename T8 = void,
7515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T9 = void>
7525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass tuple;
7535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Anything in namespace gtest_internal is Google Test's INTERNAL
7555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
7565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace gtest_internal {
7575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
7595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
7605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct ByRef { typedef const T& type; };  // NOLINT
7615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
7625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct ByRef<T&> { typedef T& type; };  // NOLINT
7635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A handy wrapper for ByRef.
7655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
7665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
7685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is the same as tr1::add_reference<T>::type.
7695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
7705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct AddRef { typedef T& type; };  // NOLINT
7715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
7725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct AddRef<T&> { typedef T& type; };  // NOLINT
7735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A handy wrapper for AddRef.
7755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
7765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A helper for implementing get<k>().
7785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int k> class Get;
7795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A helper for implementing tuple_element<k, T>.  kIndexValid is true
7815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// iff k < the number of fields in tuple type T.
7825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <bool kIndexValid, int kIndex, class Tuple>
7835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement;
7845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
7865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
7875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T0 type;
7885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
7895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
7915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
7925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 type;
7935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
7945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
7965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
7975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T2 type;
7985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
7995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
8025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T3 type;
8035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
8075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T4 type;
8085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
8125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T5 type;
8135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
8175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T6 type;
8185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
8225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T7 type;
8235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
8275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T8 type;
8285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
8315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
8325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T9 type;
8335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace gtest_internal
8365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
8385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass tuple<> {
8395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() {}
8415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& /* t */)  {}
8425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& /* t */) { return *this; }
8435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_1_TYPENAMES_(T)>
8465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_1_TUPLE_(T) {
8475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
8495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_() {}
8515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
8535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_) {}
8555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_1_TYPENAMES_(U)>
8575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
8585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
8605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_1_TYPENAMES_(U)>
8625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
8635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
8645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
8655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
8675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_1_TYPENAMES_(U)>
8695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
8705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
8715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
8725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
8735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
8755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_2_TYPENAMES_(T)>
8785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_2_TUPLE_(T) {
8795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
8815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_() {}
8835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
8855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f1_(f1) {}
8865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
8885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_2_TYPENAMES_(U)>
8905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
8915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U0, typename U1>
8925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
8935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
8955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_2_TYPENAMES_(U)>
8975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
8985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
8995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U0, typename U1>
9015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const ::std::pair<U0, U1>& p) {
9025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = p.first;
9035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = p.second;
9045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
9055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
9085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_2_TYPENAMES_(U)>
9105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
9115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
9125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
9135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
9145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
9175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
9185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
9195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_3_TYPENAMES_(T)>
9215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_3_TUPLE_(T) {
9225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
9235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
9245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_() {}
9265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
9285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
9295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
9315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_3_TYPENAMES_(U)>
9335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
9345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
9365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_3_TYPENAMES_(U)>
9385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
9395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
9405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
9435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_3_TYPENAMES_(U)>
9455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
9465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
9475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
9485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
9495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
9505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
9535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
9545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
9555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
9565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_4_TYPENAMES_(T)>
9585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_4_TUPLE_(T) {
9595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
9605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
9615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_() {}
9635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
9655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
9665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(f3) {}
9675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
9695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_4_TYPENAMES_(U)>
9715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
9725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_) {}
9735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
9755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_4_TYPENAMES_(U)>
9775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
9785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
9795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
9825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_4_TYPENAMES_(U)>
9845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
9855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
9865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
9875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
9885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
9895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
9905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
9935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
9945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
9955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
9965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
9975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_5_TYPENAMES_(T)>
9995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_5_TUPLE_(T) {
10005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
10015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
10025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
10045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
10065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
10075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
10085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
10105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f4_(t.f4_) {}
10115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_5_TYPENAMES_(U)>
10135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
10145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_), f4_(t.f4_) {}
10155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
10175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_5_TYPENAMES_(U)>
10195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
10205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
10215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
10245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_5_TYPENAMES_(U)>
10265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
10275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
10285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
10295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
10305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
10315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f4_ = t.f4_;
10325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
10335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
10365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
10375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
10385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
10395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T4 f4_;
10405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
10415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_6_TYPENAMES_(T)>
10435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_6_TUPLE_(T) {
10445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
10455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
10465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
10485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
10505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
10515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
10525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f5_(f5) {}
10535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
10555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f4_(t.f4_), f5_(t.f5_) {}
10565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_6_TYPENAMES_(U)>
10585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
10595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
10605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
10625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_6_TYPENAMES_(U)>
10645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
10655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
10665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
10695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_6_TYPENAMES_(U)>
10715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
10725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
10735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
10745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
10755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
10765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f4_ = t.f4_;
10775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f5_ = t.f5_;
10785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
10795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
10825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
10835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
10845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
10855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T4 f4_;
10865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T5 f5_;
10875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
10885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_7_TYPENAMES_(T)>
10905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_7_TUPLE_(T) {
10915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
10925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
10935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
10955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
10975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
10985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
10995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
11005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
11025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
11035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_7_TYPENAMES_(U)>
11055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
11065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
11075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
11095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_7_TYPENAMES_(U)>
11115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
11125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
11135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
11165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_7_TYPENAMES_(U)>
11185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
11195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
11205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
11215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
11225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
11235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f4_ = t.f4_;
11245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f5_ = t.f5_;
11255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f6_ = t.f6_;
11265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
11275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
11305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
11315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
11325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
11335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T4 f4_;
11345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T5 f5_;
11355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T6 f6_;
11365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
11375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_8_TYPENAMES_(T)>
11395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_8_TUPLE_(T) {
11405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
11415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
11425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
11445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
11465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
11475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
11485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
11495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f5_(f5), f6_(f6), f7_(f7) {}
11505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
11525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
11535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_8_TYPENAMES_(U)>
11555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
11565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
11575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
11595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_8_TYPENAMES_(U)>
11615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
11625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
11635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
11665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_8_TYPENAMES_(U)>
11685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
11695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
11705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
11715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
11725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
11735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f4_ = t.f4_;
11745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f5_ = t.f5_;
11755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f6_ = t.f6_;
11765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f7_ = t.f7_;
11775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
11785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
11815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
11825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
11835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
11845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T4 f4_;
11855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T5 f5_;
11865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T6 f6_;
11875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T7 f7_;
11885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
11895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_9_TYPENAMES_(T)>
11915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_9_TUPLE_(T) {
11925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
11935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
11945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
11965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
11985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
11995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
12005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
12015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
12025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
12045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
12055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_9_TYPENAMES_(U)>
12075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
12085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
12095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
12115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_9_TYPENAMES_(U)>
12135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
12145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
12155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
12165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
12185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_9_TYPENAMES_(U)>
12205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
12215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
12225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
12235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
12245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
12255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f4_ = t.f4_;
12265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f5_ = t.f5_;
12275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f6_ = t.f6_;
12285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f7_ = t.f7_;
12295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f8_ = t.f8_;
12305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
12315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
12325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
12345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
12355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
12365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
12375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T4 f4_;
12385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T5 f5_;
12395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T6 f6_;
12405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T7 f7_;
12415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T8 f8_;
12425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
12435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
12455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass tuple {
12465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
12475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <int k> friend class gtest_internal::Get;
12485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
12505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f9_() {}
12515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
12535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
12545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
12555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
12565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
12575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
12595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
12605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_10_TYPENAMES_(U)>
12625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
12635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
12645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      f9_(t.f9_) {}
12655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const tuple& t) { return CopyFrom(t); }
12675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_10_TYPENAMES_(U)>
12695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
12705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return CopyFrom(t);
12715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
12725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DECLARE_TUPLE_AS_FRIEND_
12745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <GTEST_10_TYPENAMES_(U)>
12765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
12775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f0_ = t.f0_;
12785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f1_ = t.f1_;
12795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f2_ = t.f2_;
12805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f3_ = t.f3_;
12815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f4_ = t.f4_;
12825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f5_ = t.f5_;
12835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f6_ = t.f6_;
12845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f7_ = t.f7_;
12855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f8_ = t.f8_;
12865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    f9_ = t.f9_;
12875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
12885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
12895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T0 f0_;
12915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T1 f1_;
12925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T2 f2_;
12935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T3 f3_;
12945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T4 f4_;
12955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T5 f5_;
12965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T6 f6_;
12975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T7 f7_;
12985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T8 f8_;
12995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T9 f9_;
13005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 6.1.3.2 Tuple creation functions.
13035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Known limitations: we don't support passing an
13055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
13065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implement tie().
13075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline tuple<> make_tuple() { return tuple<>(); }
13095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_1_TYPENAMES_(T)>
13115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
13125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_1_TUPLE_(T)(f0);
13135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_2_TYPENAMES_(T)>
13165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
13175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_2_TUPLE_(T)(f0, f1);
13185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_3_TYPENAMES_(T)>
13215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
13225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_3_TUPLE_(T)(f0, f1, f2);
13235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_4_TYPENAMES_(T)>
13265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3) {
13285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
13295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_5_TYPENAMES_(T)>
13325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3, const T4& f4) {
13345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
13355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_6_TYPENAMES_(T)>
13385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3, const T4& f4, const T5& f5) {
13405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
13415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_7_TYPENAMES_(T)>
13445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
13465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
13475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_8_TYPENAMES_(T)>
13505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
13525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
13535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_9_TYPENAMES_(T)>
13565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
13585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T8& f8) {
13595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
13605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
13635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
13645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
13655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T8& f8, const T9& f9) {
13665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
13675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 6.1.3.3 Tuple helper classes.
13705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Tuple> struct tuple_size;
13725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_0_TYPENAMES_(T)>
13745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_0_TUPLE_(T) > {
13755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 0;
13765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_1_TYPENAMES_(T)>
13795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_1_TUPLE_(T) > {
13805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 1;
13815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_2_TYPENAMES_(T)>
13845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_2_TUPLE_(T) > {
13855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 2;
13865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_3_TYPENAMES_(T)>
13895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_3_TUPLE_(T) > {
13905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 3;
13915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_4_TYPENAMES_(T)>
13945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_4_TUPLE_(T) > {
13955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 4;
13965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_5_TYPENAMES_(T)>
13995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_5_TUPLE_(T) > {
14005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 5;
14015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_6_TYPENAMES_(T)>
14045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_6_TUPLE_(T) > {
14055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 6;
14065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_7_TYPENAMES_(T)>
14095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_7_TUPLE_(T) > {
14105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 7;
14115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_8_TYPENAMES_(T)>
14145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_8_TUPLE_(T) > {
14155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 8;
14165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_9_TYPENAMES_(T)>
14195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_9_TUPLE_(T) > {
14205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 9;
14215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T)>
14245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_size<GTEST_10_TUPLE_(T) > {
14255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const int value = 10;
14265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int k, class Tuple>
14295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct tuple_element {
14305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename gtest_internal::TupleElement<
14315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
14325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
14355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 6.1.3.4 Element access.
14375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace gtest_internal {
14395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
14415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<0> {
14425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
14455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f0_; }  // NOLINT
14465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
14495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f0_; }
14505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
14535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<1> {
14545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
14575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f1_; }  // NOLINT
14585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
14615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f1_; }
14625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
14655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<2> {
14665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
14695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f2_; }  // NOLINT
14705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
14735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f2_; }
14745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
14775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<3> {
14785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
14815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f3_; }  // NOLINT
14825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
14855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f3_; }
14865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
14895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<4> {
14905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
14935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f4_; }  // NOLINT
14945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
14965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
14975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f4_; }
14985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
15015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<5> {
15025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
15035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
15055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f5_; }  // NOLINT
15065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
15095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f5_; }
15105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
15115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
15135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<6> {
15145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
15155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
15175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f6_; }  // NOLINT
15185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
15215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f6_; }
15225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
15235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
15255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<7> {
15265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
15275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
15295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f7_; }  // NOLINT
15305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
15335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f7_; }
15345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
15355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
15375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<8> {
15385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
15395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
15415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f8_; }  // NOLINT
15425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
15455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f8_; }
15465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
15475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
15495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Get<9> {
15505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
15515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
15535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Field(Tuple& t) { return t.f9_; }  // NOLINT
15545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple>
15565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
15575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstField(const Tuple& t) { return t.f9_; }
15585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
15595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace gtest_internal
15615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int k, GTEST_10_TYPENAMES_(T)>
15635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
15645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangget(GTEST_10_TUPLE_(T)& t) {
15655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return gtest_internal::Get<k>::Field(t);
15665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
15675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int k, GTEST_10_TYPENAMES_(T)>
15695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
15705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangget(const GTEST_10_TUPLE_(T)& t) {
15715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return gtest_internal::Get<k>::ConstField(t);
15725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
15735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 6.1.3.5 Relational operators
15755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We only implement == and !=, as we don't have a need for the rest yet.
15775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace gtest_internal {
15795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
15815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// first k fields of t1 equals the first k fields of t2.
15825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
15835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// k1 != k2.
15845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int kSize1, int kSize2>
15855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct SameSizeTuplePrefixComparator;
15865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
15885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct SameSizeTuplePrefixComparator<0, 0> {
15895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple1, class Tuple2>
15905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
15915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
15925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
15945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int k>
15965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct SameSizeTuplePrefixComparator<k, k> {
15975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class Tuple1, class Tuple2>
15985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
15995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
16005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
16015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
16025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
16035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace gtest_internal
16055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
16075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool operator==(const GTEST_10_TUPLE_(T)& t,
16085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const GTEST_10_TUPLE_(U)& u) {
16095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return gtest_internal::SameSizeTuplePrefixComparator<
16105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      tuple_size<GTEST_10_TUPLE_(T) >::value,
16115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
16125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
16135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
16155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool operator!=(const GTEST_10_TUPLE_(T)& t,
16165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
16175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 6.1.4 Pairs.
16195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Unimplemented.
16205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace tr1
16225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace std
16235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_0_TUPLE_
16255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_1_TUPLE_
16265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_2_TUPLE_
16275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_3_TUPLE_
16285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_4_TUPLE_
16295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_5_TUPLE_
16305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_6_TUPLE_
16315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_7_TUPLE_
16325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_8_TUPLE_
16335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_9_TUPLE_
16345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_10_TUPLE_
16355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_0_TYPENAMES_
16375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_1_TYPENAMES_
16385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_2_TYPENAMES_
16395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_3_TYPENAMES_
16405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_4_TYPENAMES_
16415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_5_TYPENAMES_
16425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_6_TYPENAMES_
16435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_7_TYPENAMES_
16445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_8_TYPENAMES_
16455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_9_TYPENAMES_
16465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_10_TYPENAMES_
16475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
16495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_BY_REF_
16505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_ADD_REF_
16515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_TUPLE_ELEMENT_
16525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
16545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif GTEST_ENV_HAS_STD_TUPLE_
16555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <tuple>
16565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// C++11 puts its tuple into the ::std namespace rather than
16575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
16585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This causes undefined behavior, but supported compilers react in
16595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the way we intend.
16605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace std {
16615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace tr1 {
16625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing ::std::get;
16635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing ::std::make_tuple;
16645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing ::std::tuple;
16655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing ::std::tuple_element;
16665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing ::std::tuple_size;
16675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
16685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
16695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif GTEST_OS_SYMBIAN
16715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
16735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use STLport's tuple implementation, which unfortunately doesn't
16745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// work as the copy of STLport distributed with Symbian is incomplete.
16755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
16765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use its own tuple implementation.
16775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  ifdef BOOST_HAS_TR1_TUPLE
16785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   undef BOOST_HAS_TR1_TUPLE
16795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // BOOST_HAS_TR1_TUPLE
16805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This prevents <boost/tr1/detail/config.hpp>, which defines
16825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
16835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
16845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <tuple>
16855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
16875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
16885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// not conform to the TR1 spec, which requires the header to be <tuple>.
16895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
16915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
16925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// which is #included by <tr1/tuple>, to not compile when RTTI is
16935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// disabled.  _TR1_FUNCTIONAL is the header guard for
16945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// <tr1/functional>.  Hence the following #define is a hack to prevent
16955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// <tr1/functional> from being included.
16965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define _TR1_FUNCTIONAL 1
16975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   include <tr1/tuple>
16985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   undef _TR1_FUNCTIONAL  // Allows the user to #include
16995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        // <tr1/functional> if he chooses to.
17005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
17015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   include <tr1/tuple>  // NOLINT
17025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
17035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
17055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the compiler is not GCC 4.0+, we assume the user is using a
17065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// spec-conforming TR1 implementation.
17075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <tuple>  // NOLINT
17085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_USE_OWN_TR1_TUPLE
17095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TR1_TUPLE
17115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether clone(2) is supported.
17135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Usually it will only be available on Linux, excluding
17145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Linux on the Itanium architecture.
17155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Also see http://linux.die.net/man/2/clone.
17165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_CLONE
17175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us, so we need to figure it out.
17185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_LINUX && !defined(__ia64__)
17205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_OS_LINUX_ANDROID
17215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Android, clone() is only available on ARM starting with Gingerbread.
17225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#    if defined(__arm__) && __ANDROID_API__ >= 9
17235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#     define GTEST_HAS_CLONE 1
17245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#    else
17255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#     define GTEST_HAS_CLONE 0
17265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#    endif
17275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
17285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   define GTEST_HAS_CLONE 1
17295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif
17305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
17315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_CLONE 0
17325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_LINUX && !defined(__ia64__)
17335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_CLONE
17355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether to support stream redirection. This is used to test
17375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// output correctness and to implement death tests.
17385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_STREAM_REDIRECTION
17395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// By default, we assume that stream redirection is supported on all
17405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// platforms except known mobile ones.
17415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
17425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_STREAM_REDIRECTION 0
17435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
17445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_STREAM_REDIRECTION 1
17455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
17465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STREAM_REDIRECTION
17475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether to support death tests.
17495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test does not support death tests for VC 7.1 and earlier as
17505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// abort() in a VC 7.1 application compiled as GUI in debug config
17515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pops up a dialog window that cannot be suppressed programmatically.
17525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
17535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
17545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
17555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
17565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     GTEST_OS_OPENBSD || GTEST_OS_QNX)
17575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_DEATH_TEST 1
17585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <vector>  // NOLINT
17595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
17605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
17625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// all the compilers we care about are adequate for supporting
17635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value-parameterized tests.
17645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_HAS_PARAM_TEST 1
17655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether to support type-driven tests.
17675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
17695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sun Pro CC, IBM Visual Age, and HP aCC support.
17705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
17715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    defined(__IBMCPP__) || defined(__HP_aCC)
17725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_TYPED_TEST 1
17735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_TYPED_TEST_P 1
17745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
17755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether to support Combine(). This only makes sense when
17775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value-parameterized tests are enabled.  The implementation doesn't
17785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// work on Sun Studio since it doesn't understand templated conversion
17795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// operators.
17805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
17815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_COMBINE 1
17825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
17835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether the system compiler uses UTF-16 for encoding wide strings.
17855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_WIDE_STRING_USES_UTF16_ \
17865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
17875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether test results can be streamed to a socket.
17895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_LINUX
17905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_CAN_STREAM_RESULTS_ 1
17915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
17925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines some utility macros.
17945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The GNU compiler emits a warning if nested "if" statements are followed by
17965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// an "else" statement and braces are not used to explicitly disambiguate the
17975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "else" binding.  This leads to problems with code like:
17985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
17995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   if (gate)
18005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     ASSERT_*(condition) << "Some message";
18015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
18025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The "switch (0) case 0:" idiom is used to suppress this.
18035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __INTEL_COMPILER
18045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
18055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
18065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
18075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
18085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Use this annotation at the end of a struct/class definition to
18105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prevent the compiler from optimizing away instances that are never
18115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// used.  This is useful when all interesting logic happens inside the
18125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// c'tor and / or d'tor.  Example:
18135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
18145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   struct Foo {
18155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     Foo() { ... }
18165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   } GTEST_ATTRIBUTE_UNUSED_;
18175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
18185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Also use it after a variable or parameter declaration to tell the
18195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler the variable/parameter does not have to be used.
18205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__GNUC__) && !defined(COMPILER_ICC)
18215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
18225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
18235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_ATTRIBUTE_UNUSED_
18245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
18255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A macro to disallow operator=
18275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This should be used in the private: declarations for a class.
18285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DISALLOW_ASSIGN_(type)\
18295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(type const &)
18305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A macro to disallow copy constructor and operator=
18325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This should be used in the private: declarations for a class.
18335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
18345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  type(type const &);\
18355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_ASSIGN_(type)
18365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Tell the compiler to warn about unused return values for functions declared
18385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with this macro.  The macro should be used on function declarations
18395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// following the argument list:
18405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
18415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
18425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
18435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
18445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
18455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_MUST_USE_RESULT_
18465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
18475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determine whether the compiler supports Microsoft's Structured Exception
18495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Handling.  This is supported by several Windows compilers but generally
18505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// does not exist on any other system.
18515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_HAS_SEH
18525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The user didn't tell us, so we need to figure it out.
18535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if defined(_MSC_VER) || defined(__BORLANDC__)
18555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// These two compilers are known to support SEH.
18565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_SEH 1
18575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
18585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Assume no SEH.
18595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_SEH 0
18605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
18615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_SEH
18635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
18655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_LINKED_AS_SHARED_LIBRARY
18675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_API_ __declspec(dllimport)
18685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif GTEST_CREATE_SHARED_LIBRARY
18695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_API_ __declspec(dllexport)
18705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
18715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
18735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_API_
18755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_API_
18765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
18775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __GNUC__
18795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Ask the compiler to never inline a given function.
18805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_NO_INLINE_ __attribute__((noinline))
18815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
18825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_NO_INLINE_
18835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
18845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
18865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
18875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_CXXABI_H_ 1
18885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
18895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_CXXABI_H_ 0
18905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
18915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
18935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Message;
18955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
18975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A secret type that Google Test users don't know about.  It has no
18995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// definition on purpose.  Therefore it's impossible to create a
19005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Secret object, which is what we want.
19015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Secret;
19025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
19045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// expression is true. For example, you could use it to verify the
19055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// size of a static array:
19065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
19085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         content_type_names_incorrect_size);
19095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or to make sure a struct is smaller than a certain size:
19115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
19135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The second argument to the macro is the name of the variable. If
19155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the expression is false, most compilers will issue a warning/error
19165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// containing the name of the variable.
19175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <bool>
19195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct CompileAssert {
19205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
19215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_COMPILE_ASSERT_(expr, msg) \
19235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
19245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
19255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implementation details of GTEST_COMPILE_ASSERT_:
19275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
19295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   elements (and thus is invalid) when the expression is false.
19305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - The simpler definition
19325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
19345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   does not work, as gcc supports variable-length arrays whose sizes
19365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   are determined at run-time (this is gcc's extension and not part
19375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   of the C++ standard).  As a result, gcc fails to reject the
19385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   following code with the simple definition:
19395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     int foo;
19415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
19425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                                      // not a compile-time constant.
19435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - By using the type CompileAssert<(bool(expr))>, we ensures that
19455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   expr is a compile-time constant.  (Template arguments must be
19465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   determined at compile-time.)
19475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
19495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
19505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     CompileAssert<bool(expr)>
19525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   instead, these compilers will refuse to compile
19545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
19565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   (They seem to think the ">" in "5 > 0" marks the end of the
19585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   template argument list.)
19595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - The array size is (bool(expr) ? 1 : -1), instead of simply
19615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     ((expr) ? 1 : -1).
19635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   This is to avoid running into a bug in MS VC 7.1, which
19655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
19665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
19685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This template is declared, but intentionally undefined.
19705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
19715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct StaticAssertTypeEqHelper;
19725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
19745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct StaticAssertTypeEqHelper<T, T> {};
19755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_STRING
19775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef ::string string;
19785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
19795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef ::std::string string;
19805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_STRING
19815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_WSTRING
19835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef ::wstring wstring;
19845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_HAS_STD_WSTRING
19855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef ::std::wstring wstring;
19865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_WSTRING
19875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A helper for suppressing warnings on constant condition.  It just
19895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns 'condition'.
19905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsTrue(bool condition);
19915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines scoped_ptr.
19935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This implementation of scoped_ptr is PARTIAL - it only contains
19955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enough stuff to satisfy Google Test's need.
19965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
19975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass scoped_ptr {
19985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
19995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T element_type;
20005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
20025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~scoped_ptr() { reset(); }
20035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T& operator*() const { return *ptr_; }
20055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* operator->() const { return ptr_; }
20065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* get() const { return ptr_; }
20075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* release() {
20095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T* const ptr = ptr_;
20105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ptr_ = NULL;
20115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ptr;
20125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void reset(T* p = NULL) {
20155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (p != ptr_) {
20165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
20175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        delete ptr_;
20185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
20195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ptr_ = p;
20205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
20215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
20245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* ptr_;
20255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
20275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
20285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines RE.
20305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
20325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Regular Expression syntax.
20335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ RE {
20345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
20355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A copy constructor is required by the Standard to initialize object
20365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // references from r-values.
20375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RE(const RE& other) { Init(other.pattern()); }
20385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructs an RE from a string.
20405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
20415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_STRING
20435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
20455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_STRING
20475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RE(const char* regex) { Init(regex); }  // NOLINT
20495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~RE();
20505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the string representation of the regex.
20525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* pattern() const { return pattern_; }
20535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // FullMatch(str, re) returns true iff regular expression re matches
20555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the entire str.
20565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // PartialMatch(str, re) returns true iff regular expression re
20575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // matches a substring of str (including str itself).
20585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
20595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(wan@google.com): make FullMatch() and PartialMatch() work
20605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // when str contains NUL characters.
20615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool FullMatch(const ::std::string& str, const RE& re) {
20625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return FullMatch(str.c_str(), re);
20635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool PartialMatch(const ::std::string& str, const RE& re) {
20655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return PartialMatch(str.c_str(), re);
20665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_STRING
20695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool FullMatch(const ::string& str, const RE& re) {
20715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return FullMatch(str.c_str(), re);
20725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool PartialMatch(const ::string& str, const RE& re) {
20745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return PartialMatch(str.c_str(), re);
20755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_STRING
20785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool FullMatch(const char* str, const RE& re);
20805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool PartialMatch(const char* str, const RE& re);
20815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
20835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Init(const char* regex);
20845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We use a const char* instead of an std::string, as Google Test used to be
20865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // used where std::string is not available.  TODO(wan@google.com): change to
20875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // std::string.
20885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* pattern_;
20895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool is_valid_;
20905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_USES_POSIX_RE
20925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  regex_t full_regex_;     // For FullMatch().
20945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  regex_t partial_regex_;  // For PartialMatch().
20955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else  // GTEST_USES_SIMPLE_RE
20975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* full_pattern_;  // For FullMatch();
20995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
21015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_ASSIGN_(RE);
21035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
21045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats a source file path and a line number as they would appear
21065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in an error message from the compiler used to compile this code.
21075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
21085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats a file location for compiler-independent XML output.
21105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Although this function is not platform dependent, we put it next to
21115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FormatFileLocation in order to contrast the two functions.
21125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
21135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                               int line);
21145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines logging utilities:
21165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
21175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                          message itself is streamed into the macro.
21185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   LogToStderr()  - directs all log messages to stderr.
21195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   FlushInfoLog() - flushes informational log messages.
21205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangenum GTestLogSeverity {
21225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_INFO,
21235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_WARNING,
21245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ERROR,
21255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_FATAL
21265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
21275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats log entry severity, provides a stream object for streaming the
21295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// log message, and terminates the message with a newline when going out of
21305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// scope.
21315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ GTestLog {
21325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
21335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTestLog(GTestLogSeverity severity, const char* file, int line);
21345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
21365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~GTestLog();
21375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::ostream& GetStream() { return ::std::cerr; }
21395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
21415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const GTestLogSeverity severity_;
21425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
21445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
21455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_LOG_(severity) \
21475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
21485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  __FILE__, __LINE__).GetStream()
21495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void LogToStderr() {}
21515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void FlushInfoLog() { fflush(NULL); }
21525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE.
21545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
21555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
21565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is not satisfied.
21575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  Synopsys:
21585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    GTEST_CHECK_(boolean_condition);
21595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     or
21605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    GTEST_CHECK_(boolean_condition) << "Additional message";
21615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
21625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    This checks the condition and if the condition is not satisfied
21635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    it prints message about the condition violation, including the
21645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    condition itself, plus additional message streamed into it, if any,
21655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    and then it aborts the program. It aborts the program irrespective of
21665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    whether it is built in the debug mode or not.
21675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_CHECK_(condition) \
21685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
21695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (::testing::internal::IsTrue(condition)) \
21705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ; \
21715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    else \
21725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
21735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// An all-mode assert to verify that the given POSIX-style function
21755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// call returns 0 (indicating success).  Known limitation: this
21765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// doesn't expand to a balanced 'if' statement, so enclose the macro
21775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in {} if you need to use it as the only statement in an 'if'
21785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// branch.
21795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
21805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (const int gtest_error = (posix_call)) \
21815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
21825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << gtest_error
21835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
21855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
21865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Use ImplicitCast_ as a safe version of static_cast for upcasting in
21875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
21885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// const Foo*).  When you use ImplicitCast_, the compiler checks that
21895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the cast is safe.  Such explicit ImplicitCast_s are necessary in
21905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// surprisingly many situations where C++ demands an exact type match
21915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instead of an argument type convertable to a target type.
21925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
21935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The syntax for using ImplicitCast_ is the same as for static_cast:
21945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
21955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ImplicitCast_<ToType>(expr)
21965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
21975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ImplicitCast_ would have been part of the C++ standard library,
21985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// but the proposal was submitted too late.  It will probably make
21995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// its way into the language in the future.
22005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
22015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This relatively ugly name is intentional. It prevents clashes with
22025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// similar functions users may have (e.g., implicit_cast). The internal
22035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// namespace alone is not enough because the function can be found by ADL.
22045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<typename To>
22055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline To ImplicitCast_(To x) { return x; }
22065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// When you upcast (that is, cast a pointer from type Foo to type
22085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
22095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// always succeed.  When you downcast (that is, cast a pointer from
22105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
22115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// how do you know the pointer is really of type SubclassOfFoo?  It
22125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
22135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// when you downcast, you should use this macro.  In debug mode, we
22145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use dynamic_cast<> to double-check the downcast is legal (we die
22155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// if it's not).  In normal mode, we do the efficient static_cast<>
22165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instead.  Thus, it's important to test in debug mode to make sure
22175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the cast is legal!
22185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    This is the only place in the code we should use dynamic_cast<>.
22195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In particular, you SHOULDN'T be using dynamic_cast<> in order to
22205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// do RTTI (eg code like this:
22215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
22225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
22235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// You should design the code some other way not to need this.
22245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
22255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This relatively ugly name is intentional. It prevents clashes with
22265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// similar functions users may have (e.g., down_cast). The internal
22275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// namespace alone is not enough because the function can be found by ADL.
22285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<typename To, typename From>  // use like this: DownCast_<T*>(foo);
22295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline To DownCast_(From* f) {  // so we only accept pointers
22305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Ensures that To is a sub-type of From *.  This test is here only
22315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // for compile-time type checking, and has no overhead in an
22325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // optimized build at run-time, as it will be optimized away
22335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // completely.
22345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (false) {
22355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const To to = NULL;
22365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::ImplicitCast_<From*>(to);
22375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
22385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_RTTI
22405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // RTTI: debug mode only!
22415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
22425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
22435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<To>(f);
22445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Downcasts the pointer of type Base to Derived.
22475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Derived must be a subclass of Base. The parameter MUST
22485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// point to a class of type Derived, not any subclass of it.
22495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// When RTTI is available, the function performs a runtime
22505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// check to enforce this.
22515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Derived, class Base>
22525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDerived* CheckedDowncastToActualType(Base* base) {
22535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_RTTI
22545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(typeid(*base) == typeid(Derived));
22555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return dynamic_cast<Derived*>(base);  // NOLINT
22565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
22575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<Derived*>(base);  // Poor man's downcast.
22585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
22595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STREAM_REDIRECTION
22625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines the stderr capturer:
22645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   CaptureStdout     - starts capturing stdout.
22655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GetCapturedStdout - stops capturing stdout and returns the captured string.
22665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   CaptureStderr     - starts capturing stderr.
22675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GetCapturedStderr - stops capturing stderr and returns the captured string.
22685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
22695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void CaptureStdout();
22705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string GetCapturedStdout();
22715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void CaptureStderr();
22725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string GetCapturedStderr();
22735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STREAM_REDIRECTION
22755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
22785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst ::std::vector<testing::internal::string>& GetInjectableArgvs();
22805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid SetInjectableArgvs(const ::std::vector<testing::internal::string>*
22815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             new_argvs);
22825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A copy of all command line arguments.  Set by InitGoogleTest().
22845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern ::std::vector<testing::internal::string> g_argvs;
22855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
22875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines synchronization primitives.
22895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PTHREAD
22915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sleeps for (roughly) n milli-seconds.  This function is only for
22935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// testing Google Test's own constructs.  Don't use it in user tests,
22945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// either directly or indirectly.
22955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void SleepMilliseconds(int n) {
22965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const timespec time = {
22975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    0,                  // 0 seconds.
22985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    n * 1000L * 1000L,  // And n ms.
22995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
23005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  nanosleep(&time, NULL);
23015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Allows a controller thread to pause execution of newly created
23045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// threads until notified.  Instances of this class must be created
23055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and destroyed in the controller thread.
23065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
23075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class is only for testing Google Test's own constructs. Do not
23085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use it in user tests, either directly or indirectly.
23095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Notification {
23105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
23115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Notification() : notified_(false) {
23125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
23135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
23145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~Notification() {
23155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pthread_mutex_destroy(&mutex_);
23165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
23175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Notifies all threads created with this notification to start. Must
23195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // be called from the controller thread.
23205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Notify() {
23215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pthread_mutex_lock(&mutex_);
23225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    notified_ = true;
23235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pthread_mutex_unlock(&mutex_);
23245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
23255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Blocks until the controller thread notifies. Must be called from a test
23275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // thread.
23285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void WaitForNotification() {
23295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (;;) {
23305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      pthread_mutex_lock(&mutex_);
23315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const bool notified = notified_;
23325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      pthread_mutex_unlock(&mutex_);
23335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (notified)
23345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
23355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      SleepMilliseconds(10);
23365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
23375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
23385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
23405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pthread_mutex_t mutex_;
23415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool notified_;
23425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
23445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
23455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
23475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Consequently, it cannot select a correct instantiation of ThreadWithParam
23485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in order to call its Run(). Introducing ThreadWithParamBase as a
23495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// non-templated base class for ThreadWithParam allows us to bypass this
23505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// problem.
23515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ThreadWithParamBase {
23525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
23535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ThreadWithParamBase() {}
23545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void Run() = 0;
23555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
23565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pthread_create() accepts a pointer to a function type with the C linkage.
23585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// According to the Standard (7.5/1), function types with different linkages
23595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// are different even if they are otherwise identical.  Some compilers (for
23605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// example, SunStudio) treat them as different types.  Since class methods
23615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// cannot be defined with C-linkage we need to define a free C-function to
23625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pass into pthread_create().
23635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
23645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static_cast<ThreadWithParamBase*>(thread)->Run();
23655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return NULL;
23665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper class for testing Google Test's multi-threading constructs.
23695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To use it, write:
23705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
23715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   void ThreadFunc(int param) { /* Do things with param */ }
23725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Notification thread_can_start;
23735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ...
23745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // The thread_can_start parameter is optional; you can supply NULL.
23755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
23765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   thread_can_start.Notify();
23775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
23785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// These classes are only for testing Google Test's own constructs. Do
23795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// not use them in user tests, either directly or indirectly.
23805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
23815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ThreadWithParam : public ThreadWithParamBase {
23825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
23835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef void (*UserThreadFunc)(T);
23845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ThreadWithParam(
23865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      UserThreadFunc func, T param, Notification* thread_can_start)
23875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : func_(func),
23885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        param_(param),
23895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        thread_can_start_(thread_can_start),
23905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        finished_(false) {
23915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ThreadWithParamBase* const base = this;
23925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // The thread can be created only after all fields except thread_
23935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // have been initialized.
23945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(
23955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
23965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
23975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~ThreadWithParam() { Join(); }
23985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Join() {
24005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!finished_) {
24015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
24025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      finished_ = true;
24035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
24045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void Run() {
24075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (thread_can_start_ != NULL)
24085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      thread_can_start_->WaitForNotification();
24095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    func_(param_);
24105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
24135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const UserThreadFunc func_;  // User-supplied thread function.
24145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T param_;  // User-supplied parameter to the thread function.
24155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When non-NULL, used to block execution until the controller thread
24165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // notifies.
24175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Notification* const thread_can_start_;
24185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool finished_;  // true iff we know that the thread function has finished.
24195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pthread_t thread_;  // The native thread object.
24205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
24225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
24235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MutexBase and Mutex implement mutex on pthreads-based platforms. They
24255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// are used in conjunction with class MutexLock:
24265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Mutex mutex;
24285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ...
24295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
24305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                            // of the current scope.
24315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MutexBase implements behavior for both statically and dynamically
24335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// allocated mutexes.  Do not use MutexBase directly.  Instead, write
24345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the following to define a static mutex:
24355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
24375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// You can forward declare a static mutex like this:
24395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
24415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To create a dynamic mutex, just define an object of type Mutex.
24435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass MutexBase {
24445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
24455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Acquires this mutex.
24465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Lock() {
24475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
24485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    owner_ = pthread_self();
24495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    has_owner_ = true;
24505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Releases this mutex.
24535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Unlock() {
24545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Since the lock is being released the owner_ field should no longer be
24555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // considered valid. We don't protect writing to has_owner_ here, as it's
24565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // the caller's responsibility to ensure that the current thread holds the
24575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // mutex when this is called.
24585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    has_owner_ = false;
24595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
24605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Does nothing if the current thread holds the mutex. Otherwise, crashes
24635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // with high probability.
24645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void AssertHeld() const {
24655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
24665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "The current thread is not holding the mutex @" << this;
24675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A static mutex may be used before main() is entered.  It may even
24705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // be used before the dynamic initialization stage.  Therefore we
24715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // must be able to initialize a static mutex object at link time.
24725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This means MutexBase has to be a POD and its member variables
24735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // have to be public.
24745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
24755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pthread_mutex_t mutex_;  // The underlying pthread mutex.
24765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // has_owner_ indicates whether the owner_ field below contains a valid thread
24775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
24785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // accesses to the owner_ field should be protected by a check of this field.
24795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // An alternative might be to memset() owner_ to all zeros, but there's no
24805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // guarantee that a zero'd pthread_t is necessarily invalid or even different
24815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // from pthread_self().
24825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool has_owner_;
24835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pthread_t owner_;  // The thread holding the mutex.
24845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
24855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Forward-declares a static mutex.
24875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
24885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    extern ::testing::internal::MutexBase mutex
24895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines and statically (i.e. at link time) initializes a static mutex.
24915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The initialization list here does not explicitly initialize each field,
24925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instead relying on default initialization for the unspecified fields. In
24935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// particular, the owner_ field (a pthread_t) is not explicitly initialized.
24945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This allows initialization to work whether pthread_t is a scalar or struct.
24955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The flag -Wmissing-field-initializers must not be specified for this to work.
24965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
24975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
24985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Mutex class can only be used for mutexes created at runtime. It
25005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// shares its API with MutexBase otherwise.
25015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Mutex : public MutexBase {
25025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
25035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Mutex() {
25045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
25055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    has_owner_ = false;
25065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
25075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~Mutex() {
25085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
25095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
25105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
25125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
25135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
25145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We cannot name this class MutexLock as the ctor declaration would
25165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// conflict with a macro named MutexLock, which is defined on some
25175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// platforms.  Hence the typedef trick below.
25185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTestMutexLock {
25195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
25205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit GTestMutexLock(MutexBase* mutex)
25215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : mutex_(mutex) { mutex_->Lock(); }
25225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~GTestMutexLock() { mutex_->Unlock(); }
25245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
25265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  MutexBase* const mutex_;
25275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
25295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
25305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef GTestMutexLock MutexLock;
25325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helpers for ThreadLocal.
25345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pthread_key_create() requires DeleteThreadLocalValue() to have
25365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// C-linkage.  Therefore it cannot be templatized to access
25375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ThreadLocal<T>.  Hence the need for class
25385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ThreadLocalValueHolderBase.
25395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ThreadLocalValueHolderBase {
25405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
25415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ThreadLocalValueHolderBase() {}
25425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
25435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Called by pthread to delete thread-local data stored by
25455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pthread_setspecific().
25465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern "C" inline void DeleteThreadLocalValue(void* value_holder) {
25475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
25485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements thread-local storage on pthreads-based systems.
25515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
25525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Thread 1
25535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
25545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
25555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Thread 2
25565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   tl.set(150);  // Changes the value for thread 2 only.
25575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_EQ(150, tl.get());
25585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
25595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Thread 1
25605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
25615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   tl.set(200);
25625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_EQ(200, tl.get());
25635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
25645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The template type argument T must have a public copy constructor.
25655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In addition, the default ThreadLocal constructor requires T to have
25665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a public default constructor.
25675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
25685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// An object managed for a thread by a ThreadLocal instance is deleted
25695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// when the thread exits.  Or, if the ThreadLocal instance dies in
25705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that thread, when the ThreadLocal dies.  It's the user's
25715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// responsibility to ensure that all other threads using a ThreadLocal
25725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// have exited when it dies, or the per-thread objects for those
25735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// threads will not be deleted.
25745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
25755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test only uses global ThreadLocal objects.  That means they
25765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will die after main() has returned.  Therefore, no per-thread
25775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// object managed by Google Test will be leaked as long as all threads
25785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using Google Test have exited when main() returns.
25795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
25805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ThreadLocal {
25815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
25825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ThreadLocal() : key_(CreateKey()),
25835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  default_() {}
25845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ThreadLocal(const T& value) : key_(CreateKey()),
25855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         default_(value) {}
25865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~ThreadLocal() {
25885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Destroys the managed object for the current thread, if any.
25895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeleteThreadLocalValue(pthread_getspecific(key_));
25905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Releases resources associated with the key.  This will *not*
25925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // delete managed objects for other threads.
25935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
25945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
25955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* pointer() { return GetOrCreateValue(); }
25975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T* pointer() const { return GetOrCreateValue(); }
25985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T& get() const { return *pointer(); }
25995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set(const T& value) { *pointer() = value; }
26005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
26025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Holds a value of type T.
26035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class ValueHolder : public ThreadLocalValueHolderBase {
26045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
26055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    explicit ValueHolder(const T& value) : value_(value) {}
26065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T* pointer() { return &value_; }
26085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
26105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T value_;
26115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
26125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
26135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static pthread_key_t CreateKey() {
26155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pthread_key_t key;
26165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // When a thread exits, DeleteThreadLocalValue() will be called on
26175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // the object managed for that thread.
26185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(
26195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        pthread_key_create(&key, &DeleteThreadLocalValue));
26205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return key;
26215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
26225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* GetOrCreateValue() const {
26245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ThreadLocalValueHolderBase* const holder =
26255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
26265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (holder != NULL) {
26275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
26285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
26295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ValueHolder* const new_holder = new ValueHolder(default_);
26315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ThreadLocalValueHolderBase* const holder_base = new_holder;
26325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
26335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new_holder->pointer();
26345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
26355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A key pthreads uses for looking up per-thread values.
26375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const pthread_key_t key_;
26385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T default_;  // The default value for each thread.
26395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
26415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
26425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_IS_THREADSAFE 1
26445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else  // GTEST_HAS_PTHREAD
26465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A dummy implementation of synchronization primitives (mutex, lock,
26485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and thread-local variable).  Necessary for compiling Google Test where
26495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// mutex is not supported - using Google Test in multiple threads is not
26505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// supported on such platforms.
26515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Mutex {
26535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
26545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Mutex() {}
26555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Lock() {}
26565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Unlock() {}
26575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void AssertHeld() const {}
26585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
26595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
26615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  extern ::testing::internal::Mutex mutex
26625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
26645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTestMutexLock {
26665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
26675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit GTestMutexLock(Mutex*) {}  // NOLINT
26685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
26695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef GTestMutexLock MutexLock;
26715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
26735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ThreadLocal {
26745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
26755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ThreadLocal() : value_() {}
26765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ThreadLocal(const T& value) : value_(value) {}
26775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* pointer() { return &value_; }
26785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T* pointer() const { return &value_; }
26795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T& get() const { return value_; }
26805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set(const T& value) { value_ = value; }
26815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
26825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T value_;
26835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
26845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The above synchronization primitives have dummy implementations.
26865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Therefore Google Test is not thread-safe.
26875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_IS_THREADSAFE 0
26885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PTHREAD
26905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of threads running in the process, or 0 to indicate that
26925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// we cannot detect it.
26935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ size_t GetThreadCount();
26945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Passing non-POD classes through ellipsis (...) crashes the ARM
26965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler and generates a warning in Sun Studio.  The Nokia Symbian
26975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and the IBM XL C/C++ compiler try to instantiate a copy constructor
26985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for objects passed through ellipsis (...), failing for uncopyable
26995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// objects.  We define this to ensure that only POD is passed through
27005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ellipsis on these systems.
27015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
27025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We lose support for NULL detection where the compiler doesn't like
27035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// passing non-POD classes through ellipsis (...).
27045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_ELLIPSIS_NEEDS_POD_ 1
27055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
27065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_CAN_COMPARE_NULL 1
27075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
27085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
27105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// const T& and const T* in a function template.  These compilers
27115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// _can_ decide between class template specializations for T and T*,
27125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// so a tr1::type_traits-like is_pointer works.
27135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
27145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_NEEDS_IS_POINTER_ 1
27155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
27165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <bool bool_value>
27185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct bool_constant {
27195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef bool_constant<bool_value> type;
27205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const bool value = bool_value;
27215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
27225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <bool bool_value> const bool bool_constant<bool_value>::value;
27235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef bool_constant<false> false_type;
27255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef bool_constant<true> true_type;
27265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
27285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct is_pointer : public false_type {};
27295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
27315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct is_pointer<T*> : public true_type {};
27325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Iterator>
27345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct IteratorTraits {
27355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename Iterator::value_type value_type;
27365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
27375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
27395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct IteratorTraits<T*> {
27405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T value_type;
27415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
27425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
27445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct IteratorTraits<const T*> {
27455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T value_type;
27465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
27475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
27495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_PATH_SEP_ "\\"
27505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_ALT_PATH_SEP_ 1
27515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The biggest signed integer type the compiler supports.
27525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef __int64 BiggestInt;
27535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
27545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_PATH_SEP_ "/"
27555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_ALT_PATH_SEP_ 0
27565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef long long BiggestInt;  // NOLINT
27575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
27585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utilities for char.
27605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// isspace(int ch) and friends accept an unsigned char or EOF.  char
27625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// may be signed, depending on the compiler (or compiler flags).
27635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Therefore we need to cast a char to unsigned char before calling
27645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// isspace(), etc.
27655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsAlpha(char ch) {
27675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return isalpha(static_cast<unsigned char>(ch)) != 0;
27685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsAlNum(char ch) {
27705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return isalnum(static_cast<unsigned char>(ch)) != 0;
27715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsDigit(char ch) {
27735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return isdigit(static_cast<unsigned char>(ch)) != 0;
27745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsLower(char ch) {
27765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return islower(static_cast<unsigned char>(ch)) != 0;
27775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsSpace(char ch) {
27795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return isspace(static_cast<unsigned char>(ch)) != 0;
27805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsUpper(char ch) {
27825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return isupper(static_cast<unsigned char>(ch)) != 0;
27835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsXDigit(char ch) {
27855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return isxdigit(static_cast<unsigned char>(ch)) != 0;
27865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsXDigit(wchar_t ch) {
27885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const unsigned char low_byte = static_cast<unsigned char>(ch);
27895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ch == low_byte && isxdigit(low_byte) != 0;
27905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char ToLower(char ch) {
27935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
27945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char ToUpper(char ch) {
27965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
27975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The testing::internal::posix namespace holds wrappers for common
28005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// POSIX functions.  These wrappers hide the differences between
28015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows/MSVC and POSIX systems.  Since some compilers define these
28025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// standard functions as macros, the wrapper cannot have the same name
28035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as the wrapped function.
28045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace posix {
28065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Functions with a different name on Windows.
28085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
28105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef struct _stat StatStruct;
28125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# ifdef __BORLANDC__
28145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int IsATTY(int fd) { return isatty(fd); }
28155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int StrCaseCmp(const char* s1, const char* s2) {
28165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return stricmp(s1, s2);
28175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char* StrDup(const char* src) { return strdup(src); }
28195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else  // !__BORLANDC__
28205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_OS_WINDOWS_MOBILE
28215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int IsATTY(int /* fd */) { return 0; }
28225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
28235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int IsATTY(int fd) { return _isatty(fd); }
28245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // GTEST_OS_WINDOWS_MOBILE
28255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int StrCaseCmp(const char* s1, const char* s2) {
28265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return _stricmp(s1, s2);
28275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char* StrDup(const char* src) { return _strdup(src); }
28295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // __BORLANDC__
28305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS_MOBILE
28325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
28335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
28345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// time and thus not defined there.
28355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
28365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int FileNo(FILE* file) { return _fileno(file); }
28375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
28385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int RmDir(const char* dir) { return _rmdir(dir); }
28395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsDir(const StatStruct& st) {
28405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (_S_IFDIR & st.st_mode) != 0;
28415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS_MOBILE
28435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
28455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef struct stat StatStruct;
28475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int FileNo(FILE* file) { return fileno(file); }
28495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int IsATTY(int fd) { return isatty(fd); }
28505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
28515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int StrCaseCmp(const char* s1, const char* s2) {
28525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return strcasecmp(s1, s2);
28535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char* StrDup(const char* src) { return strdup(src); }
28555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int RmDir(const char* dir) { return rmdir(dir); }
28565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
28575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
28595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Functions deprecated by MSVC 8.0.
28615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
28635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Temporarily disable warning 4996 (deprecated function).
28645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)
28655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable:4996)
28665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
28675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline const char* StrNCpy(char* dest, const char* src, size_t n) {
28695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return strncpy(dest, src, n);
28705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
28735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// StrError() aren't needed on Windows CE at this time and thus not
28745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defined there.
28755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !GTEST_OS_WINDOWS_MOBILE
28775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int ChDir(const char* dir) { return chdir(dir); }
28785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
28795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline FILE* FOpen(const char* path, const char* mode) {
28805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return fopen(path, mode);
28815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !GTEST_OS_WINDOWS_MOBILE
28835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
28845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return freopen(path, mode, stream);
28855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
28875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
28885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int FClose(FILE* fp) { return fclose(fp); }
28895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !GTEST_OS_WINDOWS_MOBILE
28905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int Read(int fd, void* buf, unsigned int count) {
28915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(read(fd, buf, count));
28925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int Write(int fd, const void* buf, unsigned int count) {
28945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(write(fd, buf, count));
28955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int Close(int fd) { return close(fd); }
28975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline const char* StrError(int errnum) { return strerror(errnum); }
28985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
28995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline const char* GetEnv(const char* name) {
29005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
29015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We are on Windows CE, which has no environment variables.
29025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return NULL;
29035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
29045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Environment variables which we programmatically clear will be set to the
29055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // empty string rather than unset (NULL).  Handle that case.
29065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const env = getenv(name);
29075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (env != NULL && env[0] != '\0') ? env : NULL;
29085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
29095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return getenv(name);
29105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
29115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
29125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
29145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(pop)  // Restores the warning state.
29155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
29165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
29185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows CE has no C library. The abort() function is used in
29195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// several places in Google Test. This implementation provides a reasonable
29205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// imitation of standard behaviour.
29215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Abort();
29225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
29235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void Abort() { abort(); }
29245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
29255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace posix
29275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
29295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
29305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
29315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function in order to achieve that.  We use macro definition here because
29325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// snprintf is a variadic function.
29335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
29345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC 2005 and above support variadic macros.
29355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_SNPRINTF_(buffer, size, format, ...) \
29365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
29375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(_MSC_VER)
29385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
29395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// complain about _snprintf.
29405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_SNPRINTF_ _snprintf
29415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
29425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_SNPRINTF_ snprintf
29435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
29445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum number a BiggestInt can represent.  This definition
29465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// works no matter BiggestInt is represented in one's complement or
29475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// two's complement.
29485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
29495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We cannot rely on numeric_limits in STL, as __int64 and long long
29505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// are not part of standard C++ and numeric_limits doesn't need to be
29515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defined for them.
29525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst BiggestInt kMaxBiggestInt =
29535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
29545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This template class serves as a compile-time function from size to
29565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type.  It maps a size in bytes to a primitive type with that
29575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// size. e.g.
29585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
29595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   TypeWithSize<4>::UInt
29605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
29615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is typedef-ed to be unsigned int (unsigned integer made up of 4
29625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// bytes).
29635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
29645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Such functionality should belong to STL, but I cannot find it
29655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// there.
29665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
29675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test uses this class in the implementation of floating-point
29685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// comparison.
29695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
29705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For now it only handles UInt (unsigned int) as that's all Google Test
29715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// needs.  Other types can be easily added in the future if need
29725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// arises.
29735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <size_t size>
29745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeWithSize {
29755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
29765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This prevents the user from using TypeWithSize<N> with incorrect
29775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // values of N.
29785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef void UInt;
29795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
29805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The specialization for size 4.
29825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
29835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeWithSize<4> {
29845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
29855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // unsigned int has size 4 in both gcc and MSVC.
29865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
29875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // As base/basictypes.h doesn't compile on Windows, we cannot use
29885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // uint32, uint64, and etc here.
29895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef int Int;
29905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef unsigned int UInt;
29915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
29925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The specialization for size 8.
29945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
29955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeWithSize<8> {
29965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
29975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
29985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef __int64 Int;
29995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef unsigned __int64 UInt;
30005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
30015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef long long Int;  // NOLINT
30025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef unsigned long long UInt;  // NOLINT
30035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
30045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
30055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Integer types of known sizes.
30075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef TypeWithSize<4>::Int Int32;
30085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef TypeWithSize<4>::UInt UInt32;
30095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef TypeWithSize<8>::Int Int64;
30105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef TypeWithSize<8>::UInt UInt64;
30115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
30125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utilities for command line flags and environment variables.
30145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macro for referencing flags.
30165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_FLAG(name) FLAGS_gtest_##name
30175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macros for declaring flags.
30195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
30205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DECLARE_int32_(name) \
30215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
30225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DECLARE_string_(name) \
30235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_API_ extern ::std::string GTEST_FLAG(name)
30245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macros for defining flags.
30265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DEFINE_bool_(name, default_val, doc) \
30275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
30285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DEFINE_int32_(name, default_val, doc) \
30295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
30305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_DEFINE_string_(name, default_val, doc) \
30315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
30325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Thread annotations
30345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
30355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_LOCK_EXCLUDED_(locks)
30365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
30385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to *value and returns true; otherwise leaves *value unchanged and returns
30395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// false.
30405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(chandlerc): Find a better way to refactor flag and environment parsing
30415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
30425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function.
30435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ParseInt32(const Message& src_text, const char* str, Int32* value);
30445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses a bool/Int32/string from the environment variable
30465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// corresponding to the given Google Test flag.
30475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool BoolFromGTestEnv(const char* flag, bool default_val);
30485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
30495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* StringFromGTestEnv(const char* flag, const char* default_val);
30505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
30525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
30535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
30555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_LINUX
30575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <stdlib.h>
30585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/types.h>
30595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/wait.h>
30605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <unistd.h>
30615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_LINUX
30625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
30645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <stdexcept>
30655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
30665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ctype.h>
30685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <float.h>
30695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string.h>
30705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <iomanip>
30715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <limits>
30725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <set>
30735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
30755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
30765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
30775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
30785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
30795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
30805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
30815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
30825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
30835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
30845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
30855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
30865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
30875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
30885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
30895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
30905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
30915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
31045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
31065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file defines the Message class.
31085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
31105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// leave some internal implementation details in this header file.
31115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// They are clearly marked by comments like this:
31125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
31145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Such code is NOT meant to be used by a user directly, and is subject
31165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
31175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// program!
31185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
31205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
31215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <limits>
31235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Ensures that there is at least one operator<< in the global namespace.
31265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// See Message& operator<<(...) below for why.
31275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid operator<<(const testing::internal::Secret&, int);
31285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
31305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Message class works like an ostream repeater.
31325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Typical usage:
31345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   1. You stream a bunch of values to a Message object.
31365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//      It will remember the text in a stringstream.
31375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   2. Then you stream the Message object to an ostream.
31385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//      This causes the text in the Message to be streamed
31395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//      to the ostream.
31405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For example;
31425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   testing::Message foo;
31445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   foo << 1 << " != " << 2;
31455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   std::cout << foo;
31465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will print "1 != 2".
31485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Message is not intended to be inherited from.  In particular, its
31505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// destructor is not virtual.
31515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
31525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that stringstream behaves differently in gcc and in MSVC.  You
31535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// can stream a NULL char pointer to it in the former, but not in the
31545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// latter (it causes an access violation if you do).  The Message
31555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class hides this difference by treating a NULL char pointer as
31565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "(null)".
31575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ Message {
31585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
31595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The type of basic IO manipulators (endl, ends, and flush) for
31605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // narrow streams.
31615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
31625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
31645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructs an empty Message.
31655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message();
31665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Copy constructor.
31685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
31695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *ss_ << msg.GetString();
31705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
31715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructs a Message from a C-string.
31735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit Message(const char* str) : ss_(new ::std::stringstream) {
31745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *ss_ << str;
31755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
31765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_SYMBIAN
31785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Streams a value (either a pointer or not) to this object.
31795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
31805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  inline Message& operator <<(const T& value) {
31815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    StreamHelper(typename internal::is_pointer<T>::type(), value);
31825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
31835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
31845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
31855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Streams a non-pointer value to this object.
31865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
31875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  inline Message& operator <<(const T& val) {
31885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Some libraries overload << for STL containers.  These
31895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // overloads are defined in the global namespace instead of ::std.
31905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
31915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
31925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // overloads are visible in either the std namespace or the global
31935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // namespace, but not other namespaces, including the testing
31945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // namespace which Google Test's Message class is in.
31955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
31965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // To allow STL containers (and other types that has a << operator
31975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // defined in the global namespace) to be used in Google Test
31985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // assertions, testing::Message must access the custom << operator
31995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // from the global namespace.  With this using declaration,
32005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // overloads of << defined in the global namespace and those
32015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // visible via Koenig lookup are both exposed in this function.
32025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    using ::operator <<;
32035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *ss_ << val;
32045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
32055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Streams a pointer value to this object.
32085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
32095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This function is an overload of the previous one.  When you
32105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // stream a pointer to a Message, this definition will be used as it
32115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // is more specialized.  (The C++ Standard, section
32125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // [temp.func.order].)  If you stream a non-pointer, then the
32135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // previous definition will be used.
32145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
32155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The reason for this overload is that streaming a NULL pointer to
32165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ostream is undefined behavior.  Depending on the compiler, you
32175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // may get "0", "(nil)", "(null)", or an access violation.  To
32185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ensure consistent result across compilers, we always treat NULL
32195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // as "(null)".
32205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
32215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  inline Message& operator <<(T* const& pointer) {  // NOLINT
32225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (pointer == NULL) {
32235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *ss_ << "(null)";
32245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
32255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *ss_ << pointer;
32265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
32275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
32285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_SYMBIAN
32305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Since the basic IO manipulators are overloaded for both narrow
32325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // and wide streams, we have to provide this specialized definition
32335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // of operator <<, even though its body is the same as the
32345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // templatized version above.  Without this definition, streaming
32355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // endl or other basic IO manipulators to Message will confuse the
32365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // compiler.
32375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message& operator <<(BasicNarrowIoManip val) {
32385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *ss_ << val;
32395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
32405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Instead of 1/0, we want to see true/false for bool values.
32435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message& operator <<(bool b) {
32445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this << (b ? "true" : "false");
32455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // These two overloads allow streaming a wide C string to a Message
32485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // using the UTF-8 encoding.
32495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message& operator <<(const wchar_t* wide_c_str);
32505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message& operator <<(wchar_t* wide_c_str);
32515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
32535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Converts the given wide string to a narrow string using the UTF-8
32545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // encoding, and streams the result to this Message object.
32555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message& operator <<(const ::std::wstring& wstr);
32565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING
32575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_WSTRING
32595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Converts the given wide string to a narrow string using the UTF-8
32605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // encoding, and streams the result to this Message object.
32615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message& operator <<(const ::wstring& wstr);
32625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_WSTRING
32635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the text streamed to this object so far as an std::string.
32655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Each '\0' character in the buffer is replaced with "\\0".
32665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
32675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
32685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string GetString() const;
32695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
32715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_SYMBIAN
32735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // These are needed as the Nokia Symbian Compiler cannot decide between
32745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // const T& and const T* in a function template. The Nokia compiler _can_
32755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // decide between class template specializations for T and T*, so a
32765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // tr1::type_traits-like is_pointer works, and we can overload on that.
32775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
32785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
32795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (pointer == NULL) {
32805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *ss_ << "(null)";
32815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
32825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *ss_ << pointer;
32835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
32845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
32865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  inline void StreamHelper(internal::false_type /*is_pointer*/,
32875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           const T& value) {
32885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // See the comments in Message& operator <<(const T&) above for why
32895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // we need this using statement.
32905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    using ::operator <<;
32915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *ss_ << value;
32925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_SYMBIAN
32945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We'll hold the text streamed to this object here.
32965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const internal::scoped_ptr< ::std::stringstream> ss_;
32975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We declare (but don't implement) this to prevent the compiler
32995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // from implementing the assignment operator.
33005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const Message&);
33015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
33025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Streams a Message to an ostream.
33045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline std::ostream& operator <<(std::ostream& os, const Message& sb) {
33055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return os << sb.GetString();
33065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
33095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a streamable value to an std::string.  A NULL pointer is
33115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// converted to "(null)".  When the input value is a ::string,
33125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::std::string, ::wstring, or ::std::wstring object, each NUL
33135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// character in it is replaced with "\\0".
33145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
33155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string StreamableToString(const T& streamable) {
33165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (Message() << streamable).GetString();
33175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
33205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
33215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
33235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
33245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
33255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
33275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
33285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
33295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
33315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
33325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
33335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
33345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
33355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
33365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
33375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
33385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
33395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
33435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
33535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
33555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file declares the String class and functions used internally by
33575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test.  They are subject to change without notice. They should not used
33585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by code external to Google Test.
33595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file is #included by <gtest/internal/gtest-internal.h>.
33615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// It should not be #included by other files.
33625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
33645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
33655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __BORLANDC__
33675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// string.h is not guaranteed to provide strcpy on C++ Builder.
33685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <mem.h>
33695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
33705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string.h>
33725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string>
33735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
33765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
33775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// String - an abstract class holding static string utilities.
33795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ String {
33805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
33815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Static utility methods
33825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Clones a 0-terminated C string, allocating memory using new.  The
33845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // caller is responsible for deleting the return value using
33855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // delete[].  Returns the cloned string, or NULL if the input is
33865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NULL.
33875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
33885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This is different from strdup() in string.h, which allocates
33895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // memory using malloc().
33905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const char* CloneCString(const char* c_str);
33915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
33935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
33945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // able to pass strings to Win32 APIs on CE we need to convert them
33955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to 'Unicode', UTF-16.
33965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Creates a UTF-16 wide string from the given ANSI string, allocating
33985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // memory using new. The caller is responsible for deleting the return
33995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // value using delete[]. Returns the wide string, or NULL if the
34005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // input is NULL.
34015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
34025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The wide string is created using the ANSI codepage (CP_ACP) to
34035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // match the behaviour of the ANSI versions of Win32 calls and the
34045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // C runtime.
34055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static LPCWSTR AnsiToUtf16(const char* c_str);
34065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Creates an ANSI string from the given wide string, allocating
34085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // memory using new. The caller is responsible for deleting the return
34095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // value using delete[]. Returns the ANSI string, or NULL if the
34105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // input is NULL.
34115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
34125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The returned string is created using the ANSI codepage (CP_ACP) to
34135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // match the behaviour of the ANSI versions of Win32 calls and the
34145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // C runtime.
34155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
34165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
34175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Compares two C strings.  Returns true iff they have the same content.
34195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
34205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Unlike strcmp(), this function can handle NULL argument(s).  A
34215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NULL C string is considered different to any non-NULL C string,
34225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // including the empty string.
34235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool CStringEquals(const char* lhs, const char* rhs);
34245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Converts a wide C string to a String using the UTF-8 encoding.
34265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NULL will be converted to "(null)".  If an error occurred during
34275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the conversion, "(failed to convert from wide string)" is
34285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // returned.
34295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string ShowWideCString(const wchar_t* wide_c_str);
34305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Compares two wide C strings.  Returns true iff they have the same
34325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // content.
34335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
34345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Unlike wcscmp(), this function can handle NULL argument(s).  A
34355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NULL C string is considered different to any non-NULL C string,
34365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // including the empty string.
34375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
34385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Compares two C strings, ignoring case.  Returns true iff they
34405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // have the same content.
34415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
34425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Unlike strcasecmp(), this function can handle NULL argument(s).
34435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A NULL C string is considered different to any non-NULL C string,
34445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // including the empty string.
34455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool CaseInsensitiveCStringEquals(const char* lhs,
34465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                           const char* rhs);
34475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Compares two wide C strings, ignoring case.  Returns true iff they
34495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // have the same content.
34505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
34515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Unlike wcscasecmp(), this function can handle NULL argument(s).
34525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A NULL C string is considered different to any non-NULL wide C string,
34535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // including the empty string.
34545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NB: The implementations on different platforms slightly differ.
34555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
34565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // environment variable. On GNU platform this method uses wcscasecmp
34575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // which compares according to LC_CTYPE category of the current locale.
34585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
34595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // current locale.
34605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
34615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                               const wchar_t* rhs);
34625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the given string ends with the given suffix, ignoring
34645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // case. Any string is considered to end with an empty suffix.
34655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool EndsWithCaseInsensitive(
34665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const std::string& str, const std::string& suffix);
34675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Formats an int value as "%02d".
34695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
34705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Formats an int value as "%X".
34725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string FormatHexInt(int value);
34735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Formats a byte as "%02X".
34755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string FormatByte(unsigned char value);
34765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
34785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  String();  // Not meant to be instantiated.
34795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class String
34805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
34825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// character in the buffer is replaced with "\\0".
34835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
34845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
34865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
34875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
34895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008, Google Inc.
34905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
34915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
34925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
34935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
34945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
34955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
34965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
34975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
34985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
34995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
35005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
35015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
35025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
35035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
35045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
35055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
35065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
35085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
35095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
35185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: keith.ray@gmail.com (Keith Ray)
35195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
35205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test filepath utilities
35215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
35225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file declares classes and functions used internally by
35235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test.  They are subject to change without notice.
35245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
35255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file is #included in <gtest/internal/gtest-internal.h>.
35265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Do not include this header file separately!
35275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
35295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
35305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
35335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
35345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FilePath - a class for file and directory pathname manipulation which
35365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// handles platform-specific conventions (like the pathname separator).
35375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used for helper functions for naming files in a directory for xml output.
35385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Except for Set methods, all methods are const or static, which provides an
35395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "immutable value object" -- useful for peace of mind.
35405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A FilePath with a value ending in a path separator ("like/this/") represents
35415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a directory, otherwise it is assumed to represent a file. In either case,
35425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it may or may not represent an actual file or directory in the file system.
35435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Names are NOT checked for syntax correctness -- no checking for illegal
35445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// characters, malformed paths, etc.
35455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ FilePath {
35475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
35485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath() : pathname_("") { }
35495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
35505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
35525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Normalize();
35535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
35545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath& operator=(const FilePath& rhs) {
35565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Set(rhs);
35575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
35585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
35595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Set(const FilePath& rhs) {
35615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pathname_ = rhs.pathname_;
35625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
35635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& string() const { return pathname_; }
35655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* c_str() const { return pathname_.c_str(); }
35665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the current working directory, or "" if unsuccessful.
35685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static FilePath GetCurrentDir();
35695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Given directory = "dir", base_name = "test", number = 0,
35715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // extension = "xml", returns "dir/test.xml". If number is greater
35725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // than zero (e.g., 12), returns "dir/test_12.xml".
35735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows platform, uses \ as the separator rather than /.
35745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static FilePath MakeFileName(const FilePath& directory,
35755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const FilePath& base_name,
35765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               int number,
35775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* extension);
35785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Given directory = "dir", relative_path = "test.xml",
35805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // returns "dir/test.xml".
35815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows, uses \ as the separator rather than /.
35825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static FilePath ConcatPaths(const FilePath& directory,
35835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const FilePath& relative_path);
35845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a pathname for a file that does not currently exist. The pathname
35865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // will be directory/base_name.extension or
35875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // directory/base_name_<number>.extension if directory/base_name.extension
35885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // already exists. The number will be incremented until a pathname is found
35895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // that does not already exist.
35905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
35915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // There could be a race condition if two or more processes are calling this
35925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // function at the same time -- they could both pick the same filename.
35935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static FilePath GenerateUniqueFileName(const FilePath& directory,
35945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         const FilePath& base_name,
35955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         const char* extension);
35965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the path is "".
35985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool IsEmpty() const { return pathname_.empty(); }
35995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If input name has a trailing separator character, removes it and returns
36015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the name, otherwise return the name string unmodified.
36025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows platform, uses \ as the separator, other platforms use /.
36035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath RemoveTrailingPathSeparator() const;
36045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a copy of the FilePath with the directory part removed.
36065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
36075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
36085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
36095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // returns an empty FilePath ("").
36105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows platform, '\' is the path separator, otherwise it is '/'.
36115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath RemoveDirectoryName() const;
36125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // RemoveFileName returns the directory path with the filename removed.
36145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
36155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
36165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
36175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
36185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows platform, '\' is the path separator, otherwise it is '/'.
36195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath RemoveFileName() const;
36205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a copy of the FilePath with the case-insensitive extension removed.
36225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
36235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // FilePath("dir/file"). If a case-insensitive extension is not
36245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // found, returns a copy of the original FilePath.
36255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath RemoveExtension(const char* extension) const;
36265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Creates directories so that path exists. Returns true if successful or if
36285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the directories already exist; returns false if unable to create
36295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // directories for any reason. Will also return false if the FilePath does
36305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // not represent a directory (that is, it doesn't end with a path separator).
36315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool CreateDirectoriesRecursively() const;
36325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Create the directory so that path exists. Returns true if successful or
36345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // if the directory already exists; returns false if unable to create the
36355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // directory for any reason, including if the parent directory does not
36365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exist. Not named "CreateDirectory" because that's a macro on Windows.
36375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool CreateFolder() const;
36385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if FilePath describes something in the file-system,
36405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // either a file, directory, or whatever, and that something exists.
36415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool FileOrDirectoryExists() const;
36425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if pathname describes a directory in the file-system
36445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // that exists.
36455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool DirectoryExists() const;
36465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if FilePath ends with a path separator, which indicates that
36485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it is intended to represent a directory. Returns false otherwise.
36495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This does NOT check that a directory (or file) actually exists.
36505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool IsDirectory() const;
36515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if pathname describes a root directory. (Windows has one
36535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // root directory per disk drive.)
36545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool IsRootDirectory() const;
36555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if pathname describes an absolute path.
36575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool IsAbsolutePath() const;
36585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
36605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Replaces multiple consecutive separators with a single separator.
36615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
36625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // redundancies that might be in a pathname involving "." or "..".
36635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
36645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A pathname with multiple consecutive separators may occur either through
36655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // user error or as a result of some scripts or APIs that generate a pathname
36665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // with a trailing separator. On other platforms the same API or script
36675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // may NOT generate a pathname with a trailing "/". Then elsewhere that
36685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // pathname may have another "/" and pathname components added to it,
36695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // without checking for the separator already being there.
36705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The script language and operating system may allow paths like "foo//bar"
36715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // but some of the functions in FilePath will not handle that correctly. In
36725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // particular, RemoveTrailingPathSeparator() only removes one separator, and
36735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it is called in CreateDirectoriesRecursively() assuming that it will change
36745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // a pathname from directory syntax (trailing separator) to filename syntax.
36755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
36765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows this method also replaces the alternate path separator '/' with
36775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
36785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // "bar\\foo".
36795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Normalize();
36815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a pointer to the last occurence of a valid path separator in
36835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the FilePath. On Windows, for example, both '/' and '\' are valid path
36845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // separators. Returns NULL if no path separator was found.
36855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* FindLastPathSeparator() const;
36865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string pathname_;
36885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class FilePath
36895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
36915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
36925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
36945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file was GENERATED by command:
36955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     pump.py gtest-type-util.h.pump
36965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DO NOT EDIT BY HAND!!!
36975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008 Google Inc.
36995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All Rights Reserved.
37005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
37025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
37035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
37045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
37065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
37075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
37085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
37095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
37105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
37115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
37125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
37135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
37145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
37165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
37195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
37215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
37285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Type utilities needed for implementing typed and type-parameterized
37305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
37315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Currently we support at most 50 types in a list, and at most 50
37335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type-parameterized tests in one type-parameterized test case.
37345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Please contact googletestframework@googlegroups.com if you need
37355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// more.
37365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
37385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
37395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
37425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// libstdc++ (which is where cxxabi.h comes from).
37435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_HAS_CXXABI_H_
37445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <cxxabi.h>
37455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# elif defined(__HP_aCC)
37465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <acxx_demangle.h>
37475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_HASH_CXXABI_H_
37485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
37505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
37515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GetTypeName<T>() returns a human-readable name of type T.
37535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NB: This function is also used in Google Mock, so don't move it inside of
37545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the typed-test-only section below.
37555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
37565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetTypeName() {
37575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_HAS_RTTI
37585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const name = typeid(T).name();
37605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
37615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int status = 0;
37625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // gcc's implementation of typeid(T).name() mangles the type name,
37635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // so we have to demangle it.
37645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   if GTEST_HAS_CXXABI_H_
37655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  using abi::__cxa_demangle;
37665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   endif  // GTEST_HAS_CXXABI_H_
37675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
37685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string name_str(status == 0 ? readable_name : name);
37695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  free(readable_name);
37705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return name_str;
37715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
37725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return name;
37735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
37745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
37765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return "<type>";
37785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_HAS_RTTI
37805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
37815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
37835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
37855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type.  This can be used as a compile-time assertion to ensure that
37865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// two types are equal.
37875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
37895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct AssertTypeEq;
37905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
37925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct AssertTypeEq<T, T> {
37935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef bool type;
37945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
37955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A unique type used as the default value for the arguments of class
37975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// template Types.  This allows us to simulate variadic templates
37985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
37995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// support directly.
38005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct None {};
38015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following family of struct and struct templates are used to
38035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
38045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// represents a type list with N types (T1, T2, ..., and TN) in it.
38055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Except for Types0, every struct in the family has two member types:
38065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Head for the first type in the list, and Tail for the rest of the
38075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// list.
38085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The empty type list.
38105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types0 {};
38115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Type lists of length 1, 2, 3, and so on.
38135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1>
38155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types1 {
38165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types0 Tail;
38185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
38205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types2 {
38215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types1<T2> Tail;
38235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3>
38265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types3 {
38275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types2<T2, T3> Tail;
38295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4>
38325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types4 {
38335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types3<T2, T3, T4> Tail;
38355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
38385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types5 {
38395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types4<T2, T3, T4, T5> Tail;
38415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6>
38455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types6 {
38465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types5<T2, T3, T4, T5, T6> Tail;
38485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7>
38525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types7 {
38535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
38555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8>
38595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types8 {
38605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
38625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9>
38665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types9 {
38675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
38695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10>
38735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types10 {
38745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
38765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
38805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11>
38815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types11 {
38825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
38845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
38885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12>
38895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types12 {
38905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
38925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
38935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
38955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
38965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13>
38975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types13 {
38985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
38995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
39005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14>
39055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types14 {
39065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
39085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15>
39135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types15 {
39145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
39165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15> Tail;
39175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16>
39235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types16 {
39245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16> Tail;
39275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17>
39335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types17 {
39345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17> Tail;
39375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18>
39435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types18 {
39445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18> Tail;
39475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19>
39535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types19 {
39545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19> Tail;
39575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20>
39635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types20 {
39645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20> Tail;
39675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
39735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21>
39745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types21 {
39755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21> Tail;
39785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
39845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22>
39855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types22 {
39865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22> Tail;
39895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
39905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
39925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
39935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
39945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
39955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23>
39965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types23 {
39975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
39985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
40005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24>
40075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types24 {
40085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
40115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25>
40185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types25 {
40195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
40225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
40295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26>
40305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types26 {
40315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
40345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
40415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27>
40425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types27 {
40435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
40465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
40535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28>
40545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types28 {
40555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
40585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
40655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29>
40665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types29 {
40675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
40705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29> Tail;
40715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
40785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30>
40795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types30 {
40805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
40835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30> Tail;
40845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
40875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
40885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
40895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
40905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
40915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
40925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31>
40935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types31 {
40945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
40955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
40975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31> Tail;
40985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32>
41075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types32 {
41085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32> Tail;
41125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
41135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33>
41215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types33 {
41225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33> Tail;
41265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
41275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34>
41355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types34 {
41365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34> Tail;
41405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
41415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35>
41495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types35 {
41505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35> Tail;
41545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
41555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
41635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36>
41645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types36 {
41655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36> Tail;
41695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
41705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
41785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37>
41795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types37 {
41805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
41845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
41855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
41875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
41885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
41895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
41905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
41915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
41925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
41935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38>
41945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types38 {
41955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
41965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
41975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
41985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
41995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
42045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
42055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
42065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
42075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
42085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39>
42095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types39 {
42105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
42115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
42145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
42195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
42205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
42215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
42225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
42235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40>
42245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types40 {
42255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
42265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
42295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
42345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
42355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
42365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
42375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
42385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
42395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41>
42405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types41 {
42415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
42425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
42455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
42505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
42515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
42525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
42535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
42545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
42555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42>
42565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types42 {
42575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
42585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
42615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
42665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
42675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
42685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
42695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
42705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
42715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43>
42725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types43 {
42735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
42745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
42775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43> Tail;
42785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
42835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
42845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
42855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
42865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
42875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
42885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44>
42895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types44 {
42905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
42915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
42945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44> Tail;
42955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
42985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
42995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
43005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
43015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
43025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
43035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
43045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
43055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45>
43065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types45 {
43075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
43085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
43105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
43115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44, T45> Tail;
43125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
43135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
43155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
43165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
43175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
43185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
43195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
43205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
43215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
43225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
43235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46>
43245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types46 {
43255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
43265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
43285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
43295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44, T45, T46> Tail;
43305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
43315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
43335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
43345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
43355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
43365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
43375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
43385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
43395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
43405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
43415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47>
43425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types47 {
43435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
43445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
43465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
43475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44, T45, T46, T47> Tail;
43485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
43495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
43515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
43525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
43535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
43545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
43555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
43565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
43575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
43585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
43595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48>
43605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types48 {
43615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
43625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
43645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
43655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44, T45, T46, T47, T48> Tail;
43665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
43675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
43695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
43705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
43715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
43725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
43735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
43745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
43755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
43765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
43775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49>
43785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types49 {
43795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
43805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
43825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
43835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44, T45, T46, T47, T48, T49> Tail;
43845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
43855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
43875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
43885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
43895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
43905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
43915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
43925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
43935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
43945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
43955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49, typename T50>
43965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types50 {
43975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T1 Head;
43985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
44005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
44015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T44, T45, T46, T47, T48, T49, T50> Tail;
44025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
44035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
44065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't want to require the users to write TypesN<...> directly,
44085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as that would require them to count the length.  Types<...> is much
44095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// easier to write, but generates horrible messages when there is a
44105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler error, as gcc insists on printing out each template
44115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// argument, even if it has the default value (this means Types<int>
44125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will appear as Types<int, None, None, ..., None> in the compiler
44135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// errors).
44145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
44155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Our solution is to combine the best part of the two approaches: a
44165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// user would write Types<T1, ..., TN>, and Google Test will translate
44175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that to TypesN<T1, ..., TN> internally to make error messages
44185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// readable.  The translation is done by the 'type' member of the
44195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Types template.
44205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1 = internal::None, typename T2 = internal::None,
44215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T3 = internal::None, typename T4 = internal::None,
44225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T5 = internal::None, typename T6 = internal::None,
44235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T7 = internal::None, typename T8 = internal::None,
44245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T9 = internal::None, typename T10 = internal::None,
44255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11 = internal::None, typename T12 = internal::None,
44265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T13 = internal::None, typename T14 = internal::None,
44275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T15 = internal::None, typename T16 = internal::None,
44285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T17 = internal::None, typename T18 = internal::None,
44295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T19 = internal::None, typename T20 = internal::None,
44305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21 = internal::None, typename T22 = internal::None,
44315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T23 = internal::None, typename T24 = internal::None,
44325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T25 = internal::None, typename T26 = internal::None,
44335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T27 = internal::None, typename T28 = internal::None,
44345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T29 = internal::None, typename T30 = internal::None,
44355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31 = internal::None, typename T32 = internal::None,
44365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T33 = internal::None, typename T34 = internal::None,
44375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T35 = internal::None, typename T36 = internal::None,
44385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T37 = internal::None, typename T38 = internal::None,
44395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T39 = internal::None, typename T40 = internal::None,
44405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41 = internal::None, typename T42 = internal::None,
44415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T43 = internal::None, typename T44 = internal::None,
44425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T45 = internal::None, typename T46 = internal::None,
44435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T47 = internal::None, typename T48 = internal::None,
44445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T49 = internal::None, typename T50 = internal::None>
44455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types {
44465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
44475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
44485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
44495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
44505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
44515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
44535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<internal::None, internal::None, internal::None, internal::None,
44545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
44665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types0 type;
44675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
44685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1>
44695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, internal::None, internal::None, internal::None,
44705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
44825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types1<T1> type;
44835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
44845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
44855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, internal::None, internal::None, internal::None,
44865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
44975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
44985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types2<T1, T2> type;
44995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3>
45015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, internal::None, internal::None, internal::None,
45025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
45135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types3<T1, T2, T3> type;
45145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4>
45165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
45175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
45285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types4<T1, T2, T3, T4> type;
45295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
45315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
45325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
45435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types5<T1, T2, T3, T4, T5> type;
45445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
45465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6>
45475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
45485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
45595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
45605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
45625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7>
45635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
45645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
45755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
45765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
45785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8>
45795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
45805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
45905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
45915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
45935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9>
45945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
45955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
45995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
46055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
46065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
46075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
46085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10>
46095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
46105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
46205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
46215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
46225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
46235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
46245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11>
46255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
46265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
46365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
46375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
46385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
46395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
46405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12>
46415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
46425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
46525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
46535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12> type;
46545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
46555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
46565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
46575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13>
46585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
46595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
46695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
46705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13> type;
46715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
46725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
46735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
46745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14>
46755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
46765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
46855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
46865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14> type;
46875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
46885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
46895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
46905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15>
46915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
46925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
46995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
47015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
47025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15> type;
47035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
47045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
47055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
47065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
47075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16>
47085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, internal::None, internal::None, internal::None, internal::None,
47105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
47185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
47195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16> type;
47205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
47215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
47225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
47235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
47245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17>
47255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, internal::None, internal::None, internal::None, internal::None,
47275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
47355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
47365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17> type;
47375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
47385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
47395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
47405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
47415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18>
47425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, internal::None, internal::None, internal::None,
47445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
47525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
47535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18> type;
47545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
47555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
47565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
47575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
47585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19>
47595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, internal::None, internal::None, internal::None,
47615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
47685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
47695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19> type;
47705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
47715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
47725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
47735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
47745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20>
47755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
47775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
47845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
47855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20> type;
47865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
47875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
47885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
47895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
47905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
47915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21>
47925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
47945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
47995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
48015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
48025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
48035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
48045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
48065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
48075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
48085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22>
48095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
48105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
48115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
48185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
48195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
48205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
48215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
48235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
48245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
48255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23>
48265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
48275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
48285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
48355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
48365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
48375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
48385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
48405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
48415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
48425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24>
48435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
48445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
48455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
48525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
48535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
48545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
48555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
48575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
48585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
48595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25>
48605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
48615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
48625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
48685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
48695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
48705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
48715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
48735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
48745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
48755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
48765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26>
48775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
48785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
48795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
48855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
48865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
48875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26> type;
48885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
48895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
48905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
48915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
48925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
48935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
48945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27>
48955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
48965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
48975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
48995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
49035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
49045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
49055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27> type;
49065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
49075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
49085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
49095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
49105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
49115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
49125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28>
49135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
49145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
49155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
49215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
49225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
49235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28> type;
49245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
49255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
49265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
49275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
49285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
49295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
49305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29>
49315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
49325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
49335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
49395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
49405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
49415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29> type;
49425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
49435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
49445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
49455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
49465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
49475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
49485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30>
49495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
49505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
49515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
49565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
49575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
49585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30> type;
49595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
49605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
49615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
49625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
49635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
49645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
49655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
49665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31>
49675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
49685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
49695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, internal::None, internal::None, internal::None, internal::None,
49705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
49745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
49755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
49765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31> type;
49775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
49785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
49795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
49805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
49815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
49825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
49835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
49845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32>
49855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
49865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
49875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, internal::None, internal::None, internal::None, internal::None,
49885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
49915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
49925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
49935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
49945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32> type;
49955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
49965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
49975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
49985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
49995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
50005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
50015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
50025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33>
50035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
50055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, internal::None, internal::None, internal::None,
50065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
50105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
50115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
50125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33> type;
50135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
50145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
50155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
50165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
50175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
50185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
50195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
50205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34>
50215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
50235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, internal::None, internal::None, internal::None,
50245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
50285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
50295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
50305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34> type;
50315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
50325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
50335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
50345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
50355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
50365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
50375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
50385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35>
50395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
50415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
50425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
50455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
50465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
50475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
50485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
50495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
50505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
50515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
50525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
50535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
50545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
50555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
50565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36>
50575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
50595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
50605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
50635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
50645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
50655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
50665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
50675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
50685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
50695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
50705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
50715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
50725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
50735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
50745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37>
50755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
50775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
50785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
50815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
50825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
50835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
50845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
50855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
50865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
50875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
50885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
50895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
50905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
50915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
50925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38>
50935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
50955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
50965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
50985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
50995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
51005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
51015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
51025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
51035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
51045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
51055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
51065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
51075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
51085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
51095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
51105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39>
51115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
51125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
51135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
51145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
51175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
51185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
51195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
51205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
51215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
51225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
51235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
51245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
51255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
51265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
51275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
51285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40>
51295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
51305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
51315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
51325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
51355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
51365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
51375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
51385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40> type;
51395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
51405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
51415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
51425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
51435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
51445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
51455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
51465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
51475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
51485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41>
51495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
51505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
51515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
51525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None> {
51545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
51555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
51565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
51575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41> type;
51585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
51595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
51605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
51615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
51625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
51635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
51645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
51655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
51665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
51675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42>
51685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
51695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
51705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
51715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
51735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
51745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
51755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
51765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42> type;
51775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
51785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
51795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
51805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
51815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
51825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
51835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
51845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
51855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
51865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43>
51875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
51885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
51895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
51905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
51915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None> {
51925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
51935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
51945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
51955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43> type;
51965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
51975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
51985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
51995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
52005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
52015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
52025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
52035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
52045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
52055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44>
52065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
52075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
52085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
52095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
52105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None> {
52115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
52125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
52135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
52145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44> type;
52155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
52165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
52185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
52195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
52205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
52215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
52225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
52235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
52245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45>
52255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
52265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
52275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
52285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None, internal::None, internal::None, internal::None,
52295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::None> {
52305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
52315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
52325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
52335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45> type;
52345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
52355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
52375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
52385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
52395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
52405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
52415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
52425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
52435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
52445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46>
52455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
52465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
52475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
52485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T46, internal::None, internal::None, internal::None, internal::None> {
52495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
52505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
52515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
52525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45, T46> type;
52535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
52545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
52565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
52575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
52585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
52595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
52605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
52615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
52625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
52635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47>
52645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
52655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
52665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
52675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T46, T47, internal::None, internal::None, internal::None> {
52685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
52695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
52705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
52715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45, T46, T47> type;
52725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
52735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
52755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
52765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
52775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
52785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
52795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
52805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
52815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
52825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48>
52835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
52845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
52855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
52865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T46, T47, T48, internal::None, internal::None> {
52875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
52885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
52895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
52905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45, T46, T47, T48> type;
52915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
52925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
52935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
52945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
52955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
52965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
52975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
52985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
52995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
53005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
53015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49>
53025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
53035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
53045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
53055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T46, T47, T48, T49, internal::None> {
53065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
53075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
53085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
53095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
53105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
53135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_TEMPLATE_ template <typename T> class
53155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The template "selector" struct TemplateSel<Tmpl> is used to
53175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// represent Tmpl, which must be a class template with one type
53185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
53195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as the type Tmpl<T>.  This allows us to actually instantiate the
53205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// template "selected" by TemplateSel<Tmpl>.
53215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
53225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This trick is necessary for simulating typedef for class templates,
53235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// which C++ doesn't support directly.
53245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ Tmpl>
53255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TemplateSel {
53265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
53275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct Bind {
53285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef Tmpl<T> type;
53295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
53305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_BIND_(TmplSel, T) \
53335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TmplSel::template Bind<T>::type
53345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A unique struct template used as the default value for the
53365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// arguments of class template Templates.  This allows us to simulate
53375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// variadic templates (e.g. Templates<int>, Templates<int, double>,
53385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and etc), which C++ doesn't support directly.
53395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
53405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct NoneT {};
53415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following family of struct and struct templates are used to
53435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// represent template lists.  In particular, TemplatesN<T1, T2, ...,
53445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
53455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for Templates0, every struct in the family has two member types:
53465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Head for the selector of the first template in the list, and Tail
53475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for the rest of the list.
53485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The empty template list.
53505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates0 {};
53515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Template lists of length 1, 2, 3, and so on.
53535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1>
53555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates1 {
53565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates0 Tail;
53585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
53605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates2 {
53615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates1<T2> Tail;
53635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
53665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates3 {
53675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates2<T2, T3> Tail;
53695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
53725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4>
53735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates4 {
53745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates3<T2, T3, T4> Tail;
53765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
53795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
53805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates5 {
53815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates4<T2, T3, T4, T5> Tail;
53835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
53865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
53875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates6 {
53885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates5<T2, T3, T4, T5, T6> Tail;
53905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
53935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
53945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7>
53955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates7 {
53965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
53975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
53985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
53995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
54035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates8 {
54045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
54065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
54115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates9 {
54125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
54145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10>
54205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates10 {
54215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
54235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
54295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates11 {
54305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
54325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
54385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates12 {
54395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
54415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
54475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13>
54485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates13 {
54495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
54515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
54575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
54585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates14 {
54595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
54615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14> Tail;
54625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
54685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
54695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates15 {
54705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
54725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15> Tail;
54735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
54795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
54805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16>
54815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates16 {
54825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
54845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16> Tail;
54855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
54885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
54895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
54905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
54915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
54925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
54935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates17 {
54945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
54955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
54965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17> Tail;
54975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
54985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
55055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates18 {
55065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18> Tail;
55095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19>
55185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates19 {
55195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19> Tail;
55225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
55315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates20 {
55325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20> Tail;
55355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
55445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates21 {
55455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21> Tail;
55485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
55575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22>
55585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates22 {
55595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
55625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
55715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
55725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates23 {
55735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
55765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
55855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
55865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates24 {
55875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
55885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
55895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
55905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
55915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
55935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
55945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
55955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
55965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
55975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
55985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
55995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25>
56015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates25 {
56025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
56035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
56045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
56055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
56085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
56095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
56105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
56115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
56125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
56135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
56145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
56165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates26 {
56175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
56185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
56195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
56205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
56235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
56245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
56255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
56265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
56275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
56285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
56295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
56315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates27 {
56325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
56335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
56345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
56355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
56385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
56395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
56405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
56415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
56425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
56435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
56445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
56465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28>
56475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates28 {
56485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
56495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
56505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
56515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28> Tail;
56525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
56555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
56565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
56575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
56585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
56595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
56605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
56615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
56635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
56645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates29 {
56655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
56665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
56675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
56685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29> Tail;
56695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
56725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
56735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
56745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
56755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
56765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
56775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
56785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
56805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
56815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates30 {
56825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
56835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
56845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
56855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30> Tail;
56865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
56895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
56905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
56915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
56925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
56935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
56945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
56955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
56965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
56975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
56985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31>
56995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates31 {
57005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
57015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
57025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
57035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31> Tail;
57045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
57055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
57075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
57085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
57095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
57105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
57115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
57125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
57135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
57145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
57155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
57165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
57175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates32 {
57185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
57195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
57205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
57215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32> Tail;
57225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
57235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
57255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
57265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
57275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
57285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
57295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
57305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
57315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
57325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
57335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
57345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
57355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates33 {
57365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
57375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
57385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
57395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33> Tail;
57405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
57415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
57435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
57445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
57455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
57465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
57475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
57485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
57495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
57505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
57515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
57525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
57535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34>
57545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates34 {
57555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
57565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
57575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
57585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34> Tail;
57595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
57605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
57625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
57635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
57645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
57655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
57665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
57675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
57685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
57695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
57705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
57715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
57725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
57735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates35 {
57745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
57755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
57765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
57775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35> Tail;
57785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
57795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
57815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
57825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
57835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
57845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
57855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
57865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
57875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
57885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
57895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
57905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
57915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
57925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates36 {
57935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
57945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
57955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
57965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
57975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
57985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
58005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
58015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
58025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
58035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
58045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
58055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
58065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
58075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
58085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
58095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
58105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
58115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37>
58125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates37 {
58135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
58145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
58155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
58165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
58175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
58185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
58205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
58215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
58225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
58235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
58245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
58255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
58265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
58275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
58285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
58295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
58305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
58315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
58325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates38 {
58335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
58345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
58355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
58365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
58375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
58385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
58405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
58415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
58425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
58435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
58445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
58455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
58465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
58475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
58485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
58495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
58505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
58515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
58525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates39 {
58535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
58545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
58555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
58565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
58575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
58585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
58605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
58615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
58625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
58635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
58645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
58655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
58665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
58675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
58685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
58695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
58705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
58715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
58725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40>
58735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates40 {
58745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
58755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
58765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
58775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
58785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
58795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
58815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
58825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
58835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
58845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
58855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
58865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
58875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
58885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
58895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
58905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
58915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
58925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
58935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
58945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates41 {
58955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
58965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
58975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
58985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
58995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
59005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
59025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
59035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
59045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
59055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
59065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
59075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
59085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
59095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
59105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
59115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
59125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
59135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
59145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
59155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates42 {
59165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
59175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
59185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
59195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
59205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42> Tail;
59215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
59225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
59245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
59255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
59265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
59275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
59285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
59295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
59305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
59315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
59325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
59335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
59345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
59355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
59365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
59375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43>
59385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates43 {
59395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
59405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
59415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
59425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
59435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43> Tail;
59445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
59455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
59475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
59485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
59495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
59505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
59515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
59525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
59535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
59545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
59555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
59565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
59575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
59585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
59595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
59605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
59615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates44 {
59625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
59635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
59645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
59655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
59665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44> Tail;
59675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
59685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
59705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
59715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
59725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
59735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
59745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
59755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
59765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
59775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
59785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
59795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
59805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
59815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
59825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
59835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
59845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates45 {
59855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
59865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
59875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
59885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
59895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44, T45> Tail;
59905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
59915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
59935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
59945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
59955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
59965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
59975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
59985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
59995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
60005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
60015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
60025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
60035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
60045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
60055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
60065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
60075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46>
60085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates46 {
60095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
60105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
60115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
60125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
60135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44, T45, T46> Tail;
60145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
60155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
60175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
60185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
60195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
60205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
60215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
60225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
60235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
60245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
60255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
60265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
60275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
60285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
60295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
60305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
60315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
60325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates47 {
60335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
60345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
60355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
60365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
60375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44, T45, T46, T47> Tail;
60385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
60395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
60415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
60425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
60435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
60445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
60455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
60465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
60475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
60485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
60495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
60505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
60515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
60525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
60535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
60545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
60555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
60565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates48 {
60575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
60585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
60595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
60605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
60615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44, T45, T46, T47, T48> Tail;
60625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
60635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
60655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
60665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
60675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
60685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
60695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
60705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
60715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
60725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
60735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
60745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
60755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
60765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
60775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
60785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
60795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
60805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T49>
60815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates49 {
60825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
60835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
60845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
60855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
60865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44, T45, T46, T47, T48, T49> Tail;
60875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
60885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
60905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
60915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
60925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
60935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
60945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
60955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
60965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
60975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
60985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
60995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
61005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
61015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
61025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
61035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
61045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
61055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
61065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates50 {
61075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef TemplateSel<T1> Head;
61085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
61095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
61105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
61115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
61125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
61135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't want to require the users to write TemplatesN<...> directly,
61165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as that would require them to count the length.  Templates<...> is much
61175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// easier to write, but generates horrible messages when there is a
61185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler error, as gcc insists on printing out each template
61195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// argument, even if it has the default value (this means Templates<list>
61205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
61215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// errors).
61225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Our solution is to combine the best part of the two approaches: a
61245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// user would write Templates<T1, ..., TN>, and Google Test will translate
61255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that to TemplatesN<T1, ..., TN> internally to make error messages
61265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// readable.  The translation is done by the 'type' member of the
61275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Templates template.
61285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
61295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
61305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
61315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
61325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
61335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
61345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
61355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
61365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
61375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
61385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
61395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
61405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
61415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
61425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
61435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
61445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
61455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
61465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
61475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
61485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
61495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
61505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
61515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
61525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
61535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates {
61545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
61555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
61565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
61575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
61585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
61595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
61615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT> {
61675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates0 type;
61685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
61695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1>
61705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT> {
61765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates1<T1> type;
61775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
61785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
61795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT> {
61855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates2<T1, T2> type;
61865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
61875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
61885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
61935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates3<T1, T2, T3> type;
61945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
61955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
61965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4>
61975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
61995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates4<T1, T2, T3, T4> type;
62035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
62065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates5<T1, T2, T3, T4, T5> type;
62125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
62155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
62165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
62215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7>
62255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
62265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
62315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
62355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
62365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
62415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
62455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
62465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
62515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
62555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10>
62565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
62575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
62625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
62665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
62675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
62685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
62735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
62775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
62785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
62795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
62845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
62875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
62885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
62895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13>
62905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
62915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
62945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
62955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
62965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13> type;
62975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
62985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
62995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
63035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
63085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14> type;
63105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
63165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT> {
63215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15> type;
63235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
63295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16>
63305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT> {
63355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16> type;
63375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
63435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
63445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT> {
63495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17> type;
63515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
63575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
63585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT> {
63635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18> type;
63655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
63715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
63725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19>
63735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT> {
63785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19> type;
63805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
63855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
63865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
63875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
63885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
63895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
63925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT> {
63935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
63945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20> type;
63955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
63965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
63975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
63985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
63995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
64035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
64045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
64055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT> {
64085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
64095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21> type;
64105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
64115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
64125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
64135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
64145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
64185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22>
64195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
64205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
64215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT> {
64245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
64255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
64265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
64275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
64285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
64295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
64305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
64345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
64355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
64365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
64375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT> {
64405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
64415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
64425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
64435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
64445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
64455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
64465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
64505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
64515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
64525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
64535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT> {
64565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
64575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
64585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
64595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
64605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
64615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
64625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
64665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
64675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25>
64685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
64695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
64705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT> {
64735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
64745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
64755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
64765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
64775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
64785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
64795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
64835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
64845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
64855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
64865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
64875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
64895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT> {
64905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
64915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
64925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
64935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
64945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
64955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
64965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
64975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
64985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
64995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
65005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
65015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
65025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
65035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
65045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT> {
65075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
65085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
65095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27> type;
65105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
65115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
65125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
65135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
65145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
65155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
65165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
65175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
65185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
65195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
65205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28>
65215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
65225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
65235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT> {
65265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
65275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
65285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28> type;
65295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
65305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
65315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
65325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
65335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
65345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
65355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
65365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
65375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
65385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
65395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
65405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
65415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
65425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT> {
65455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
65465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
65475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29> type;
65485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
65495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
65505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
65515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
65525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
65535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
65545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
65555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
65565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
65575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
65585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
65595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
65605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
65615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
65635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
65645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
65655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30> type;
65665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
65675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
65685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
65695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
65705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
65715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
65725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
65735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
65745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
65755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
65765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
65775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31>
65785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
65795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
65805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
65815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
65825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
65835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
65845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31> type;
65855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
65865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
65875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
65885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
65895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
65905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
65915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
65925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
65935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
65945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
65955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
65965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
65975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
65985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
65995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
66005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
66015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
66025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
66035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32> type;
66045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
66055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
66065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
66075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
66085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
66095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
66105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
66115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
66125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
66135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
66145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
66155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
66165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
66175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
66185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
66195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
66205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
66215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
66225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33> type;
66235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
66245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
66255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
66265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
66275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
66285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
66295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
66305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
66315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
66325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
66335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
66345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
66355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34>
66365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
66375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
66385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
66395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
66405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
66415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
66425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34> type;
66435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
66445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
66455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
66465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
66475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
66485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
66495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
66505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
66515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
66525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
66535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
66545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
66555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
66565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
66575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
66585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
66595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
66605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
66615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
66625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35> type;
66635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
66645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
66655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
66665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
66675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
66685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
66695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
66705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
66715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
66725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
66735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
66745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
66755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
66765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
66775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
66785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
66795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
66805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
66815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
66825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
66835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
66845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
66855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
66865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
66875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
66885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
66895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
66905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
66915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
66925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
66935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
66945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
66955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
66965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37>
66975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
66985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
66995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
67005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
67015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
67025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
67035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
67045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
67055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
67065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
67075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
67085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
67095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
67105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
67115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
67125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
67135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
67145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
67155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
67165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
67175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
67185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
67195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
67205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
67215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
67225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
67235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
67245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
67255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
67265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
67275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
67285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
67295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
67305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
67315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
67325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
67335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
67345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
67355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
67365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
67375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
67385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
67395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
67405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
67415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
67425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
67435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
67445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
67455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
67465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
67475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
67485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
67495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
67505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
67515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
67525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
67535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
67545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
67555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
67565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
67575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
67585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
67595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
67605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40>
67615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
67625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
67635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
67645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
67655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
67665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
67675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
67685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
67695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
67705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
67715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
67725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
67735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
67745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
67755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
67765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
67775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
67785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
67795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
67805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
67815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
67825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
67835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
67845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
67855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
67865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
67875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
67885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
67895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
67905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41> type;
67915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
67925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
67935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
67945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
67955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
67965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
67975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
67985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
67995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
68005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
68015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
68025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
68035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
68045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
68055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
68065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
68075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
68085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
68095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
68105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
68115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
68125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
68135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42> type;
68145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
68155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
68165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
68175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
68185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
68195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
68205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
68215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
68225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
68235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
68245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
68255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
68265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
68275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
68285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
68295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43>
68305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
68315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
68325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
68335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
68345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
68355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
68365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
68375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43> type;
68385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
68395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
68405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
68415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
68425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
68435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
68445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
68455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
68465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
68475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
68485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
68495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
68505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
68515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
68525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
68535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
68545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
68555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
68565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
68575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
68585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
68595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
68605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
68615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44> type;
68625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
68635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
68645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
68655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
68665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
68675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
68685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
68695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
68705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
68715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
68725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
68735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
68745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
68755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
68765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
68775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
68785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
68795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
68805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
68815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
68825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
68835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
68845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
68855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44, T45> type;
68865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
68875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
68885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
68895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
68905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
68915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
68925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
68935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
68945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
68955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
68965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
68975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
68985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
68995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
69005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
69015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
69025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46>
69035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
69045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
69055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
69065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T45, T46, NoneT, NoneT, NoneT, NoneT> {
69075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
69085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
69095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
69105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44, T45, T46> type;
69115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
69125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
69135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
69145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
69155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
69165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
69175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
69185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
69195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
69205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
69215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
69225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
69235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
69245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
69255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
69265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
69275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
69285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
69295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
69305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
69315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T45, T46, T47, NoneT, NoneT, NoneT> {
69325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
69335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
69345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
69355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44, T45, T46, T47> type;
69365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
69375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
69385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
69395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
69405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
69415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
69425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
69435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
69445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
69455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
69465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
69475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
69485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
69495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
69505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
69515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
69525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
69535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
69545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
69555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
69565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T45, T46, T47, T48, NoneT, NoneT> {
69575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
69585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
69595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
69605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44, T45, T46, T47, T48> type;
69615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
69625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
69635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
69645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
69655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
69665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
69675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
69685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
69695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
69705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
69715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
69725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
69735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
69745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
69755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
69765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
69775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
69785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEMPLATE_ T49>
69795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
69805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
69815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
69825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T45, T46, T47, T48, T49, NoneT> {
69835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
69845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
69855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
69865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42, T43, T44, T45, T46, T47, T48, T49> type;
69875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
69885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The TypeList template makes it possible to use either a single type
69905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or a Types<...> list in TYPED_TEST_CASE() and
69915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TYPED_TEST_CASE_P().
69925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
69945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TypeList {
69955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Types1<T> type;
69965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
69975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
69995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
70005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
70015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
70025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
70035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
70045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
70055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
70065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
70075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49, typename T50>
70085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
70095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
70105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
70115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45, T46, T47, T48, T49, T50> > {
70125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
70135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
70145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
70155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
70165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
70175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
70195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
70215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
70225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
70245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Due to C++ preprocessor weirdness, we need double indirection to
70265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// concatenate two tokens when one of them is __LINE__.  Writing
70275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   foo ## __LINE__
70295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will result in the token foo__LINE__, instead of foo followed by
70315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the current line number.  For more details, see
70325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
70335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
70345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
70355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ProtocolMessage;
70375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace proto2 { class Message; }
70385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
70405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Forward declarations.
70425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass AssertionResult;                 // Result of an assertion.
70445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Message;                         // Represents a failure message.
70455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Test;                            // Represents a test.
70465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestInfo;                        // Information about a test.
70475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestPartResult;                  // Result of a test part.
70485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UnitTest;                        // A collection of test cases.
70495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
70515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang::std::string PrintToString(const T& value);
70525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
70545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TraceInfo;                      // Information about a trace point.
70565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ScopedTrace;                     // Implements scoped trace.
70575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestInfoImpl;                    // Opaque implementation of TestInfo
70585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UnitTestImpl;                    // Opaque implementation of UnitTest
70595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// How many times InitGoogleTest() has been called.
70615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ extern int g_init_gtest_count;
70625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The text used in failure messages to indicate the start of the
70645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// stack trace.
70655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ extern const char kStackTraceMarker[];
70665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Two overloaded helpers for checking at compile time whether an
70685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// expression is a null pointer literal (i.e. NULL or any 0-valued
70695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compile-time integral constant).  Their return values have
70705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// different sizes, so we can use sizeof() to test which version is
70715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// picked by the compiler.  These helpers have no implementations, as
70725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// we only need their signatures.
70735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Given IsNullLiteralHelper(x), the compiler will pick the first
70755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// version if x can be implicitly converted to Secret*, and pick the
70765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// second version otherwise.  Since Secret is a secret and incomplete
70775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type, the only expression a user can write that has type Secret* is
70785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a null pointer literal.  Therefore, we know that x is a null
70795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pointer literal if and only if the first version is picked by the
70805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler.
70815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangchar IsNullLiteralHelper(Secret* p);
70825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangchar (&IsNullLiteralHelper(...))[2];  // NOLINT
70835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A compile-time bool constant that is true if and only if x is a
70855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// null pointer literal (i.e. NULL or any 0-valued compile-time
70865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// integral constant).
70875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef GTEST_ELLIPSIS_NEEDS_POD_
70885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We lose support for NULL detection where the compiler doesn't like
70895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// passing non-POD classes through ellipsis (...).
70905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_IS_NULL_LITERAL_(x) false
70915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
70925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_IS_NULL_LITERAL_(x) \
70935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
70945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_ELLIPSIS_NEEDS_POD_
70955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Appends the user-supplied message to the Google-Test-generated message.
70975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string AppendUserMessage(
70985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& gtest_msg, const Message& user_msg);
70995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
71015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This exception is thrown by (and only by) a failed Google Test
71035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
71045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// are enabled).  We derive it from std::runtime_error, which is for
71055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// errors presumably detectable only at run time.  Since
71065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// std::runtime_error inherits from std::exception, many testing
71075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// frameworks know how to extract and print the message inside it.
71085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
71095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
71105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit GoogleTestFailureException(const TestPartResult& failure);
71115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
71125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_EXCEPTIONS
71145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A helper class for creating scoped traces in user programs.
71165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ ScopedTrace {
71175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
71185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The c'tor pushes the given source file location and message onto
71195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // a trace stack maintained by Google Test.
71205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ScopedTrace(const char* file, int line, const Message& message);
71215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The d'tor pops the info pushed by the c'tor.
71235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
71245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Note that the d'tor is not virtual in order to be efficient.
71255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Don't inherit from ScopedTrace!
71265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~ScopedTrace();
71275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
71295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
71305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
71315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            // c'tor and d'tor.  Therefore it doesn't
71325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            // need to be used otherwise.
71335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs and returns the message for an equality assertion
71355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
71365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The first four parameters are the expressions used in the assertion
71385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
71395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// where foo is 5 and bar is 6, we have:
71405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   expected_expression: "foo"
71425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   actual_expression:   "bar"
71435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   expected_value:      "5"
71445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   actual_value:        "6"
71455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The ignoring_case parameter is true iff the assertion is a
71475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
71485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// be inserted into the message.
71495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ AssertionResult EqFailure(const char* expected_expression,
71505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const char* actual_expression,
71515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const std::string& expected_value,
71525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const std::string& actual_value,
71535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     bool ignoring_case);
71545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
71565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string GetBoolAssertionFailureMessage(
71575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const AssertionResult& assertion_result,
71585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* expression_text,
71595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* actual_predicate_value,
71605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* expected_predicate_value);
71615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This template class represents an IEEE floating-point number
71635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (either single-precision or double-precision, depending on the
71645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// template parameters).
71655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The purpose of this class is to do more sophisticated number
71675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// comparison.  (Due to round-off error, etc, it's very unlikely that
71685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// two floating-points will be equal exactly.  Hence a naive
71695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// comparison by the == operation often doesn't work.)
71705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Format of IEEE floating-point:
71725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   The most-significant bit being the leftmost, an IEEE
71745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   floating-point looks like
71755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     sign_bit exponent_bits fraction_bits
71775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Here, sign_bit is a single bit that designates the sign of the
71795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   number.
71805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   For float, there are 8 exponent bits and 23 fraction bits.
71825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   For double, there are 11 exponent bits and 52 fraction bits.
71845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   More details can be found at
71865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
71875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Template parameter:
71895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   RawType: the raw floating-point type (either float or double)
71915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename RawType>
71925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FloatingPoint {
71935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
71945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Defines the unsigned integer type that has the same size as the
71955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // floating point number.
71965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
71975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constants.
71995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // # of bits in a number.
72015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const size_t kBitCount = 8*sizeof(RawType);
72025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // # of fraction bits in a number.
72045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const size_t kFractionBitCount =
72055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    std::numeric_limits<RawType>::digits - 1;
72065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // # of exponent bits in a number.
72085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
72095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The mask for the sign bit.
72115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
72125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The mask for the fraction bits.
72145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const Bits kFractionBitMask =
72155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
72165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The mask for the exponent bits.
72185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
72195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // How many ULP's (Units in the Last Place) we want to tolerate when
72215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // comparing two numbers.  The larger the value, the more error we
72225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // allow.  A 0 value means that two numbers must be exactly the same
72235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to be considered equal.
72245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
72255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The maximum error of a single floating-point operation is 0.5
72265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // units in the last place.  On Intel CPU's, all floating-point
72275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // calculations are done with 80-bit precision, while double has 64
72285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // bits.  Therefore, 4 should be enough for ordinary use.
72295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
72305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // See the following article for more details on ULP:
72315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
72325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const size_t kMaxUlps = 4;
72335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructs a FloatingPoint from a raw floating-point number.
72355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
72365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
72375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // around may change its bits, although the new value is guaranteed
72385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to be also a NAN.  Therefore, don't expect this constructor to
72395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // preserve the bits in x when x is a NAN.
72405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
72415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Static methods
72435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Reinterprets a bit pattern as a floating-point number.
72455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
72465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This function is needed to test the AlmostEquals() method.
72475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static RawType ReinterpretBits(const Bits bits) {
72485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    FloatingPoint fp(0);
72495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fp.u_.bits_ = bits;
72505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return fp.u_.value_;
72515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
72525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the floating-point number that represent positive infinity.
72545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static RawType Infinity() {
72555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ReinterpretBits(kExponentBitMask);
72565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
72575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the maximum representable finite floating-point number.
72595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static RawType Max();
72605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Non-static methods
72625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the bits that represents this number.
72645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Bits &bits() const { return u_.bits_; }
72655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the exponent bits of this number.
72675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
72685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the fraction bits of this number.
72705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
72715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the sign bit of this number.
72735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
72745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff this is NAN (not a number).
72765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool is_nan() const {
72775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // It's a NAN if the exponent bits are all ones and the fraction
72785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // bits are not entirely zeros.
72795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
72805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
72815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff this number is at most kMaxUlps ULP's away from
72835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // rhs.  In particular, this function:
72845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
72855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   - returns false if either number is (or both are) NAN.
72865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   - treats really large numbers as almost equal to infinity.
72875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
72885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool AlmostEquals(const FloatingPoint& rhs) const {
72895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // The IEEE standard says that any comparison operation involving
72905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // a NAN must return false.
72915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (is_nan() || rhs.is_nan()) return false;
72925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
72945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        <= kMaxUlps;
72955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
72965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
72985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The data type used to store the actual floating-point number.
72995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  union FloatingPointUnion {
73005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    RawType value_;  // The raw floating-point number.
73015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Bits bits_;      // The bits that represent the number.
73025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
73035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Converts an integer from the sign-and-magnitude representation to
73055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the biased representation.  More precisely, let N be 2 to the
73065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // power of (kBitCount - 1), an integer x is represented by the
73075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // unsigned number x + N.
73085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
73095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // For instance,
73105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
73115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   -N + 1 (the most negative number representable using
73125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //          sign-and-magnitude) is represented by 1;
73135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   0      is represented by N; and
73145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   N - 1  (the biggest number representable using
73155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //          sign-and-magnitude) is represented by 2N - 1.
73165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
73175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Read http://en.wikipedia.org/wiki/Signed_number_representations
73185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // for more details on signed number representations.
73195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
73205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (kSignBitMask & sam) {
73215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // sam represents a negative number.
73225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return ~sam + 1;
73235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
73245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // sam represents a positive number.
73255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return kSignBitMask | sam;
73265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
73275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Given two numbers in the sign-and-magnitude representation,
73305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // returns the distance between them as an unsigned number.
73315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
73325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                     const Bits &sam2) {
73335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
73345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
73355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
73365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FloatingPointUnion u_;
73395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
73405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
73425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macro defined by <windows.h>.
73435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
73445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline float FloatingPoint<float>::Max() { return FLT_MAX; }
73455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
73465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline double FloatingPoint<double>::Max() { return DBL_MAX; }
73475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Typedefs the instances of the FloatingPoint template class that we
73495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// care to use.
73505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef FloatingPoint<float> Float;
73515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef FloatingPoint<double> Double;
73525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In order to catch the mistake of putting tests that use different
73545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test fixture classes in the same test case, we need to assign
73555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// unique IDs to fixture classes and compare them.  The TypeId type is
73565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// used to hold such IDs.  The user should treat TypeId as an opaque
73575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type: the only operation allowed on TypeId values is to compare
73585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// them for equality using the == operator.
73595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef const void* TypeId;
73605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
73625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeIdHelper {
73635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
73645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // dummy_ must not have a const type.  Otherwise an overly eager
73655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
73665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
73675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool dummy_;
73685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
73695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
73715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool TypeIdHelper<T>::dummy_ = false;
73725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GetTypeId<T>() returns the ID of type T.  Different values will be
73745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returned for different types.  Calling the function twice with the
73755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// same type argument is guaranteed to return the same ID.
73765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
73775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTypeId GetTypeId() {
73785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The compiler is required to allocate a different
73795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
73805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the template.  Therefore, the address of dummy_ is guaranteed to
73815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // be unique.
73825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return &(TypeIdHelper<T>::dummy_);
73835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
73845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the type ID of ::testing::Test.  Always call this instead
73865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of GetTypeId< ::testing::Test>() to get the type ID of
73875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::testing::Test, as the latter may give the wrong result due to a
73885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// suspected linker bug when compiling Google Test as a Mac OS X
73895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// framework.
73905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ TypeId GetTestTypeId();
73915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defines the abstract factory interface that creates instances
73935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of a Test object.
73945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestFactoryBase {
73955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
73965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~TestFactoryBase() {}
73975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Creates a test instance to run. The instance is both created and destroyed
73995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // within TestInfoImpl::Run()
74005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual Test* CreateTest() = 0;
74015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang protected:
74035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestFactoryBase() {}
74045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
74065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
74075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
74085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class provides implementation of TeastFactoryBase interface.
74105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// It is used in TEST and TEST_F macros.
74115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class TestClass>
74125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestFactoryImpl : public TestFactoryBase {
74135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
74145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual Test* CreateTest() { return new TestClass; }
74155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
74165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
74185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Predicate-formatters for implementing the HRESULT checking macros
74205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
74215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We pass a long instead of HRESULT to avoid causing an
74225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// include dependency for the HRESULT type.
74235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
74245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            long hr);  // NOLINT
74255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
74265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            long hr);  // NOLINT
74275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
74295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Types of SetUpTestCase() and TearDownTestCase() functions.
74315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef void (*SetUpTestCaseFunc)();
74325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef void (*TearDownTestCaseFunc)();
74335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a new TestInfo object and registers it with Google Test;
74355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns the created object.
74365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
74375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Arguments:
74385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
74395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   test_case_name:   name of the test case
74405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   name:             name of the test
74415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   type_param        the name of the test's type parameter, or NULL if
74425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     this is not a typed or a type-parameterized test.
74435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   value_param       text representation of the test's value parameter,
74445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     or NULL if this is not a type-parameterized test.
74455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   fixture_class_id: ID of the test fixture class
74465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   set_up_tc:        pointer to the function that sets up the test case
74475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   tear_down_tc:     pointer to the function that tears down the test case
74485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   factory:          pointer to the factory that creates a test object.
74495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     The newly created TestInfo instance will assume
74505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     ownership of the factory object.
74515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ TestInfo* MakeAndRegisterTestInfo(
74525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* test_case_name,
74535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* name,
74545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* type_param,
74555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* value_param,
74565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TypeId fixture_class_id,
74575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SetUpTestCaseFunc set_up_tc,
74585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TearDownTestCaseFunc tear_down_tc,
74595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestFactoryBase* factory);
74605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If *pstr starts with the given prefix, modifies *pstr to be right
74625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// past the prefix and returns true; otherwise leaves *pstr unchanged
74635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and returns false.  None of pstr, *pstr, and prefix can be NULL.
74645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
74655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
74675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// State of the definition of a type-parameterized test case.
74695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ TypedTestCasePState {
74705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
74715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TypedTestCasePState() : registered_(false) {}
74725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Adds the given test name to defined_test_names_ and return true
74745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // if the test case hasn't been registered; otherwise aborts the
74755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // program.
74765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool AddTestName(const char* file, int line, const char* case_name,
74775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   const char* test_name) {
74785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (registered_) {
74795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fprintf(stderr, "%s Test %s must be defined before "
74805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
74815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              FormatFileLocation(file, line).c_str(), test_name, case_name);
74825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fflush(stderr);
74835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      posix::Abort();
74845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
74855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    defined_test_names_.insert(test_name);
74865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
74875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
74885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Verifies that registered_tests match the test names in
74905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // defined_test_names_; returns registered_tests if successful, or
74915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // aborts the program otherwise.
74925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* VerifyRegisteredTestNames(
74935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* file, int line, const char* registered_tests);
74945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
74965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool registered_;
74975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::set<const char*> defined_test_names_;
74985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
74995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Skips to the first non-space char after the first comma in 'str';
75015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns NULL if no comma is found in 'str'.
75025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline const char* SkipComma(const char* str) {
75035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* comma = strchr(str, ',');
75045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (comma == NULL) {
75055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return NULL;
75065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  while (IsSpace(*(++comma))) {}
75085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return comma;
75095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
75105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the prefix of 'str' before the first comma in it; returns
75125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the entire string if it contains no comma.
75135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline std::string GetPrefixUntilComma(const char* str) {
75145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* comma = strchr(str, ',');
75155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return comma == NULL ? str : std::string(str, comma);
75165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
75175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
75195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// registers a list of type-parameterized tests with Google Test.  The
75205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// return value is insignificant - we just need to return something
75215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// such that we can call this function in a namespace scope.
75225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
75235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implementation note: The GTEST_TEMPLATE_ macro declares a template
75245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// template parameter.  It's defined in gtest-type-util.h.
75255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
75265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeParameterizedTest {
75275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
75285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // 'index' is the index of the test in the type list 'Types'
75295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
75305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Types).  Valid values for 'index' are [0, N - 1] where N is the
75315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // length of Types.
75325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Register(const char* prefix, const char* case_name,
75335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const char* test_names, int index) {
75345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef typename Types::Head Type;
75355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef Fixture<Type> FixtureClass;
75365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
75375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // First, registers the first type-parameterized test in the type
75395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // list.
75405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    MakeAndRegisterTestInfo(
75415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
75425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         + StreamableToString(index)).c_str(),
75435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GetPrefixUntilComma(test_names).c_str(),
75445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GetTypeName<Type>().c_str(),
75455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        NULL,  // No value parameter.
75465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GetTypeId<FixtureClass>(),
75475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        TestClass::SetUpTestCase,
75485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        TestClass::TearDownTestCase,
75495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new TestFactoryImpl<TestClass>);
75505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Next, recurses (at compile time) with the tail of the type list.
75525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
75535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ::Register(prefix, case_name, test_names, index + 1);
75545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
75565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The base case for the compile time recursion.
75585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ Fixture, class TestSel>
75595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeParameterizedTest<Fixture, TestSel, Types0> {
75605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
75615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
75625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const char* /*test_names*/, int /*index*/) {
75635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
75645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
75665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
75685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// registers *all combinations* of 'Tests' and 'Types' with Google
75695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Test.  The return value is insignificant - we just need to return
75705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// something such that we can call this function in a namespace scope.
75715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
75725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeParameterizedTestCase {
75735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
75745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Register(const char* prefix, const char* case_name,
75755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const char* test_names) {
75765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef typename Tests::Head Head;
75775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // First, register the first test in 'Test' for each type in 'Types'.
75795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TypeParameterizedTest<Fixture, Head, Types>::Register(
75805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        prefix, case_name, test_names, 0);
75815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Next, recurses (at compile time) with the tail of the test list.
75835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
75845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ::Register(prefix, case_name, SkipComma(test_names));
75855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
75875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The base case for the compile time recursion.
75895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <GTEST_TEMPLATE_ Fixture, typename Types>
75905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeParameterizedTestCase<Fixture, Templates0, Types> {
75915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
75925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
75935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const char* /*test_names*/) {
75945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
75955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
75975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
75995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current OS stack trace as an std::string.
76015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
76025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum number of stack frames to be included is specified by
76035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the gtest_stack_trace_depth flag.  The skip_count parameter
76045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specifies the number of top frames to be skipped, which doesn't
76055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// count against the number of frames to be included.
76065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
76075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For example, if Foo() calls Bar(), which in turn calls
76085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
76095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
76105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
76115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UnitTest* unit_test, int skip_count);
76125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helpers for suppressing warnings on unreachable code or constant
76145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// condition.
76155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Always returns true.
76175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool AlwaysTrue();
76185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Always returns false.
76205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool AlwaysFalse() { return !AlwaysTrue(); }
76215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper for suppressing false warning from Clang on a const char*
76235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// variable declared in a conditional expression always being NULL in
76245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the else branch.
76255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct GTEST_API_ ConstCharPtr {
76265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ConstCharPtr(const char* str) : value(str) {}
76275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator bool() const { return true; }
76285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* value;
76295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
76305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A simple Linear Congruential Generator for generating random
76325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// numbers with a uniform distribution.  Unlike rand() and srand(), it
76335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// doesn't use global state (and therefore can't interfere with user
76345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
76355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// but it's good enough for our purposes.
76365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ Random {
76375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
76385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const UInt32 kMaxRange = 1u << 31;
76395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit Random(UInt32 seed) : state_(seed) {}
76415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Reseed(UInt32 seed) { state_ = seed; }
76435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Generates a random number from [0, range).  Crashes if 'range' is
76455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // 0 or greater than kMaxRange.
76465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UInt32 Generate(UInt32 range);
76475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
76495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UInt32 state_;
76505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
76515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
76525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
76545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler error iff T1 and T2 are different types.
76555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
76565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct CompileAssertTypesEqual;
76575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
76595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct CompileAssertTypesEqual<T, T> {
76605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
76615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Removes the reference from a type if it is a reference type,
76635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise leaves it unchanged.  This is the same as
76645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tr1::remove_reference, which is not widely available yet.
76655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
76665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct RemoveReference { typedef T type; };  // NOLINT
76675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
76685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct RemoveReference<T&> { typedef T type; };  // NOLINT
76695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A handy wrapper around RemoveReference that works when the argument
76715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// T depends on template parameters.
76725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_REMOVE_REFERENCE_(T) \
76735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ::testing::internal::RemoveReference<T>::type
76745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Removes const from a type if it is a const type, otherwise leaves
76765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it unchanged.  This is the same as tr1::remove_const, which is not
76775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// widely available yet.
76785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
76795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct RemoveConst { typedef T type; };  // NOLINT
76805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
76815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct RemoveConst<const T> { typedef T type; };  // NOLINT
76825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
76845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// definition to fail to remove the const in 'const int[3]' and 'const
76855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// char[3][4]'.  The following specialization works around the bug.
76865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, size_t N>
76875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct RemoveConst<const T[N]> {
76885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename RemoveConst<T>::type type[N];
76895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
76905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(_MSC_VER) && _MSC_VER < 1400
76925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is the only specialization that allows VC++ 7.1 to remove const in
76935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
76945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and thus needs to be conditionally compiled.
76955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, size_t N>
76965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct RemoveConst<T[N]> {
76975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename RemoveConst<T>::type type[N];
76985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
76995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
77005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A handy wrapper around RemoveConst that works when the argument
77025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// T depends on template parameters.
77035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_REMOVE_CONST_(T) \
77045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ::testing::internal::RemoveConst<T>::type
77055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Turns const U&, U&, const U, and U all into U.
77075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
77085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
77095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds reference to a type if it is not a reference type,
77115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise leaves it unchanged.  This is the same as
77125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tr1::add_reference, which is not widely available yet.
77135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
77145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct AddReference { typedef T& type; };  // NOLINT
77155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
77165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct AddReference<T&> { typedef T& type; };  // NOLINT
77175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A handy wrapper around AddReference that works when the argument T
77195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// depends on template parameters.
77205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_ADD_REFERENCE_(T) \
77215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ::testing::internal::AddReference<T>::type
77225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a reference to const on top of T as necessary.  For example,
77245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it transforms
77255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
77265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   char         ==> const char&
77275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   const char   ==> const char&
77285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   char&        ==> const char&
77295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   const char&  ==> const char&
77305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
77315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The argument T must depend on some template parameters.
77325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_REFERENCE_TO_CONST_(T) \
77335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
77345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ImplicitlyConvertible<From, To>::value is a compile-time bool
77365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// constant that's true iff type From can be implicitly converted to
77375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type To.
77385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename From, typename To>
77395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ImplicitlyConvertible {
77405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
77415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We need the following helper functions only for their types.
77425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // They have no implementations.
77435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // MakeFrom() is an expression whose type is From.  We cannot simply
77455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // use From(), as the type From may not have a public default
77465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // constructor.
77475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static From MakeFrom();
77485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // These two functions are overloaded.  Given an expression
77505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Helper(x), the compiler will pick the first version if x can be
77515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // implicitly converted to type To; otherwise it will pick the
77525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // second version.
77535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
77545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The first version returns a value of size 1, and the second
77555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // version returns a value of size 2.  Therefore, by checking the
77565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // size of Helper(x), which can be done at compile time, we can tell
77575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // which version of Helper() is used, and hence whether x can be
77585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // implicitly converted to type To.
77595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static char Helper(To);
77605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static char (&Helper(...))[2];  // NOLINT
77615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We have to put the 'public' section after the 'private' section,
77635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // or MSVC refuses to compile the code.
77645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
77655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // MSVC warns about implicitly converting from double to int for
77665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // possible loss of data, so we need to temporarily disable the
77675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // warning.
77685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
77695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)          // Saves the current warning state.
77705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable:4244)  // Temporarily disables warning 4244.
77715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const bool value =
77735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
77745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(pop)           // Restores the warning state.
77755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(__BORLANDC__)
77765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // C++Builder cannot use member overload resolution during template
77775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // instantiation.  The simplest workaround is to use its C++0x type traits
77785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // functions (C++Builder 2009 and above only).
77795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const bool value = __is_convertible(From, To);
77805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
77815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const bool value =
77825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
77835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSV_VER
77845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
77855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename From, typename To>
77865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst bool ImplicitlyConvertible<From, To>::value;
77875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// IsAProtocolMessage<T>::value is a compile-time bool constant that's
77895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// true iff T is type ProtocolMessage, proto2::Message, or a subclass
77905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of those.
77915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
77925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct IsAProtocolMessage
77935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public bool_constant<
77945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
77955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
77965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
77975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// When the compiler sees expression IsContainerTest<C>(0), if C is an
77995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// STL-style container class, the first overload of IsContainerTest
78005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will be viable (since both C::iterator* and C::const_iterator* are
78015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// valid types and NULL can be implicitly converted to them).  It will
78025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// be picked over the second overload as 'int' is a perfect match for
78035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the type of argument 0.  If C::iterator or C::const_iterator is not
78045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a valid type, the first overload is not viable, and the second
78055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// overload will be picked.  Therefore, we can determine whether C is
78065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a container class by checking the type of IsContainerTest<C>(0).
78075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The value of the expression is insignificant.
78085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
78095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that we look for both C::iterator and C::const_iterator.  The
78105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// reason is that C++ injects the name of a class as a member of the
78115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class itself (e.g. you can refer to class iterator as either
78125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'iterator' or 'iterator::iterator').  If we look for C::iterator
78135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// only, for example, we would mistakenly think that a class named
78145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// iterator is an STL container.
78155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
78165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Also note that the simpler approach of overloading
78175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// IsContainerTest(typename C::const_iterator*) and
78185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
78195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef int IsContainer;
78205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class C>
78215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangIsContainer IsContainerTest(int /* dummy */,
78225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            typename C::iterator* /* it */ = NULL,
78235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            typename C::const_iterator* /* const_it */ = NULL) {
78245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return 0;
78255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
78265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef char IsNotContainer;
78285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class C>
78295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangIsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
78305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EnableIf<condition>::type is void when 'Cond' is true, and
78325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// undefined when 'Cond' is false.  To use SFINAE to make a function
78335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// overload only apply when a particular expression is true, add
78345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "typename EnableIf<expression>::type* = 0" as the last parameter.
78355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<bool> struct EnableIf;
78365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<> struct EnableIf<true> { typedef void type; };  // NOLINT
78375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utilities for native arrays.
78395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ArrayEq() compares two k-dimensional native arrays using the
78415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// elements' operator==, where k can be any integer >= 0.  When k is
78425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 0, ArrayEq() degenerates into comparing a single pair of values.
78435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U>
78455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ArrayEq(const T* lhs, size_t size, const U* rhs);
78465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This generic version is used when k is 0.
78485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U>
78495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
78505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This overload is used when k >= 1.
78525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U, size_t N>
78535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
78545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ArrayEq(lhs, N, rhs);
78555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
78565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This helper reduces code bloat.  If we instead put its logic inside
78585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the previous ArrayEq() function, arrays with different sizes would
78595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// lead to different copies of the template code.
78605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U>
78615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ArrayEq(const T* lhs, size_t size, const U* rhs) {
78625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i != size; i++) {
78635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!internal::ArrayEq(lhs[i], rhs[i]))
78645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return false;
78655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
78665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
78675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
78685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Finds the first element in the iterator range [begin, end) that
78705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// equals elem.  Element may be a native array type itself.
78715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Iter, typename Element>
78725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
78735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (Iter it = begin; it != end; ++it) {
78745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (internal::ArrayEq(*it, elem))
78755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return it;
78765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
78775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return end;
78785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
78795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// CopyArray() copies a k-dimensional native array using the elements'
78815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// operator=, where k can be any integer >= 0.  When k is 0,
78825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// CopyArray() degenerates into copying a single value.
78835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U>
78855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid CopyArray(const T* from, size_t size, U* to);
78865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This generic version is used when k is 0.
78885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U>
78895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void CopyArray(const T& from, U* to) { *to = from; }
78905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This overload is used when k >= 1.
78925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U, size_t N>
78935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void CopyArray(const T(&from)[N], U(*to)[N]) {
78945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::CopyArray(from, N, *to);
78955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
78965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This helper reduces code bloat.  If we instead put its logic inside
78985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the previous CopyArray() function, arrays with different sizes
78995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// would lead to different copies of the template code.
79005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename U>
79015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid CopyArray(const T* from, size_t size, U* to) {
79025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i != size; i++) {
79035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::CopyArray(from[i], to + i);
79045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
79065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The relation between an NativeArray object (see below) and the
79085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// native array it represents.
79095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangenum RelationToSource {
79105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kReference,  // The NativeArray references the native array.
79115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kCopy        // The NativeArray makes a copy of the native array and
79125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               // owns the copy.
79135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
79145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adapts a native array to a read-only STL-style container.  Instead
79165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of the complete STL container concept, this adaptor only implements
79175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// members useful for Google Mock's container matchers.  New members
79185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// should be added as needed.  To simplify the implementation, we only
79195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// support Element being a raw type (i.e. having no top-level const or
79205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// reference modifier).  It's the client's responsibility to satisfy
79215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this requirement.  Element can be an array type itself (hence
79225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// multi-dimensional arrays are supported).
79235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Element>
79245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass NativeArray {
79255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
79265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // STL-style container typedefs.
79275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Element value_type;
79285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef Element* iterator;
79295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef const Element* const_iterator;
79305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructs from a native array.
79325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  NativeArray(const Element* array, size_t count, RelationToSource relation) {
79335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Init(array, count, relation);
79345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Copy constructor.
79375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  NativeArray(const NativeArray& rhs) {
79385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
79395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~NativeArray() {
79425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Ensures that the user doesn't instantiate NativeArray with a
79435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // const or reference type.
79445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static_cast<void>(StaticAssertTypeEqHelper<Element,
79455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
79465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (relation_to_source_ == kCopy)
79475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      delete[] array_;
79485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // STL-style container methods.
79515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t size() const { return size_; }
79525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const_iterator begin() const { return array_; }
79535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const_iterator end() const { return array_ + size_; }
79545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator==(const NativeArray& rhs) const {
79555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return size() == rhs.size() &&
79565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ArrayEq(begin(), size(), rhs.begin());
79575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
79605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Initializes this object; makes a copy of the input array if
79615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // 'relation' is kCopy.
79625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Init(const Element* array, size_t a_size, RelationToSource relation) {
79635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (relation == kReference) {
79645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      array_ = array;
79655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
79665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Element* const copy = new Element[a_size];
79675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      CopyArray(array, a_size, copy);
79685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      array_ = copy;
79695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
79705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    size_ = a_size;
79715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    relation_to_source_ = relation;
79725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Element* array_;
79755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t size_;
79765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RelationToSource relation_to_source_;
79775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_ASSIGN_(NativeArray);
79795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
79805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
79825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
79835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
79855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::testing::internal::AssertHelper(result_type, file, line, message) \
79865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    = ::testing::Message()
79875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_MESSAGE_(message, result_type) \
79895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
79905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_FATAL_FAILURE_(message) \
79925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
79935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_NONFATAL_FAILURE_(message) \
79955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
79965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_SUCCESS_(message) \
79985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
79995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Suppresses MSVC warnings 4072 (unreachable code) for the code following
80015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// statement if it returns or throws (or doesn't return or throw in some
80025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// situations).
80035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
80045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::AlwaysTrue()) { statement; }
80055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
80075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
80085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
80095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool gtest_caught_expected = false; \
80105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    try { \
80115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
80125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    catch (expected_exception const&) { \
80145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      gtest_caught_expected = true; \
80155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    catch (...) { \
80175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      gtest_msg.value = \
80185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          "Expected: " #statement " throws an exception of type " \
80195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          #expected_exception ".\n  Actual: it throws a different type."; \
80205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
80215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!gtest_caught_expected) { \
80235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      gtest_msg.value = \
80245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          "Expected: " #statement " throws an exception of type " \
80255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          #expected_exception ".\n  Actual: it throws nothing."; \
80265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
80275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else \
80295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
80305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fail(gtest_msg.value)
80315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_NO_THROW_(statement, fail) \
80335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
80345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::AlwaysTrue()) { \
80355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    try { \
80365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
80375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    catch (...) { \
80395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
80405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else \
80425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
80435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fail("Expected: " #statement " doesn't throw an exception.\n" \
80445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "  Actual: it throws.")
80455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_ANY_THROW_(statement, fail) \
80475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
80485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::AlwaysTrue()) { \
80495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool gtest_caught_any = false; \
80505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    try { \
80515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
80525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    catch (...) { \
80545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      gtest_caught_any = true; \
80555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!gtest_caught_any) { \
80575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
80585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else \
80605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
80615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fail("Expected: " #statement " throws an exception.\n" \
80625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "  Actual: it doesn't.")
80635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
80665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// either a boolean expression or an AssertionResult. text is a textual
80675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// represenation of expression as it was passed into the EXPECT_TRUE.
80685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
80695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
80705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (const ::testing::AssertionResult gtest_ar_ = \
80715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::AssertionResult(expression)) \
80725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ; \
80735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else \
80745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fail(::testing::internal::GetBoolAssertionFailureMessage(\
80755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        gtest_ar_, text, #actual, #expected).c_str())
80765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
80785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
80795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::AlwaysTrue()) { \
80805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
80815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
80825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
80835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
80845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
80855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else \
80865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
80875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fail("Expected: " #statement " doesn't generate new fatal " \
80885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "failures in the current thread.\n" \
80895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "  Actual: it does.")
80905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Expands to the name of the class that implements the given test.
80925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
80935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_case_name##_##test_name##_Test
80945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper macro for defining tests.
80965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
80975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
80985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:\
80995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
81005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:\
81015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void TestBody();\
81025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
81035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
81045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
81055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};\
81065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang\
81075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
81085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::test_info_ =\
81095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::MakeAndRegisterTestInfo(\
81105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        #test_case_name, #test_name, NULL, NULL, \
81115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        (parent_id), \
81125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        parent_class::SetUpTestCase, \
81135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        parent_class::TearDownTestCase, \
81145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new ::testing::internal::TestFactoryImpl<\
81155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
81165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
81175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
81195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
81205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
81215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
81235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
81245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
81255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
81275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
81285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
81295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
81305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
81315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
81325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
81335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
81345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
81355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
81375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
81385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
81395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
81405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
81415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
81425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
81435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
81445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
81455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
81465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
81475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
81495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
81515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file defines the public API for death tests.  It is
81535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// #included by gtest.h so a user doesn't need to include this
81545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// directly.
81555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
81575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
81585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
81605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
81615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
81635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
81645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
81655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
81675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
81685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
81695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
81705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
81715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
81725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
81735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
81745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
81755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
81775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
81785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
81795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
81805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
81815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
81825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
81835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
81845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
81855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
81865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
81875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
81895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
81915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
81925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header file defines internal utilities needed for implementing
81935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// death tests.  They are subject to change without notice.
81945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
81965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
81975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
82005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
82025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
82035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DECLARE_string_(internal_run_death_test);
82055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Names of the flags (needed for parsing Google Test flags).
82075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kDeathTestStyleFlag[] = "death_test_style";
82085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kDeathTestUseFork[] = "death_test_use_fork";
82095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kInternalRunDeathTestFlag[] = "internal_run_death_test";
82105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
82125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DeathTest is a class that hides much of the complexity of the
82145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
82155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns a concrete class that depends on the prevailing death test
82165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// style, as defined by the --gtest_death_test_style and/or
82175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// --gtest_internal_run_death_test flags.
82185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In describing the results of death tests, these terms are used with
82205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the corresponding definitions:
82215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
82225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exit status:  The integer exit information in the format specified
82235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//               by wait(2)
82245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exit code:    The integer code passed to exit(3), _exit(2), or
82255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//               returned from main()
82265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ DeathTest {
82275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
82285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Create returns false if there was an error determining the
82295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // appropriate action to take for the current death test; for example,
82305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // if the gtest_death_test_style flag is set to an invalid value.
82315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The LastMessage method will return a more detailed message in that
82325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
82335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // argument is set.  If the death test should be skipped, the pointer
82345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // is set to NULL; otherwise, it is set to the address of a new concrete
82355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // DeathTest object that controls the execution of the current test.
82365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool Create(const char* statement, const RE* regex,
82375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     const char* file, int line, DeathTest** test);
82385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTest();
82395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~DeathTest() { }
82405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A helper class that aborts a death test when it's deleted.
82425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class ReturnSentinel {
82435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
82445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
82455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
82465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
82475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTest* const test_;
82485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
82495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } GTEST_ATTRIBUTE_UNUSED_;
82505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // An enumeration of possible roles that may be taken when a death
82525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test is encountered.  EXECUTE means that the death test logic should
82535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // be executed immediately.  OVERSEE means that the program should prepare
82545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the appropriate environment for a child process to execute the death
82555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test, then wait for it to complete.
82565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
82575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // An enumeration of the three reasons that a test might be aborted.
82595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  enum AbortReason {
82605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TEST_ENCOUNTERED_RETURN_STATEMENT,
82615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TEST_THREW_EXCEPTION,
82625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TEST_DID_NOT_DIE
82635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
82645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Assumes one of the above roles.
82665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TestRole AssumeRole() = 0;
82675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Waits for the death test to finish and returns its status.
82695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual int Wait() = 0;
82705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if the death test passed; that is, the test process
82725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exited during the test, its exit status matches a user-supplied
82735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // predicate, and its stderr output matches a user-supplied regular
82745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // expression.
82755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The user-supplied predicate may be a macro expression rather
82765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // than a function pointer or functor, or else Wait and Passed could
82775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // be combined.
82785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual bool Passed(bool exit_status_ok) = 0;
82795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Signals that the death test did not die as expected.
82815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void Abort(AbortReason reason) = 0;
82825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a human-readable outcome message regarding the outcome of
82845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the last death test.
82855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const char* LastMessage();
82865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void set_last_death_test_message(const std::string& message);
82885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
82905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A string containing a description of the outcome of the last death test.
82915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string last_death_test_message_;
82925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
82945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
82955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Factory interface for death tests.  May be mocked out for testing.
82975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass DeathTestFactory {
82985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
82995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~DeathTestFactory() { }
83005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual bool Create(const char* statement, const RE* regex,
83015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      const char* file, int line, DeathTest** test) = 0;
83025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
83035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A concrete DeathTestFactory implementation for normal use.
83055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass DefaultDeathTestFactory : public DeathTestFactory {
83065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
83075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual bool Create(const char* statement, const RE* regex,
83085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      const char* file, int line, DeathTest** test);
83095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
83105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if exit_status describes a process that was terminated
83125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by a signal, or exited normally with a nonzero exit code.
83135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool ExitedUnsuccessfully(int exit_status);
83145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Traps C++ exceptions escaping statement and reports them as test
83165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// failures. Note that trapping SEH exceptions is not implemented here.
83175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_HAS_EXCEPTIONS
83185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
83195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  try { \
83205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
83215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } catch (const ::std::exception& gtest_exception) { \
83225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(\
83235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        stderr, \
83245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        "\n%s: Caught std::exception-derived exception escaping the " \
83255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        "death test statement. Exception message: %s\n", \
83265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
83275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        gtest_exception.what()); \
83285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stderr); \
83295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
83305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } catch (...) { \
83315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
83325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
83335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
83355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
83365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
83375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
83395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
83415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ASSERT_EXIT*, and EXPECT_EXIT*.
83425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
83435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
83445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::AlwaysTrue()) { \
83455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::testing::internal::RE& gtest_regex = (regex); \
83465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::DeathTest* gtest_dt; \
83475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
83485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        __FILE__, __LINE__, &gtest_dt)) { \
83495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
83505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
83515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (gtest_dt != NULL) { \
83525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
83535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          gtest_dt_ptr(gtest_dt); \
83545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      switch (gtest_dt->AssumeRole()) { \
83555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        case ::testing::internal::DeathTest::OVERSEE_TEST: \
83565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
83575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
83585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          } \
83595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          break; \
83605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
83615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::internal::DeathTest::ReturnSentinel \
83625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              gtest_sentinel(gtest_dt); \
83635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
83645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
83655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          break; \
83665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        } \
83675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        default: \
83685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          break; \
83695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } \
83705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
83715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else \
83725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
83735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fail(::testing::internal::DeathTest::LastMessage())
83745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The symbol "fail" here expands to something into which a message
83755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// can be streamed.
83765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
83785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NDEBUG mode. In this case we need the statements to be executed, the regex is
83795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ignored, and the macro must accept a streamed message even though the message
83805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is never printed.
83815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
83825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
83835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (::testing::internal::AlwaysTrue()) { \
83845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
83855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else \
83865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::Message()
83875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A class representing the parsed contents of the
83895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// --gtest_internal_run_death_test flag, as it existed when
83905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// RUN_ALL_TESTS was called.
83915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass InternalRunDeathTestFlag {
83925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
83935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  InternalRunDeathTestFlag(const std::string& a_file,
83945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           int a_line,
83955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           int an_index,
83965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           int a_write_fd)
83975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : file_(a_file), line_(a_line), index_(an_index),
83985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        write_fd_(a_write_fd) {}
83995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~InternalRunDeathTestFlag() {
84015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (write_fd_ >= 0)
84025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      posix::Close(write_fd_);
84035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
84045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& file() const { return file_; }
84065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int line() const { return line_; }
84075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int index() const { return index_; }
84085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int write_fd() const { return write_fd_; }
84095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
84115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string file_;
84125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int line_;
84135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int index_;
84145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int write_fd_;
84155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
84175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
84185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a newly created InternalRunDeathTestFlag object with fields
84205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// initialized from the GTEST_FLAG(internal_run_death_test) flag if
84215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the flag is specified; otherwise returns NULL.
84225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
84235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else  // GTEST_HAS_DEATH_TEST
84255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This macro is used for implementing macros such as
84275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
84285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// death tests are not supported. Those macros must compile on such systems
84295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
84305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// systems that support death tests. This allows one to write such a macro
84315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// on a system that does not support death tests and be sure that it will
84325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compile on a death-test supporting system.
84335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
84345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parameters:
84355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   statement -  A statement that a macro such as EXPECT_DEATH would test
84365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                for program termination. This macro has to make sure this
84375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                statement is compiled but not executed, to ensure that
84385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
84395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                parameter iff EXPECT_DEATH compiles with it.
84405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
84415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                the output of statement.  This parameter has to be
84425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                compiled but not evaluated by this macro, to ensure that
84435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                this macro only accepts expressions that a macro such as
84445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                EXPECT_DEATH would accept.
84455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
84465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
84475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
84485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                compile inside functions where ASSERT_DEATH doesn't
84495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                compile.
84505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
84515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  The branch that has an always false condition is used to ensure that
84525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  statement and regex are compiled (and thus syntactically correct) but
84535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  never executed. The unreachable code macro protects the terminator
84545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  statement from generating an 'unreachable code' warning in case
84555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  statement unconditionally returns or throws. The Message constructor at
84565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  the end allows the syntax of streaming additional messages into the
84575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
84585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
84595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
84605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (::testing::internal::AlwaysTrue()) { \
84615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOG_(WARNING) \
84625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Death tests are not supported on this platform.\n" \
84635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Statement '" #statement "' cannot be verified."; \
84645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (::testing::internal::AlwaysFalse()) { \
84655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::internal::RE::PartialMatch(".*", (regex)); \
84665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
84675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      terminator; \
84685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else \
84695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::Message()
84705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
84725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
84745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
84755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
84775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
84795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This flag controls the style of death tests.  Valid values are "threadsafe",
84815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// meaning that the death test child process will re-execute the test binary
84825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// from the start, running only a single death test, or "fast",
84835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// meaning that the child process will execute the test logic immediately
84845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// after forking.
84855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DECLARE_string_(death_test_style);
84865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
84885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
84905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a Boolean value indicating whether the caller is currently
84925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// executing in the context of the death test child process.  Tools such as
84935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Valgrind heap checkers may need this to modify their behavior in death
84945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tests.  IMPORTANT: This is an internal utility.  Using it may break the
84955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation of death tests.  User code MUST NOT use it.
84965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool InDeathTestChild();
84975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
84995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following macros are useful for writing death tests.
85015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
85035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// executed:
85045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   1. It generates a warning if there is more than one active
85065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   thread.  This is because it's safe to fork() or clone() only
85075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   when there is a single thread.
85085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   2. The parent process clone()s a sub-process and runs the death
85105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   test in it; the sub-process exits with code 0 at the end of the
85115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   death test, if it hasn't exited already.
85125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   3. The parent process waits for the sub-process to terminate.
85145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   4. The parent process checks the exit code and error message of
85165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   the sub-process.
85175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Examples:
85195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
85215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   for (int i = 0; i < 5; i++) {
85225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     EXPECT_DEATH(server.ProcessRequest(i),
85235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                  "Invalid request .* in ProcessRequest()")
85245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                  << "Failed to die on request " << i;
85255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   }
85265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
85285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   bool KilledBySIGHUP(int exit_code) {
85305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
85315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   }
85325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
85345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On the regular expressions used in death tests:
85365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
85385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   which uses the POSIX extended regex syntax.
85395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   On other platforms (e.g. Windows), we only support a simple regex
85415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   syntax implemented as part of Google Test.  This limited
85425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   implementation should be enough most of the time when writing
85435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   death tests; though it lacks many features you can find in PCRE
85445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   or POSIX extended regex syntax.  For example, we don't support
85455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
85465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   repetition count ("x{5,7}"), among others.
85475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Below is the syntax that we do support.  We chose it to be a
85495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   subset of both PCRE and POSIX extended regex, so it's easy to
85505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   learn wherever you come from.  In the following: 'A' denotes a
85515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   literal character, period (.), or a single \\ escape sequence;
85525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
85535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   natural numbers.
85545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     c     matches any literal character c
85565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\d   matches any decimal digit
85575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\D   matches any character that's not a decimal digit
85585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\f   matches \f
85595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\n   matches \n
85605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\r   matches \r
85615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\s   matches any ASCII whitespace, including \n
85625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\S   matches any character that's not a whitespace
85635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\t   matches \t
85645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\v   matches \v
85655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\w   matches any letter, _, or decimal digit
85665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\W   matches any character that \\w doesn't match
85675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     \\c   matches any literal character c, which must be a punctuation
85685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     .     matches any single character except \n
85695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     A?    matches 0 or 1 occurrences of A
85705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     A*    matches 0 or many occurrences of A
85715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     A+    matches 1 or many occurrences of A
85725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     ^     matches the beginning of a string (not that of each line)
85735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     $     matches the end of a string (not that of each line)
85745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     xy    matches x followed by y
85755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   If you accidentally use PCRE or POSIX extended regex features
85775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   not implemented by us, you will get a run-time failure.  In that
85785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   case, please try to rewrite your regular expression within the
85795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   above syntax.
85805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   This implementation is *not* meant to be as highly tuned or robust
85825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   as a compiled regex library, but should perform well enough for a
85835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   death test, which already incurs significant overhead by launching
85845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   a child process.
85855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Known caveats:
85875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   A "threadsafe" style death test obtains the path to the test
85895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   program from argv[0] and re-executes it in the sub-process.  For
85905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   simplicity, the current implementation doesn't search the PATH
85915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   when launching the sub-process.  This means that the user must
85925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   invoke the test program via a path that contains at least one
85935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   path separator (e.g. path/to/foo_test and
85945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
85955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   is rarely a problem as people usually don't put the test binary
85965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   directory in PATH.
85975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan@google.com): make thread-safe death tests search the PATH.
85995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Asserts that a given statement causes the program to exit, with an
86015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// integer exit status that satisfies predicate, and emitting error output
86025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that matches regex.
86035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define ASSERT_EXIT(statement, predicate, regex) \
86045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
86055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Like ASSERT_EXIT, but continues on to successive tests in the
86075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test case, if any:
86085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define EXPECT_EXIT(statement, predicate, regex) \
86095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
86105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Asserts that a given statement causes the program to exit, either by
86125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// explicitly exiting with a nonzero exit code or being killed by a
86135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// signal, and emitting error output that matches regex.
86145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define ASSERT_DEATH(statement, regex) \
86155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
86165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Like ASSERT_DEATH, but continues on to successive tests in the
86185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test case, if any:
86195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define EXPECT_DEATH(statement, regex) \
86205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
86215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
86235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Tests that an exit code describes a normal exit with a given exit code.
86255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ ExitedWithCode {
86265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
86275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ExitedWithCode(int exit_code);
86285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator()(int exit_status) const;
86295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
86305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
86315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ExitedWithCode& other);
86325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int exit_code_;
86345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
86355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if !GTEST_OS_WINDOWS
86375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Tests that an exit code describes an exit due to termination by a
86385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given signal.
86395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ KilledBySignal {
86405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
86415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit KilledBySignal(int signum);
86425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator()(int exit_status) const;
86435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
86445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int signum_;
86455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
86465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // !GTEST_OS_WINDOWS
86475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
86495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The death testing framework causes this to have interesting semantics,
86505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// since the sideeffects of the call are only visible in opt mode, and not
86515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in debug mode.
86525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In practice, this can be used to test functions that utilize the
86545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LOG(DFATAL) macro using the following style:
86555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// int DieInDebugOr12(int* sideeffect) {
86575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   if (sideeffect) {
86585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     *sideeffect = 12;
86595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   }
86605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   LOG(DFATAL) << "death";
86615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   return 12;
86625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
86635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
86655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   int sideeffect = 0;
86665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Only asserts in dbg.
86675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
86685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// #ifdef NDEBUG
86705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // opt-mode has sideeffect visible.
86715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_EQ(12, sideeffect);
86725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// #else
86735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // dbg-mode no visible sideeffect.
86745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_EQ(0, sideeffect);
86755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// #endif
86765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
86775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This will assert that DieInDebugReturn12InOpt() crashes in debug
86795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
86805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// appropriate fallback value (12 in this case) in opt mode. If you
86815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// need to test that a function has appropriate side-effects in opt
86825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// mode, include assertions against the side-effects.  A general
86835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pattern for this is:
86845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_DEBUG_DEATH({
86865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Side-effects here will have an effect after this statement in
86875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // opt mode, but none in debug mode.
86885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
86895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }, "death");
86905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
86915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# ifdef NDEBUG
86925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define EXPECT_DEBUG_DEATH(statement, regex) \
86945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_EXECUTE_STATEMENT_(statement, regex)
86955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define ASSERT_DEBUG_DEATH(statement, regex) \
86975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_EXECUTE_STATEMENT_(statement, regex)
86985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
87005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define EXPECT_DEBUG_DEATH(statement, regex) \
87025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EXPECT_DEATH(statement, regex)
87035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define ASSERT_DEBUG_DEATH(statement, regex) \
87055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ASSERT_DEATH(statement, regex)
87065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // NDEBUG for EXPECT_DEBUG_DEATH
87085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
87095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
87115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
87125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// death tests are supported; otherwise they just issue a warning.  This is
87135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// useful when you are combining death test assertions with normal test
87145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// assertions in one test.
87155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
87165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
87175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    EXPECT_DEATH(statement, regex)
87185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
87195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ASSERT_DEATH(statement, regex)
87205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
87215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
87225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
87235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
87245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
87255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
87265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
87285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
87305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file was GENERATED by command:
87315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     pump.py gtest-param-test.h.pump
87325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DO NOT EDIT BY HAND!!!
87335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008, Google Inc.
87355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
87365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
87385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
87395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
87405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
87425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
87435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
87445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
87455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
87465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
87475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
87485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
87495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
87505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
87525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
87535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
87545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
87555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
87565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
87575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
87585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
87595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
87605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
87615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
87625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: vladl@google.com (Vlad Losev)
87645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Macros and functions for implementing parameterized tests
87665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in Google C++ Testing Framework (Google Test)
87675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
87695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
87715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
87725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Value-parameterized tests allow you to test your code with different
87755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameters without writing multiple copies of the same test.
87765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
87775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Here is how you use value-parameterized tests:
87785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if 0
87805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To write value-parameterized tests, first you should define a fixture
87825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class. It is usually derived from testing::TestWithParam<T> (see below for
87835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// another inheritance scheme that's sometimes useful in more complicated
87845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class hierarchies), where the type of your parameter values.
87855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestWithParam<T> is itself derived from testing::Test. T can be any
87865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyable type. If it's a raw pointer, you are responsible for managing the
87875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// lifespan of the pointed values.
87885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FooTest : public ::testing::TestWithParam<const char*> {
87905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // You can implement all the usual class fixture members here.
87915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
87925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Then, use the TEST_P macro to define as many parameterized tests
87945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for this fixture as you want. The _P suffix is for "parameterized"
87955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or "pattern", whichever you prefer to think.
87965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FooTest, DoesBlah) {
87985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Inside a test, access the test parameter with the GetParam() method
87995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // of the TestWithParam<T> class:
88005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EXPECT_TRUE(foo.Blah(GetParam()));
88015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ...
88025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FooTest, HasBlahBlah) {
88055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ...
88065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
88095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// case with any set of parameters you want. Google Test defines a number
88105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of functions for generating test parameters. They return what we call
88115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (surprise!) parameter generators. Here is a  summary of them, which
88125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// are all in the testing namespace:
88135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  Range(begin, end [, step]) - Yields values {begin, begin+step,
88165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                               begin+step+step, ...}. The values do not
88175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                               include end. step defaults to 1.
88185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
88195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  ValuesIn(container)        - Yields values from a C-style array, an STL
88205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
88215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  Bool()                     - Yields sequence {false, true}.
88225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
88235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                               for the math savvy) of the values generated
88245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                               by the N generators.
88255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For more details, see comments at the definitions of these functions below
88275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in this file.
88285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following statement will instantiate tests from the FooTest test case
88305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each with parameter values "meeny", "miny", and "moe".
88315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TEST_CASE_P(InstantiationName,
88335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        FooTest,
88345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        Values("meeny", "miny", "moe"));
88355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To distinguish different instances of the pattern, (yes, you
88375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// can instantiate it more then once) the first argument to the
88385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
88395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// actual test case name. Remember to pick unique prefixes for different
88405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instantiations. The tests from the instantiation above will have
88415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// these names:
88425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
88445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
88455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
88465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
88475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
88485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
88495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// You can use these names in --gtest_filter.
88515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This statement will instantiate all tests from FooTest again, each
88535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with parameter values "cat" and "dog":
88545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* pets[] = {"cat", "dog"};
88565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
88575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The tests from the instantiation above will have these names:
88595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
88615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
88625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
88635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
88645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
88665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the given test case, whether their definitions come before or
88675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AFTER the INSTANTIATE_TEST_CASE_P statement.
88685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Please also note that generator expressions (including parameters to the
88705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// generators) are evaluated in InitGoogleTest(), after main() has started.
88715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This allows the user on one hand, to adjust generator parameters in order
88725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to dynamically determine a set of tests to run and on the other hand,
88735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// give the user a chance to inspect the generated tests with Google Test
88745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// reflection API before RUN_ALL_TESTS() is executed.
88755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
88775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for more examples.
88785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In the future, we plan to publish the API for defining new parameter
88805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// generators. But for now this interface remains part of the internal
88815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation and is subject to change.
88825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
88845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A parameterized test fixture must be derived from testing::Test and from
88855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// testing::WithParamInterface<T>, where T is the type of the parameter
88865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// values. Inheriting from TestWithParam<T> satisfies that requirement because
88875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestWithParam<T> inherits from both Test and WithParamInterface. In more
88885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// complicated hierarchies, however, it is occasionally useful to inherit
88895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// separately from Test and WithParamInterface. For example:
88905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass BaseTest : public ::testing::Test {
88925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // You can inherit all the usual members for a non-parameterized test
88935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // fixture here.
88945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
88955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
88975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The usual test fixture members go here too.
88985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
88995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_F(BaseTest, HasFoo) {
89015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This is an ordinary non-parameterized test.
89025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(DerivedTest, DoesBlah) {
89055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // GetParam works just the same here as if you inherit from TestWithParam.
89065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EXPECT_TRUE(foo.Blah(GetParam()));
89075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // 0
89105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !GTEST_OS_SYMBIAN
89135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <utility>
89145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
89155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// scripts/fuse_gtest.py depends on gtest's own header being #included
89175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *unconditionally*.  Therefore these #includes cannot be moved
89185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// inside #if GTEST_HAS_PARAM_TEST.
89195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008 Google Inc.
89205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All Rights Reserved.
89215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
89235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
89245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
89255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
89275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
89285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
89295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
89305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
89315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
89325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
89335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
89345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
89355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
89375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
89385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
89395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
89405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
89415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
89425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
89435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
89445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
89455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
89465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
89475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: vladl@google.com (Vlad Losev)
89495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Type and function utilities for implementing parameterized tests.
89515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
89535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
89545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <iterator>
89565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <utility>
89575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <vector>
89585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// scripts/fuse_gtest.py depends on gtest's own header being #included
89605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *unconditionally*.  Therefore these #includes cannot be moved
89615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// inside #if GTEST_HAS_PARAM_TEST.
89625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2003 Google Inc.
89635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
89645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
89665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
89675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
89685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
89705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
89715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
89725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
89735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
89745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
89755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
89765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
89775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
89785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
89805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
89815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
89825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
89835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
89845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
89855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
89865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
89875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
89885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
89895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
89905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: Dan Egnor (egnor@google.com)
89925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A "smart" pointer type with reference tracking.  Every pointer to a
89945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// particular object is kept on a circular linked list.  When the last pointer
89955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to an object is destroyed or reassigned, the object is deleted.
89965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used properly, this deletes the object when the last reference goes away.
89985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// There are several caveats:
89995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - Like all reference counting schemes, cycles lead to leaks.
90005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - Each smart pointer is actually two pointers (8 bytes instead of 4).
90015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - Every time a pointer is assigned, the entire list of pointers to that
90025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   object is traversed.  This class is therefore NOT SUITABLE when there
90035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   will often be more than two or three pointers to a particular object.
90045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// - References are only tracked as long as linked_ptr<> objects are copied.
90055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
90065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   will happen (double deletion).
90075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A good use of this class is storing object references in STL containers.
90095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// You can safely put linked_ptr<> in a vector<>.
90105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Other uses may not be as good.
90115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note: If you use an incomplete type with linked_ptr<>, the class
90135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *containing* linked_ptr<> must have a constructor and destructor (even
90145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// if they do nothing!).
90155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Bill Gibbons suggested we use something like this.
90175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Thread Safety:
90195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Unlike other linked_ptr implementations, in this implementation
90205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   a linked_ptr object is thread-safe in the sense that:
90215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     - it's safe to copy linked_ptr objects concurrently,
90225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     - it's safe to copy *from* a linked_ptr and read its underlying
90235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       raw pointer (e.g. via get()) concurrently, and
90245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     - it's safe to write to two linked_ptrs that point to the same
90255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       shared object concurrently.
90265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
90275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// confusion with normal linked_ptr.
90285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
90305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
90315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>
90335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <assert.h>
90345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
90375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
90385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Protects copying of all linked_ptr objects.
90405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
90415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is used internally by all instances of linked_ptr<>.  It needs to be
90435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a non-template class because different types of linked_ptr<> can refer to
90445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
90455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// So, it needs to be possible for different types of linked_ptr to participate
90465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the same circular linked list, so we need a single class type here.
90475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
90495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass linked_ptr_internal {
90505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
90515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Create a new circle that includes only this instance.
90525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void join_new() {
90535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    next_ = this;
90545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
90555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Many linked_ptr operations may change p.link_ for some linked_ptr
90575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // variable p in the same circle as this object.  Therefore we need
90585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to prevent two such operations from occurring concurrently.
90595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
90605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Note that different types of linked_ptr objects can coexist in a
90615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
90625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
90635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // protect all linked_ptr objects.  This can create serious
90645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // contention in production code, but is acceptable in a testing
90655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // framework.
90665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Join an existing circle.
90685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void join(linked_ptr_internal const* ptr)
90695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
90705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    MutexLock lock(&g_linked_ptr_mutex);
90715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    linked_ptr_internal const* p = ptr;
90735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    while (p->next_ != ptr) p = p->next_;
90745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    p->next_ = this;
90755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    next_ = ptr;
90765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
90775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Leave whatever circle we're part of.  Returns true if we were the
90795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // last member of the circle.  Once this is done, you can join() another.
90805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool depart()
90815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
90825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    MutexLock lock(&g_linked_ptr_mutex);
90835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (next_ == this) return true;
90855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    linked_ptr_internal const* p = next_;
90865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    while (p->next_ != this) p = p->next_;
90875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    p->next_ = next_;
90885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
90895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
90905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
90925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mutable linked_ptr_internal const* next_;
90935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
90945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
90965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass linked_ptr {
90975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
90985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T element_type;
90995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Take over ownership of a raw pointer.  This should happen as soon as
91015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // possible after the object is created.
91025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
91035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~linked_ptr() { depart(); }
91045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
91065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
91075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  linked_ptr(linked_ptr const& ptr) {  // NOLINT
91085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    assert(&ptr != this);
91095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    copy(&ptr);
91105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Assignment releases the old value and acquires the new.
91135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
91145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    depart();
91155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    copy(&ptr);
91165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
91175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  linked_ptr& operator=(linked_ptr const& ptr) {
91205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (&ptr != this) {
91215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      depart();
91225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      copy(&ptr);
91235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
91245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
91255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Smart pointer members.
91285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void reset(T* ptr = NULL) {
91295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    depart();
91305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    capture(ptr);
91315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* get() const { return value_; }
91335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* operator->() const { return value_; }
91345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T& operator*() const { return *value_; }
91355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator==(T* p) const { return value_ == p; }
91375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator!=(T* p) const { return value_ != p; }
91385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U>
91395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator==(linked_ptr<U> const& ptr) const {
91405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return value_ == ptr.get();
91415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U>
91435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator!=(linked_ptr<U> const& ptr) const {
91445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return value_ != ptr.get();
91455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
91485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U>
91495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class linked_ptr;
91505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T* value_;
91525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  linked_ptr_internal link_;
91535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void depart() {
91555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (link_.depart()) delete value_;
91565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void capture(T* ptr) {
91595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    value_ = ptr;
91605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    link_.join_new();
91615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename U> void copy(linked_ptr<U> const* ptr) {
91645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    value_ = ptr->get();
91655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (value_)
91665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      link_.join(&ptr->link_);
91675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    else
91685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      link_.join_new();
91695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
91715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<typename T> inline
91735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool operator==(T* ptr, const linked_ptr<T>& x) {
91745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ptr == x.get();
91755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<typename T> inline
91785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool operator!=(T* ptr, const linked_ptr<T>& x) {
91795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ptr != x.get();
91805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A function to convert T* into linked_ptr<T>
91835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
91845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
91855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
91865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanglinked_ptr<T> make_linked_ptr(T* ptr) {
91875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return linked_ptr<T>(ptr);
91885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
91915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
91925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
91945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2007, Google Inc.
91955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
91965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
91975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
91985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
91995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
92005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
92025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
92035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
92045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
92055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
92065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
92075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
92085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
92095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
92105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
92125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
92135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
92145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
92155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
92165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
92175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
92185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
92195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
92205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
92215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
92225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
92245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test - The Google C++ Testing Framework
92265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file implements a universal value printer that can print a
92285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value of any type T:
92295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
92315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A user can teach this function how to print a class type T by
92335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defining either operator<<() or PrintTo() in the namespace that
92345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defines T.  More specifically, the FIRST defined function in the
92355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// following list will be used (assuming T is defined in namespace
92365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// foo):
92375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   1. foo::PrintTo(const T&, ostream*)
92395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   2. operator<<(ostream&, const T&) defined in either foo or the
92405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//      global namespace.
92415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If none of the above is defined, it will print the debug string of
92435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the value if it is a protocol buffer, or print the raw bytes in the
92445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value otherwise.
92455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To aid debugging: when T is a reference type, the address of the
92475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value is also printed; when T is a (const) char pointer, both the
92485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pointer value and the NUL-terminated string it points to are
92495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// printed.
92505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We also provide some convenient wrappers:
92525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Prints a value to a string.  For a (const or not) char
92545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // pointer, the NUL-terminated string (but not the pointer) is
92555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // printed.
92565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   std::string ::testing::PrintToString(const T& value);
92575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Prints a value tersely: for a reference type, the referenced
92595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // value (but not the address) is printed; for a (const or not) char
92605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // pointer, the NUL-terminated string (but not the pointer) is
92615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // printed.
92625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
92635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Prints value using the type inferred by the compiler.  The difference
92655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // from UniversalTersePrint() is that this function prints both the
92665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // pointer and the NUL-terminated string for a (const or not) char pointer.
92675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
92685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Prints the fields of a tuple tersely to a string vector, one
92705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // element for each field. Tuple support must be enabled in
92715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // gtest-port.h.
92725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
92735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       const Tuple& value);
92745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Known limitation:
92765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
92775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The print primitives print the elements of an STL-style container
92785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using the compiler-inferred type of *iter where iter is a
92795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// const_iterator of the container.  When const_iterator is an input
92805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// iterator but not a forward iterator, this inferred type may not
92815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// match value_type, and the print output may be incorrect.  In
92825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// practice, this is rarely a problem as for most containers
92835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// const_iterator is a forward iterator.  We'll fix this if there's an
92845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// actual need for it.  Note that this fix cannot rely on value_type
92855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// being defined as many user-defined container types don't have
92865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value_type.
92875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
92895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
92905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ostream>  // NOLINT
92925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <sstream>
92935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string>
92945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <utility>
92955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <vector>
92965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
92985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Definitions in the 'internal' and 'internal2' name spaces are
93005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// subject to change without notice.  DO NOT USE THEM IN USER CODE!
93015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal2 {
93025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given number of bytes in the given object to the given
93045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ostream.
93055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
93065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     size_t count,
93075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     ::std::ostream* os);
93085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For selecting which printer to use when a given type has neither <<
93105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// nor PrintTo().
93115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangenum TypeKind {
93125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kProtobuf,              // a protobuf type
93135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
93145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          // (e.g. a named or unnamed enum type)
93155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kOtherType              // anything else
93165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
93175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
93195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by the universal printer to print a value of type T when neither
93205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// operator<< nor PrintTo() is defined for T, where kTypeKind is the
93215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "kind" of T as defined by enum TypeKind.
93225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, TypeKind kTypeKind>
93235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeWithoutFormatter {
93245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
93255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This default version is called when kTypeKind is kOtherType.
93265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintValue(const T& value, ::std::ostream* os) {
93275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
93285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         sizeof(value), os);
93295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
93305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
93315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We print a protobuf using its ShortDebugString() when the string
93335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// doesn't exceed this many characters; otherwise we print it using
93345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DebugString() for better readability.
93355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst size_t kProtobufOneLinerMaxLength = 50;
93365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
93385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeWithoutFormatter<T, kProtobuf> {
93395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
93405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintValue(const T& value, ::std::ostream* os) {
93415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::testing::internal::string short_str = value.ShortDebugString();
93425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::testing::internal::string pretty_str =
93435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        short_str.length() <= kProtobufOneLinerMaxLength ?
93445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        short_str : ("\n" + value.DebugString());
93455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ("<" + pretty_str + ">");
93465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
93475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
93485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
93505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TypeWithoutFormatter<T, kConvertibleToInteger> {
93515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
93525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Since T has no << operator or PrintTo() but can be implicitly
93535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // converted to BiggestInt, we print it as a BiggestInt.
93545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
93555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Most likely T is an enum type (either named or unnamed), in which
93565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // case printing it as an integer is the desired behavior.  In case
93575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // T is not an enum, printing it as an integer is the best we can do
93585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // given that it has no user-defined printer.
93595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintValue(const T& value, ::std::ostream* os) {
93605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const internal::BiggestInt kBigInt = value;
93615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << kBigInt;
93625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
93635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
93645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given value to the given ostream.  If the value is a
93665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// protocol message, its debug string is printed; if it's an enum or
93675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of a type implicitly convertible to BiggestInt, it's printed as an
93685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// integer; otherwise the bytes in the value are printed.  This is
93695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// what UniversalPrinter<T>::Print() does when it knows nothing about
93705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type T and T has neither << operator nor PrintTo().
93715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
93725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A user can override this behavior for a class type Foo by defining
93735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a << operator in the namespace where Foo is defined.
93745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
93755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We put this operator in namespace 'internal2' instead of 'internal'
93765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to simplify the implementation, as much code in 'internal' needs to
93775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use << in STL, which would conflict with our own << were it defined
93785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in 'internal'.
93795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
93805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that this operator<< takes a generic std::basic_ostream<Char,
93815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// CharTraits> type instead of the more restricted std::ostream.  If
93825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// we define it to take an std::ostream instead, we'll get an
93835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "ambiguous overloads" compiler error when trying to print a type
93845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Foo that supports streaming to std::basic_ostream<Char,
93855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// CharTraits>, as the compiler cannot tell whether
93865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// operator<<(std::ostream&, const T&) or
93875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
93885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specific.
93895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Char, typename CharTraits, typename T>
93905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang::std::basic_ostream<Char, CharTraits>& operator<<(
93915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
93925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TypeWithoutFormatter<T,
93935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
93945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
93955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
93965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return os;
93975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal2
94005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
94015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
94035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// magic needed for implementing UniversalPrinter won't work.
94045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing_internal {
94055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used to print a value that is not an STL-style container when the
94075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// user doesn't define PrintTo() for it.
94085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
94095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
94105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // With the following statement, during unqualified name lookup,
94115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // testing::internal2::operator<< appears as if it was declared in
94125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the nearest enclosing namespace that contains both
94135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ::testing_internal and ::testing::internal2, i.e. the global
94145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // namespace.  For more details, refer to the C++ Standard section
94155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
94165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // testing::internal2::operator<< in case T doesn't come with a <<
94175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // operator.
94185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
94195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We cannot write 'using ::testing::internal2::operator<<;', which
94205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // gcc 3.3 fails to compile due to a compiler bug.
94215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  using namespace ::testing::internal2;  // NOLINT
94225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Assuming T is defined in namespace foo, in the next statement,
94245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the compiler will consider all of:
94255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
94265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   1. foo::operator<< (thanks to Koenig look-up),
94275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   2. ::operator<< (as the current namespace is enclosed in ::),
94285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   3. testing::internal2::operator<< (thanks to the using statement above).
94295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
94305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The operator<< whose type matches T best will be picked.
94315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
94325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We deliberately allow #2 to be a candidate, as sometimes it's
94335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // impossible to define #1 (e.g. when foo is ::std, defining
94345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // anything in it is undefined behavior unless you are a compiler
94355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // vendor.).
94365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << value;
94375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing_internal
94405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
94425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
94435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
94455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value to the given ostream.  The caller must ensure that
94465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'ostream_ptr' is not NULL, or the behavior is undefined.
94475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
94485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We define UniversalPrinter as a class template (as opposed to a
94495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function template), as we need to partially specialize it for
94505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// reference types, which cannot be done with function templates.
94515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
94525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalPrinter;
94535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
94555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UniversalPrint(const T& value, ::std::ostream* os);
94565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used to print an STL-style container when the user doesn't define
94585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a PrintTo() for it.
94595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename C>
94605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DefaultPrintTo(IsContainer /* dummy */,
94615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    false_type /* is not a pointer */,
94625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    const C& container, ::std::ostream* os) {
94635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t kMaxCount = 32;  // The maximum number of elements to print.
94645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << '{';
94655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t count = 0;
94665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (typename C::const_iterator it = container.begin();
94675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       it != container.end(); ++it, ++count) {
94685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (count > 0) {
94695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << ',';
94705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (count == kMaxCount) {  // Enough has been printed.
94715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *os << " ...";
94725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
94735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
94745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
94755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ' ';
94765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
94775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // handle *it being a native array.
94785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::UniversalPrint(*it, os);
94795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
94805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (count > 0) {
94825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ' ';
94835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
94845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << '}';
94855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used to print a pointer that is neither a char pointer nor a member
94885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pointer, when the user doesn't define PrintTo() for it.  (A member
94895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// variable pointer or member function pointer doesn't really point to
94905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a location in the address space.  Their representation is
94915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation-defined.  Therefore they will be printed as raw
94925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// bytes.)
94935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
94945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DefaultPrintTo(IsNotContainer /* dummy */,
94955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    true_type /* is a pointer */,
94965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    T* p, ::std::ostream* os) {
94975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (p == NULL) {
94985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << "NULL";
94995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
95005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // C++ doesn't allow casting from a function pointer to any object
95015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // pointer.
95025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
95035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // IsTrue() silences warnings: "Condition is always true",
95045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // "unreachable code".
95055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
95065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // T is not a function type.  We just call << to print p,
95075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // relying on ADL to pick up user-defined << for their pointer
95085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // types, if any.
95095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << p;
95105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
95115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // T is a function type, so '*os << p' doesn't do what we want
95125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // (it just prints p as bool).  We want to print p as a const
95135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // void*.  However, we cannot cast it to const void* directly,
95145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // even using reinterpret_cast, as earlier versions of gcc
95155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // (e.g. 3.4.5) cannot compile the cast when p is a function
95165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // pointer.  Casting to UInt64 first solves the problem.
95175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << reinterpret_cast<const void*>(
95185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          reinterpret_cast<internal::UInt64>(p));
95195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
95205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
95215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used to print a non-container, non-pointer value when the user
95245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// doesn't define PrintTo() for it.
95255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
95265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DefaultPrintTo(IsNotContainer /* dummy */,
95275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    false_type /* is not a pointer */,
95285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    const T& value, ::std::ostream* os) {
95295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::testing_internal::DefaultPrintNonContainerTo(value, os);
95305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given value using the << operator if it has one;
95335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise prints the bytes in it.  This is what
95345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
95355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or overloaded for type T.
95365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
95375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A user can override this behavior for a class type Foo by defining
95385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// an overload of PrintTo() in the namespace where Foo is defined.  We
95395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// give the user this option as sometimes defining a << operator for
95405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Foo is not desirable (e.g. the coding style may prevent doing it,
95415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or there is already a << operator but it doesn't do what the user
95425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wants).
95435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
95445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const T& value, ::std::ostream* os) {
95455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // DefaultPrintTo() is overloaded.  The type of its first two
95465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // arguments determine which version will be picked.  If T is an
95475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // STL-style container, the version for container will be called; if
95485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // T is a pointer, the pointer version will be called; otherwise the
95495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // generic version will be called.
95505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
95515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Note that we check for container types here, prior to we check
95525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // for protocol message types in our operator<<.  The rationale is:
95535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
95545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // For protocol messages, we want to give people a chance to
95555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // override Google Mock's format by defining a PrintTo() or
95565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // operator<<.  For STL containers, other formats can be
95575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // incompatible with Google Mock's format for the container
95585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // elements; therefore we check for container types here to ensure
95595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // that our format is used.
95605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
95615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The second argument of DefaultPrintTo() is needed to bypass a bug
95625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // in Symbian's C++ compiler that prevents it from picking the right
95635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // overload between:
95645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
95655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   PrintTo(const T& x, ...);
95665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   PrintTo(T* x, ...);
95675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
95685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following list of PrintTo() overloads tells
95715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UniversalPrinter<T>::Print() how to print standard types (built-in
95725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// types, strings, plain arrays, and pointers).
95735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloads for various char types.
95755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
95765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
95775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(char c, ::std::ostream* os) {
95785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When printing a plain char, we always treat it as unsigned.  This
95795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // way, the output won't be affected by whether the compiler thinks
95805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // char is signed or not.
95815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(static_cast<unsigned char>(c), os);
95825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloads for other simple built-in types.
95855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(bool x, ::std::ostream* os) {
95865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << (x ? "true" : "false");
95875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overload for wchar_t type.
95905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a wchar_t as a symbol if it is printable or as its internal
95915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// code otherwise and also as its decimal code (except for L'\0').
95925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The L'\0' char is printed as "L'\\0'". The decimal code is printed
95935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as signed integer when wchar_t is implemented by the compiler
95945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as a signed type and is printed as an unsigned integer when wchar_t
95955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is implemented as an unsigned type.
95965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
95975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloads for C strings.
95995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
96005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(char* s, ::std::ostream* os) {
96015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(ImplicitCast_<const char*>(s), os);
96025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// signed/unsigned char is often used for representing binary data, so
96055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// we print pointers to it as void* to be safe.
96065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const signed char* s, ::std::ostream* os) {
96075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(ImplicitCast_<const void*>(s), os);
96085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(signed char* s, ::std::ostream* os) {
96105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(ImplicitCast_<const void*>(s), os);
96115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const unsigned char* s, ::std::ostream* os) {
96135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(ImplicitCast_<const void*>(s), os);
96145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(unsigned char* s, ::std::ostream* os) {
96165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(ImplicitCast_<const void*>(s), os);
96175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC can be configured to define wchar_t as a typedef of unsigned
96205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
96215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type.  When wchar_t is a typedef, defining an overload for const
96225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wchar_t* would cause unsigned short* be printed as a wide string,
96235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// possibly causing invalid memory accesses.
96245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
96255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloads for wide C strings
96265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
96275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(wchar_t* s, ::std::ostream* os) {
96285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
96295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
96315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overload for C arrays.  Multi-dimensional arrays are printed
96335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// properly.
96345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given number of elements in an array, without printing
96365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the curly braces.
96375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
96385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
96395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalPrint(a[0], os);
96405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 1; i != count; i++) {
96415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ", ";
96425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrint(a[i], os);
96435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
96445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloads for ::string and ::std::string.
96475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_STRING
96485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
96495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const ::string& s, ::std::ostream* os) {
96505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintStringTo(s, os);
96515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_STRING
96535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
96555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const ::std::string& s, ::std::ostream* os) {
96565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintStringTo(s, os);
96575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloads for ::wstring and ::std::wstring.
96605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_WSTRING
96615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
96625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const ::wstring& s, ::std::ostream* os) {
96635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintWideStringTo(s, os);
96645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_WSTRING
96665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
96685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
96695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
96705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintWideStringTo(s, os);
96715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING
96735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TR1_TUPLE
96755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
96765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// which are packed as tuples.
96775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for printing a tuple.  T must be instantiated with
96795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a tuple type.
96805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
96815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTupleTo(const T& t, ::std::ostream* os);
96825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overloaded PrintTo() for tuples of various arities.  We support
96845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tuples of up-to 10 fields.  The following implementation works
96855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// regardless of whether tr1::tuple is implemented using the
96865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// non-standard variadic template feature or not.
96875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
96895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
96905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1>
96935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
96945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
96955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
96965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
96975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
96985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
96995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3>
97035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
97045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4>
97085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
97095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
97135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
97145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             ::std::ostream* os) {
97155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
97195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T6>
97205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
97215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             ::std::ostream* os) {
97225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
97265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T6, typename T7>
97275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
97285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             ::std::ostream* os) {
97295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
97335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T6, typename T7, typename T8>
97345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
97355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             ::std::ostream* os) {
97365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
97405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T6, typename T7, typename T8, typename T9>
97415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
97425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             ::std::ostream* os) {
97435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
97475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T6, typename T7, typename T8, typename T9, typename T10>
97485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(
97495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
97505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::std::ostream* os) {
97515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTupleTo(t, os);
97525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TR1_TUPLE
97545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Overload for std::pair.
97565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
97575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
97585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << '(';
97595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
97605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // a reference type.  The same for printing value.second.
97615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalPrinter<T1>::Print(value.first, os);
97625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << ", ";
97635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalPrinter<T2>::Print(value.second, os);
97645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << ')';
97655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
97665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements printing a non-reference type T by letting the compiler
97685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pick the right overload of PrintTo() for T.
97695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
97705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalPrinter {
97715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
97725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // MSVC warns about adding const to a function type, so we want to
97735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // disable the warning.
97745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
97755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)          // Saves the current warning state.
97765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable:4180)  // Temporarily disables warning 4180.
97775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
97785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Note: we deliberately don't call this PrintTo(), as that name
97805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // conflicts with ::testing::internal::PrintTo in the body of the
97815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // function.
97825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const T& value, ::std::ostream* os) {
97835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // By default, ::testing::internal::PrintTo() is used for printing
97845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // the value.
97855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
97865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Thanks to Koenig look-up, if T is a class and has its own
97875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // PrintTo() function defined in its namespace, that function will
97885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // be visible here.  Since it is more specific than the generic ones
97895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // in ::testing::internal, it will be picked by the compiler in the
97905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // following statement - exactly what we want.
97915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintTo(value, os);
97925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
97935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
97955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(pop)           // Restores the warning state.
97965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
97975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
97985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
97995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UniversalPrintArray(begin, len, os) prints an array of 'len'
98005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// elements, starting at address 'begin'.
98015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
98025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
98035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (len == 0) {
98045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << "{}";
98055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
98065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << "{ ";
98075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t kThreshold = 18;
98085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t kChunkSize = 8;
98095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // If the array has more than kThreshold elements, we'll have to
98105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // omit some details by printing only the first and the last
98115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // kChunkSize elements.
98125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // TODO(wan@google.com): let the user control the threshold using a flag.
98135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (len <= kThreshold) {
98145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintRawArrayTo(begin, len, os);
98155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
98165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintRawArrayTo(begin, kChunkSize, os);
98175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << ", ..., ";
98185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
98195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
98205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << " }";
98215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
98225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
98235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This overload prints a (const) char array compactly.
98245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void UniversalPrintArray(
98255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* begin, size_t len, ::std::ostream* os);
98265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This overload prints a (const) wchar_t array compactly.
98285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void UniversalPrintArray(
98295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const wchar_t* begin, size_t len, ::std::ostream* os);
98305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements printing an array type T[N].
98325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, size_t N>
98335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalPrinter<T[N]> {
98345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
98355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prints the given array, omitting some elements when there are too
98365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // many.
98375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const T (&a)[N], ::std::ostream* os) {
98385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrintArray(a, N, os);
98395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
98405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
98415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements printing a reference type T&.
98435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
98445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalPrinter<T&> {
98455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
98465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // MSVC warns about adding const to a function type, so we want to
98475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // disable the warning.
98485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
98495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)          // Saves the current warning state.
98505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable:4180)  // Temporarily disables warning 4180.
98515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
98525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const T& value, ::std::ostream* os) {
98545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Prints the address of the value.  We use reinterpret_cast here
98555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // as static_cast doesn't compile when T is a function type.
98565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
98575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Then prints the value itself.
98595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrint(value, os);
98605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
98615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
98635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(pop)           // Restores the warning state.
98645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
98655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
98665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a value tersely: for a reference type, the referenced value
98685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (but not the address) is printed; for a (const) char pointer, the
98695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NUL-terminated string (but not the pointer) is printed.
98705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
98715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
98725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter {
98735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
98745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const T& value, ::std::ostream* os) {
98755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrint(value, os);
98765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
98775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
98785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
98795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter<T&> {
98805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
98815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const T& value, ::std::ostream* os) {
98825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrint(value, os);
98835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
98845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
98855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, size_t N>
98865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter<T[N]> {
98875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
98885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const T (&value)[N], ::std::ostream* os) {
98895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrinter<T[N]>::Print(value, os);
98905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
98915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
98925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
98935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter<const char*> {
98945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
98955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const char* str, ::std::ostream* os) {
98965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (str == NULL) {
98975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "NULL";
98985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
98995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      UniversalPrint(string(str), os);
99005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
99015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
99025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
99035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
99045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter<char*> {
99055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
99065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(char* str, ::std::ostream* os) {
99075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalTersePrinter<const char*>::Print(str, os);
99085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
99095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
99105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
99125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
99135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter<const wchar_t*> {
99145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
99155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(const wchar_t* str, ::std::ostream* os) {
99165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (str == NULL) {
99175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "NULL";
99185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
99195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      UniversalPrint(::std::wstring(str), os);
99205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
99215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
99225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
99235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
99245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
99265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UniversalTersePrinter<wchar_t*> {
99275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
99285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void Print(wchar_t* str, ::std::ostream* os) {
99295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalTersePrinter<const wchar_t*>::Print(str, os);
99305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
99315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
99325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
99345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UniversalTersePrint(const T& value, ::std::ostream* os) {
99355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalTersePrinter<T>::Print(value, os);
99365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
99375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a value using the type inferred by the compiler.  The
99395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// difference between this and UniversalTersePrint() is that for a
99405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (const) char pointer, this prints both the pointer and the
99415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NUL-terminated string.
99425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
99435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UniversalPrint(const T& value, ::std::ostream* os) {
99445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
99455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UniversalPrinter with T directly.
99465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T T1;
99475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalPrinter<T1>::Print(value, os);
99485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
99495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TR1_TUPLE
99515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef ::std::vector<string> Strings;
99525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This helper template allows PrintTo() for tuples and
99545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UniversalTersePrintTupleFieldsToStrings() to be defined by
99555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// induction on the number of tuple fields.  The idea is that
99565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
99575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// fields in tuple t, and can be defined in terms of
99585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TuplePrefixPrinter<N - 1>.
99595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The inductive case.
99615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <size_t N>
99625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TuplePrefixPrinter {
99635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prints the first N fields of a tuple.
99645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Tuple>
99655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
99665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
99675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ", ";
99685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
99695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ::Print(::std::tr1::get<N - 1>(t), os);
99705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
99715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Tersely prints the first N fields of a tuple to a string vector,
99735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // one element for each field.
99745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Tuple>
99755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
99765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
99775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::std::stringstream ss;
99785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
99795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    strings->push_back(ss.str());
99805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
99815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
99825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Base cases.
99845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
99855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TuplePrefixPrinter<0> {
99865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Tuple>
99875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
99885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
99895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Tuple>
99905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
99915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
99925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We have to specialize the entire TuplePrefixPrinter<> class
99935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// template here, even though the definition of
99945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TersePrintPrefixToStrings() is the same as the generic version, as
99955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
99965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// support specializing a method template of a class template.
99975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <>
99985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TuplePrefixPrinter<1> {
99995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Tuple>
100005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
100015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
100025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        Print(::std::tr1::get<0>(t), os);
100035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
100045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Tuple>
100065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
100075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::std::stringstream ss;
100085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
100095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    strings->push_back(ss.str());
100105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
100115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
100125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for printing a tuple.  T must be instantiated with
100145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a tuple type.
100155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
100165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTupleTo(const T& t, ::std::ostream* os) {
100175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << "(";
100185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
100195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintPrefixTo(t, os);
100205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << ")";
100215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
100225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the fields of a tuple tersely to a string vector, one
100245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// element for each field.  See the comment before
100255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UniversalTersePrint() for how we define "tersely".
100265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Tuple>
100275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangStrings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
100285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Strings result;
100295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
100305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      TersePrintPrefixToStrings(value, &result);
100315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
100325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
100335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TR1_TUPLE
100345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
100365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
100385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang::std::string PrintToString(const T& value) {
100395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::stringstream ss;
100405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UniversalTersePrinter<T>::Print(value, &ss);
100415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ss.str();
100425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
100435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
100455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
100475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
100495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
100515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
100525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
100545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
100555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Outputs a message explaining invalid registration of different
100565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// fixture class for the same test case. This may happen when
100575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST_P macro is used to define two tests with the same name
100585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// but in different namespaces.
100595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
100605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          const char* file, int line);
100615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename> class ParamGeneratorInterface;
100635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename> class ParamGenerator;
100645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Interface for iterating over elements provided by an implementation
100665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of ParamGeneratorInterface<T>.
100675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
100685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParamIteratorInterface {
100695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
100705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ParamIteratorInterface() {}
100715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A pointer to the base generator instance.
100725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Used only for the purposes of iterator comparison
100735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to make sure that two iterators belong to the same generator.
100745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
100755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Advances iterator to point to the next element
100765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // provided by the generator. The caller is responsible
100775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // for not calling Advance() on an iterator equal to
100785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // BaseGenerator()->End().
100795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void Advance() = 0;
100805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Clones the iterator object. Used for implementing copy semantics
100815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // of ParamIterator<T>.
100825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface* Clone() const = 0;
100835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Dereferences the current iterator and provides (read-only) access
100845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to the pointed value. It is the caller's responsibility not to call
100855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Current() on an iterator equal to BaseGenerator()->End().
100865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Used for implementing ParamGenerator<T>::operator*().
100875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual const T* Current() const = 0;
100885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Determines whether the given iterator and other point to the same
100895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // element in the sequence generated by the generator.
100905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Used for implementing ParamGenerator<T>::operator==().
100915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
100925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
100935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
100945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Class iterating over elements provided by an implementation of
100955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
100965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and implements the const forward iterator concept.
100975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
100985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParamIterator {
100995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
101005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T value_type;
101015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef const T& reference;
101025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ptrdiff_t difference_type;
101035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ParamIterator assumes ownership of the impl_ pointer.
101055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
101065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParamIterator& operator=(const ParamIterator& other) {
101075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (this != &other)
101085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      impl_.reset(other.impl_->Clone());
101095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
101105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T& operator*() const { return *impl_->Current(); }
101135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T* operator->() const { return impl_->Current(); }
101145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prefix version of operator++.
101155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParamIterator& operator++() {
101165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl_->Advance();
101175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
101185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Postfix version of operator++.
101205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParamIterator operator++(int /*unused*/) {
101215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamIteratorInterface<T>* clone = impl_->Clone();
101225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl_->Advance();
101235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamIterator(clone);
101245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator==(const ParamIterator& other) const {
101265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
101275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator!=(const ParamIterator& other) const {
101295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return !(*this == other);
101305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
101335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class ParamGenerator<T>;
101345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
101355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  scoped_ptr<ParamIteratorInterface<T> > impl_;
101365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
101375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParamGeneratorInterface<T> is the binary interface to access generators
101395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defined in other translation units.
101405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
101415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParamGeneratorInterface {
101425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
101435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef T ParamType;
101445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ParamGeneratorInterface() {}
101465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Generator interface definition
101485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<T>* Begin() const = 0;
101495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<T>* End() const = 0;
101505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
101515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Wraps ParamGeneratorInterface<T> and provides general generator syntax
101535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compatible with the STL Container concept.
101545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class implements copy initialization semantics and the contained
101555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParamGeneratorInterface<T> instance is shared among all copies
101565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of the original object. This is possible because that instance is immutable.
101575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate<typename T>
101585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParamGenerator {
101595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
101605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ParamIterator<T> iterator;
101615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
101635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
101645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParamGenerator& operator=(const ParamGenerator& other) {
101665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl_ = other.impl_;
101675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *this;
101685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  iterator begin() const { return iterator(impl_->Begin()); }
101715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  iterator end() const { return iterator(impl_->End()); }
101725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
101745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  linked_ptr<const ParamGeneratorInterface<T> > impl_;
101755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
101765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates values from a range of two comparable values. Can be used to
101785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// generate sequences of user-defined types that implement operator+() and
101795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// operator<().
101805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class is used in the Range() function.
101815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename IncrementT>
101825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass RangeGenerator : public ParamGeneratorInterface<T> {
101835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
101845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RangeGenerator(T begin, T end, IncrementT step)
101855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : begin_(begin), end_(end),
101865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
101875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~RangeGenerator() {}
101885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<T>* Begin() const {
101905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, begin_, 0, step_);
101915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<T>* End() const {
101935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, end_, end_index_, step_);
101945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
101955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
101965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
101975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<T> {
101985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
101995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
102005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             IncrementT step)
102015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base), value_(value), index_(index), step_(step) {}
102025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
102035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
102055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
102065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
102075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
102085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      value_ = value_ + step_;
102095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      index_++;
102105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
102115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<T>* Clone() const {
102125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
102135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
102145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const T* Current() const { return &value_; }
102155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
102165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
102175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
102185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
102195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
102205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
102215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int other_index =
102225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other)->index_;
102235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return index_ == other_index;
102245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
102255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
102275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
102285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : ParamIteratorInterface<T>(),
102295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          base_(other.base_), value_(other.value_), index_(other.index_),
102305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          step_(other.step_) {}
102315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
102335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
102345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<T>* const base_;
102365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T value_;
102375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int index_;
102385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const IncrementT step_;
102395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class RangeGenerator::Iterator
102405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static int CalculateEndIndex(const T& begin,
102425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const T& end,
102435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const IncrementT& step) {
102445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int end_index = 0;
102455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (T i = begin; i < end; i = i + step)
102465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      end_index++;
102475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return end_index;
102485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
102495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
102515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const RangeGenerator& other);
102525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T begin_;
102545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T end_;
102555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const IncrementT step_;
102565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The index for the end() iterator. All the elements in the generated
102575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // sequence are indexed (0-based) to aid iterator comparison.
102585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int end_index_;
102595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class RangeGenerator
102605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates values from a pair of STL-style iterators. Used in the
102635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ValuesIn() function. The elements are copied from the source range
102645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// since the source can be located on the stack, and the generator
102655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is likely to persist beyond that stack frame.
102665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
102675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
102685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
102695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename ForwardIterator>
102705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
102715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : container_(begin, end) {}
102725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ValuesInIteratorRangeGenerator() {}
102735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<T>* Begin() const {
102755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, container_.begin());
102765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
102775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<T>* End() const {
102785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, container_.end());
102795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
102805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
102825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename ::std::vector<T> ContainerType;
102835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<T> {
102855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
102865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<T>* base,
102875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             typename ContainerType::const_iterator iterator)
102885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base), iterator_(iterator) {}
102895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
102905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
102915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
102925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
102935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
102945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
102955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++iterator_;
102965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      value_.reset();
102975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
102985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<T>* Clone() const {
102995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
103005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
103015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We need to use cached value referenced by iterator_ because *iterator_
103025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // can return a temporary object (and of type other then T), so just
103035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // having "return &*iterator_;" doesn't work.
103045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // value_ is updated here and not in Advance() because Advance()
103055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // can advance iterator_ beyond the end of the range, and we cannot
103065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // detect that fact. The client code, on the other hand, is
103075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // responsible for not calling Current() on an out-of-range iterator.
103085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const T* Current() const {
103095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (value_.get() == NULL)
103105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        value_.reset(new T(*iterator_));
103115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return value_.get();
103125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
103135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
103145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
103155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
103165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
103175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
103185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
103195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return iterator_ ==
103205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
103215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
103225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
103245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
103255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // The explicit constructor call suppresses a false warning
103265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // emitted by gcc when supplied with the -Wextra option.
103275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : ParamIteratorInterface<T>(),
103285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          base_(other.base_),
103295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          iterator_(other.iterator_) {}
103305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<T>* const base_;
103325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ContainerType::const_iterator iterator_;
103335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // A cached value of *iterator_. We keep it here to allow access by
103345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // pointer in the wrapping iterator's operator->().
103355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // value_ needs to be mutable to be accessed in Current().
103365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Use of scoped_ptr helps manage cached value's lifetime,
103375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // which is bound by the lifespan of the iterator itself.
103385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    mutable scoped_ptr<const T> value_;
103395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class ValuesInIteratorRangeGenerator::Iterator
103405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
103425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValuesInIteratorRangeGenerator& other);
103435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ContainerType container_;
103455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class ValuesInIteratorRangeGenerator
103465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
103485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
103495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Stores a parameter value and later creates tests parameterized with that
103505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value.
103515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class TestClass>
103525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParameterizedTestFactory : public TestFactoryBase {
103535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
103545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename TestClass::ParamType ParamType;
103555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ParameterizedTestFactory(ParamType parameter) :
103565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      parameter_(parameter) {}
103575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual Test* CreateTest() {
103585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestClass::SetParam(&parameter_);
103595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new TestClass();
103605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
103615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
103635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamType parameter_;
103645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
103665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
103675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
103695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
103705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestMetaFactoryBase is a base class for meta-factories that create
103715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test factories for passing into MakeAndRegisterTestInfo function.
103725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class ParamType>
103735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestMetaFactoryBase {
103745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
103755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~TestMetaFactoryBase() {}
103765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
103785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
103795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
103815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
103825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestMetaFactory creates test factories for passing into
103835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
103845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ownership of test factory pointer, same factory object cannot be passed
103855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// into that method twice. But ParameterizedTestCaseInfo is going to call
103865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it for each Test/Parameter value combination. Thus it needs meta factory
103875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// creator class.
103885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class TestCase>
103895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestMetaFactory
103905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public TestMetaFactoryBase<typename TestCase::ParamType> {
103915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
103925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename TestCase::ParamType ParamType;
103935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestMetaFactory() {}
103955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
103965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
103975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new ParameterizedTestFactory<TestCase>(parameter);
103985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
103995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
104015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
104025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
104035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
104055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
104065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParameterizedTestCaseInfoBase is a generic interface
104075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
104085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// accumulates test information provided by TEST_P macro invocations
104095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
104105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and uses that information to register all resulting test instances
104115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
104125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a collection of pointers to the ParameterizedTestCaseInfo objects
104135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and calls RegisterTests() on each of them when asked.
104145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParameterizedTestCaseInfoBase {
104155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
104165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ParameterizedTestCaseInfoBase() {}
104175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Base part of test case name for display purposes.
104195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual const string& GetTestCaseName() const = 0;
104205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Test case id to verify identity.
104215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TypeId GetTestCaseTypeId() const = 0;
104225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UnitTest class invokes this method to register tests in this
104235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test case right before running them in RUN_ALL_TESTS macro.
104245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This method should not be called more then once on any single
104255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // instance of a ParameterizedTestCaseInfoBase derived class.
104265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void RegisterTests() = 0;
104275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang protected:
104295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParameterizedTestCaseInfoBase() {}
104305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
104325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
104335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
104345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
104365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
104375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
104385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macro invocations for a particular test case and generators
104395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
104405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test case. It registers tests with all values generated by all
104415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// generators when asked.
104425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class TestCase>
104435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
104445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
104455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ParamType and GeneratorCreationFunc are private types but are required
104465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // for declarations of public methods AddTestPattern() and
104475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // AddTestCaseInstantiation().
104485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename TestCase::ParamType ParamType;
104495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A function that returns an instance of appropriate generator type.
104505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
104515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ParameterizedTestCaseInfo(const char* name)
104535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : test_case_name_(name) {}
104545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Test case base name for display purposes.
104565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual const string& GetTestCaseName() const { return test_case_name_; }
104575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Test case id to verify identity.
104585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
104595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TEST_P macro uses AddTestPattern() to record information
104605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // about a single test in a LocalTestInfo structure.
104615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test_case_name is the base name of the test case (without invocation
104625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // prefix). test_base_name is the name of an individual test without
104635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
104645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test case base name and DoBar is test base name.
104655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void AddTestPattern(const char* test_case_name,
104665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      const char* test_base_name,
104675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      TestMetaFactoryBase<ParamType>* meta_factory) {
104685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
104695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                       test_base_name,
104705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                       meta_factory)));
104715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
104725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
104735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // about a generator.
104745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int AddTestCaseInstantiation(const string& instantiation_name,
104755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               GeneratorCreationFunc* func,
104765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* /* file */,
104775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               int /* line */) {
104785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    instantiations_.push_back(::std::make_pair(instantiation_name, func));
104795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 0;  // Return value used only to run this method in namespace scope.
104805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
104815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UnitTest class invokes this method to register tests in this test case
104825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test cases right before running tests in RUN_ALL_TESTS macro.
104835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This method should not be called more then once on any single
104845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // instance of a ParameterizedTestCaseInfoBase derived class.
104855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UnitTest has a guard to prevent from calling this method more then once.
104865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void RegisterTests() {
104875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (typename TestInfoContainer::iterator test_it = tests_.begin();
104885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         test_it != tests_.end(); ++test_it) {
104895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      linked_ptr<TestInfo> test_info = *test_it;
104905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (typename InstantiationContainer::iterator gen_it =
104915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               instantiations_.begin(); gen_it != instantiations_.end();
104925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               ++gen_it) {
104935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const string& instantiation_name = gen_it->first;
104945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParamGenerator<ParamType> generator((*gen_it->second)());
104955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
104965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        string test_case_name;
104975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if ( !instantiation_name.empty() )
104985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          test_case_name = instantiation_name + "/";
104995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        test_case_name += test_info->test_case_base_name;
105005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        int i = 0;
105025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        for (typename ParamGenerator<ParamType>::iterator param_it =
105035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 generator.begin();
105045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             param_it != generator.end(); ++param_it, ++i) {
105055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          Message test_name_stream;
105065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          test_name_stream << test_info->test_base_name << "/" << i;
105075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          MakeAndRegisterTestInfo(
105085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              test_case_name.c_str(),
105095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              test_name_stream.GetString().c_str(),
105105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              NULL,  // No type parameter.
105115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              PrintToString(*param_it).c_str(),
105125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              GetTestCaseTypeId(),
105135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              TestCase::SetUpTestCase,
105145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              TestCase::TearDownTestCase,
105155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              test_info->test_meta_factory->CreateTestFactory(*param_it));
105165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }  // for param_it
105175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }  // for gen_it
105185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }  // for test_it
105195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }  // RegisterTests
105205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
105225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // LocalTestInfo structure keeps information about a single test registered
105235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // with TEST_P macro.
105245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct TestInfo {
105255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestInfo(const char* a_test_case_base_name,
105265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             const char* a_test_base_name,
105275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
105285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        test_case_base_name(a_test_case_base_name),
105295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        test_base_name(a_test_base_name),
105305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        test_meta_factory(a_test_meta_factory) {}
105315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const string test_case_base_name;
105335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const string test_base_name;
105345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
105355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
105365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
105375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Keeps pairs of <Instantiation name, Sequence generator creation function>
105385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // received from INSTANTIATE_TEST_CASE_P macros.
105395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
105405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      InstantiationContainer;
105415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const string test_case_name_;
105435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestInfoContainer tests_;
105445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  InstantiationContainer instantiations_;
105455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
105475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class ParameterizedTestCaseInfo
105485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
105505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
105515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
105525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
105535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macros use it to locate their corresponding ParameterizedTestCaseInfo
105545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// descriptors.
105555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ParameterizedTestCaseRegistry {
105565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
105575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParameterizedTestCaseRegistry() {}
105585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~ParameterizedTestCaseRegistry() {
105595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
105605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         it != test_case_infos_.end(); ++it) {
105615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      delete *it;
105625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
105635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
105645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
105655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Looks up or creates and returns a structure containing information about
105665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // tests and instantiations of a particular test case.
105675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <class TestCase>
105685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
105695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* test_case_name,
105705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* file,
105715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      int line) {
105725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
105735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
105745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         it != test_case_infos_.end(); ++it) {
105755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if ((*it)->GetTestCaseName() == test_case_name) {
105765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
105775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // Complain about incorrect usage of Google Test facilities
105785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // and terminate the program since we cannot guaranty correct
105795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // test case setup and tear-down in this case.
105805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ReportInvalidTestCaseType(test_case_name,  file, line);
105815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          posix::Abort();
105825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        } else {
105835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // At this point we are sure that the object we found is of the same
105845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // type we are looking for, so we downcast it to that type
105855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // without further checks.
105865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typed_test_info = CheckedDowncastToActualType<
105875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              ParameterizedTestCaseInfo<TestCase> >(*it);
105885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
105895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
105905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
105915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
105925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (typed_test_info == NULL) {
105935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
105945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      test_case_infos_.push_back(typed_test_info);
105955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
105965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return typed_test_info;
105975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
105985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RegisterTests() {
105995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
106005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         it != test_case_infos_.end(); ++it) {
106015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (*it)->RegisterTests();
106025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
106035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
106045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
106065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
106075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestCaseInfoContainer test_case_infos_;
106095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
106115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
106125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
106145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
106155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  //  GTEST_HAS_PARAM_TEST
106175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
106195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file was GENERATED by command:
106205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     pump.py gtest-param-util-generated.h.pump
106215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DO NOT EDIT BY HAND!!!
106225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008 Google Inc.
106245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All Rights Reserved.
106255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
106265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
106275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
106285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
106295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
106305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
106315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
106325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
106335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
106345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
106355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
106365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
106375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
106385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
106395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
106405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
106415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
106425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
106435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
106445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
106455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
106465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
106475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
106485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
106495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
106505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
106515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
106525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: vladl@google.com (Vlad Losev)
106535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Type and function utilities for implementing parameterized tests.
106555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
106565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
106575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Currently Google Test supports at most 50 arguments in Values,
106585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and at most 10 arguments in Combine. Please contact
106595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// googletestframework@googlegroups.com if you need more.
106605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Please note that the number of arguments to Combine is limited
106615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by the maximum arity of the implementation of tr1::tuple which is
106625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// currently set at 10.
106635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
106655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
106665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// scripts/fuse_gtest.py depends on gtest's own header being #included
106685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *unconditionally*.  Therefore these #includes cannot be moved
106695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// inside #if GTEST_HAS_PARAM_TEST.
106705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
106725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
106745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Forward declarations of ValuesIn(), which is implemented in
106765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// include/gtest/gtest-param-test.h.
106775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename ForwardIterator>
106785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<
106795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
106805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangValuesIn(ForwardIterator begin, ForwardIterator end);
106815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, size_t N>
106835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
106845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Container>
106865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<typename Container::value_type> ValuesIn(
106875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Container& container);
106885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
106905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used in the Values() function to provide polymorphic capabilities.
106925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1>
106935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray1 {
106945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
106955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ValueArray1(T1 v1) : v1_(v1) {}
106965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
106975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
106985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
106995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
107015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
107025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray1& other);
107035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
107055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
107065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
107085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray2 {
107095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
107105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
107115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
107135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
107145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
107155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
107165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
107175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
107195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
107205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray2& other);
107215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
107235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
107245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
107255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3>
107275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray3 {
107285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
107295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
107305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
107325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
107335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
107345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_)};
107355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
107365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
107375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
107395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
107405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray3& other);
107415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
107435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
107445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
107455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
107465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4>
107485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray4 {
107495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
107505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
107515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4) {}
107525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
107545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
107555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
107565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_)};
107575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
107585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
107595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
107615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
107625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray4& other);
107635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
107655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
107665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
107675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
107685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
107695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
107715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray5 {
107725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
107735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
107745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4), v5_(v5) {}
107755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
107775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
107785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
107795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
107805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
107815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
107825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
107845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
107855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray5& other);
107865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
107885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
107895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
107905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
107915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
107925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
107935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
107945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
107955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6>
107965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray6 {
107975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
107985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
107995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
108005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
108025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
108035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
108045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
108055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_)};
108065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
108075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
108085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
108105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
108115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray6& other);
108125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
108145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
108155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
108165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
108175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
108185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
108195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
108205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
108225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7>
108235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray7 {
108245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
108255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
108265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
108275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
108295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
108305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
108315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
108325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_)};
108335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
108345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
108355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
108375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
108385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray7& other);
108395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
108415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
108425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
108435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
108445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
108455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
108465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
108475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
108485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
108505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8>
108515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray8 {
108525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
108535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
108545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
108555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8) {}
108565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
108585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
108595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
108605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
108615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
108625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
108635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
108645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
108665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
108675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray8& other);
108685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
108705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
108715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
108725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
108735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
108745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
108755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
108765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
108775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
108785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
108805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9>
108815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray9 {
108825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
108835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
108845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
108855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9) {}
108865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
108885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
108895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
108905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
108915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
108925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_)};
108935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
108945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
108955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
108965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
108975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
108985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray9& other);
108995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
109015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
109025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
109035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
109045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
109055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
109065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
109075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
109085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
109095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
109105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
109125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10>
109135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray10 {
109145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
109155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
109165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
109175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10) {}
109185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
109205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
109215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
109225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
109235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
109245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_)};
109255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
109265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
109275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
109295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
109305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray10& other);
109315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
109335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
109345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
109355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
109365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
109375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
109385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
109395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
109405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
109415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
109425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
109435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
109455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
109465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11>
109475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray11 {
109485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
109495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
109505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
109515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
109525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
109545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
109555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
109565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
109575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
109585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
109595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
109605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
109615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
109635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
109645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray11& other);
109655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
109675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
109685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
109695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
109705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
109715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
109725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
109735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
109745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
109755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
109765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
109775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
109785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
109805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
109815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12>
109825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray12 {
109835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
109845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
109855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
109865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
109875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
109895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
109905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
109915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
109925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
109935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
109945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_)};
109955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
109965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
109975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
109985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
109995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
110005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray12& other);
110015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
110035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
110045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
110055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
110065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
110075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
110085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
110095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
110105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
110115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
110125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
110135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
110145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
110155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
110175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
110185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13>
110195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray13 {
110205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
110215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
110225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
110235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
110245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12_(v12), v13_(v13) {}
110255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
110275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
110285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
110295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
110305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
110315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
110325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_)};
110335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
110345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
110355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
110375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
110385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray13& other);
110395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
110415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
110425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
110435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
110445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
110455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
110465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
110475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
110485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
110495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
110505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
110515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
110525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
110535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
110545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
110565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
110575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14>
110585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray14 {
110595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
110605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
110615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
110625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
110635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
110645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
110665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
110675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
110685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
110695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
110705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
110715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
110725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
110735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
110745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
110765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
110775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray14& other);
110785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
110805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
110815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
110825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
110835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
110845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
110855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
110865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
110875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
110885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
110895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
110905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
110915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
110925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
110935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
110945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
110955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
110965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
110975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15>
110985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray15 {
110995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
111005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
111015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
111025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
111035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
111045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
111065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
111075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
111085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
111095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
111105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
111115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
111125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_)};
111135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
111145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
111155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
111175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
111185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray15& other);
111195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
111215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
111225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
111235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
111245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
111255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
111265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
111275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
111285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
111295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
111305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
111315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
111325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
111335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
111345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
111355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
111365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
111385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
111395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
111405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16>
111415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray16 {
111425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
111435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
111445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
111455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
111465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
111475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16_(v16) {}
111485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
111505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
111515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
111525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
111535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
111545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
111555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
111565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_)};
111575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
111585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
111595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
111615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
111625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray16& other);
111635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
111655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
111665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
111675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
111685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
111695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
111705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
111715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
111725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
111735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
111745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
111755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
111765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
111775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
111785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
111795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
111805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
111815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
111835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
111845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
111855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17>
111865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray17 {
111875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
111885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
111895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
111905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
111915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
111925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17) {}
111935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
111945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
111955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
111965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
111975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
111985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
111995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
112005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
112015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
112025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
112035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
112045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
112065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
112075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray17& other);
112085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
112105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
112115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
112125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
112135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
112145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
112155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
112165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
112175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
112185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
112195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
112205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
112215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
112225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
112235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
112245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
112255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
112265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
112275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
112295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
112305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
112315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18>
112325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray18 {
112335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
112345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
112355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
112365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
112375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
112385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
112395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
112415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
112425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
112435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
112445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
112455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
112465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
112475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
112485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_)};
112495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
112505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
112515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
112535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
112545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray18& other);
112555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
112575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
112585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
112595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
112605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
112615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
112625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
112635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
112645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
112655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
112665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
112675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
112685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
112695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
112705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
112715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
112725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
112735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
112745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
112755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
112775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
112785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
112795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19>
112805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray19 {
112815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
112825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
112835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
112845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
112855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
112865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
112875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
112885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
112895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
112905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
112915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
112925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
112935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
112945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
112955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
112965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_)};
112975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
112985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
112995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
113015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
113025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray19& other);
113035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
113055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
113065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
113075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
113085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
113095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
113105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
113115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
113125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
113135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
113145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
113155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
113165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
113175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
113185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
113195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
113205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
113215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
113225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
113235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
113245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
113265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
113275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
113285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20>
113295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray20 {
113305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
113315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
113325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
113335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
113345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
113355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
113365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v19_(v19), v20_(v20) {}
113375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
113395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
113405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
113415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
113425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
113435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
113445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
113455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
113465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
113475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
113485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
113495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
113515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
113525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray20& other);
113535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
113555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
113565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
113575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
113585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
113595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
113605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
113615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
113625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
113635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
113645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
113655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
113665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
113675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
113685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
113695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
113705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
113715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
113725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
113735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
113745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
113755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
113775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
113785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
113795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
113805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21>
113815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray21 {
113825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
113835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
113845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
113855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
113865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
113875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
113885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
113895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
113905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
113915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
113925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
113935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
113945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
113955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
113965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
113975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
113985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
113995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_)};
114005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
114015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
114025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
114045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
114055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray21& other);
114065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
114085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
114095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
114105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
114115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
114125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
114135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
114145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
114155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
114165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
114175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
114185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
114195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
114205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
114215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
114225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
114235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
114245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
114255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
114265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
114275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
114285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
114295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
114315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
114325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
114335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
114345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22>
114355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray22 {
114365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
114375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
114385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
114395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
114405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
114415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
114425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
114435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
114455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
114465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
114475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
114485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
114495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
114505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
114515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
114525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
114535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_)};
114545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
114555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
114565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
114585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
114595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray22& other);
114605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
114625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
114635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
114645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
114655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
114665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
114675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
114685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
114695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
114705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
114715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
114725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
114735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
114745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
114755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
114765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
114775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
114785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
114795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
114805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
114815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
114825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
114835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
114845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
114855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
114865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
114875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
114885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
114895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23>
114905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray23 {
114915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
114925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
114935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
114945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
114955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
114965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
114975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
114985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23) {}
114995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
115015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
115025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
115035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
115045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
115055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
115065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
115075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
115085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
115095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
115105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
115115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
115125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
115145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
115155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray23& other);
115165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
115185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
115195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
115205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
115215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
115225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
115235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
115245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
115255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
115265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
115275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
115285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
115295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
115305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
115315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
115325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
115335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
115345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
115355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
115365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
115375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
115385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
115395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
115405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
115415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
115435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
115445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
115455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
115465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24>
115475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray24 {
115485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
115495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
115505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
115515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
115525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
115535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
115545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
115555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v22_(v22), v23_(v23), v24_(v24) {}
115565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
115585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
115595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
115605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
115615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
115625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
115635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
115645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
115655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
115665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
115675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_)};
115685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
115695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
115705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
115725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
115735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray24& other);
115745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
115765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
115775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
115785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
115795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
115805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
115815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
115825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
115835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
115845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
115855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
115865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
115875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
115885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
115895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
115905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
115915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
115925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
115935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
115945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
115955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
115965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
115975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
115985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
115995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
116005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
116025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
116035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
116045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
116055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25>
116065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray25 {
116075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
116085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
116095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
116105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
116115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
116125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
116135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
116145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
116155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
116175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
116185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
116195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
116205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
116215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
116225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
116235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
116245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
116255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
116265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_)};
116275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
116285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
116295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
116315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
116325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray25& other);
116335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
116355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
116365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
116375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
116385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
116395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
116405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
116415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
116425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
116435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
116445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
116455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
116465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
116475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
116485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
116495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
116505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
116515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
116525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
116535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
116545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
116555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
116565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
116575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
116585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
116595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
116605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
116625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
116635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
116645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
116655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
116665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26>
116675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray26 {
116685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
116695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
116705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
116715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
116725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
116735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
116745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
116755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
116765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
116785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
116795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
116805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
116815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
116825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
116835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
116845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
116855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
116865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
116875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
116885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
116895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
116905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
116925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
116935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray26& other);
116945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
116955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
116965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
116975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
116985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
116995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
117005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
117015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
117025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
117035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
117045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
117055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
117065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
117075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
117085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
117095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
117105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
117115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
117125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
117135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
117145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
117155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
117165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
117175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
117185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
117195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
117205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
117215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
117225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
117235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
117245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
117255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
117265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
117275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
117285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27>
117295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray27 {
117305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
117315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
117325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
117335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
117345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
117355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
117365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
117375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
117385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v26_(v26), v27_(v27) {}
117395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
117405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
117415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
117425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
117435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
117445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
117455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
117465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
117475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
117485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
117495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
117505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
117515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_)};
117525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
117535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
117545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
117555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
117565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
117575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray27& other);
117585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
117595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
117605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
117615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
117625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
117635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
117645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
117655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
117665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
117675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
117685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
117695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
117705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
117715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
117725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
117735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
117745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
117755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
117765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
117775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
117785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
117795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
117805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
117815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
117825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
117835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
117845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
117855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
117865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
117875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
117885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
117895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
117905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
117915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
117925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
117935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28>
117945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray28 {
117955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
117965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
117975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
117985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
117995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
118005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
118015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
118025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
118035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
118045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
118065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
118075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
118085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
118095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
118105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
118115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
118125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
118135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
118145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
118155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
118165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_)};
118175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
118185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
118195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
118215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
118225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray28& other);
118235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
118255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
118265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
118275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
118285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
118295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
118305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
118315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
118325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
118335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
118345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
118355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
118365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
118375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
118385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
118395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
118405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
118415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
118425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
118435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
118445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
118455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
118465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
118475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
118485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
118495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
118505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
118515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
118525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
118535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
118555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
118565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
118575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
118585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
118595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29>
118605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray29 {
118615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
118625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
118635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
118645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
118655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
118665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
118675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
118685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
118695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
118705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
118725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
118735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
118745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
118755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
118765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
118775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
118785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
118795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
118805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
118815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
118825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
118835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
118845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
118855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
118875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
118885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray29& other);
118895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
118905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
118915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
118925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
118935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
118945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
118955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
118965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
118975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
118985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
118995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
119005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
119015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
119025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
119035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
119045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
119055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
119065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
119075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
119085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
119095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
119105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
119115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
119125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
119135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
119145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
119155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
119165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
119175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
119185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
119195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
119205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
119215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
119225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
119235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
119245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
119255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
119265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30>
119275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray30 {
119285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
119295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
119305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
119315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
119325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
119335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
119345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
119355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
119365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
119375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29_(v29), v30_(v30) {}
119385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
119395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
119405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
119415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
119425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
119435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
119445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
119455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
119465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
119475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
119485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
119495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
119505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
119515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_)};
119525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
119535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
119545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
119555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
119565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
119575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray30& other);
119585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
119595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
119605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
119615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
119625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
119635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
119645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
119655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
119665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
119675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
119685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
119695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
119705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
119715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
119725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
119735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
119745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
119755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
119765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
119775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
119785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
119795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
119805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
119815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
119825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
119835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
119845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
119855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
119865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
119875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
119885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
119895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
119905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
119915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
119925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
119935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
119945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
119955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
119965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
119975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31>
119985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray31 {
119995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
120005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
120015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
120025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
120035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
120045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
120055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
120065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
120075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
120085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29_(v29), v30_(v30), v31_(v31) {}
120095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
120105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
120115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
120125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
120135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
120145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
120155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
120165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
120175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
120185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
120195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
120205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
120215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
120225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_)};
120235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
120245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
120255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
120265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
120275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
120285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray31& other);
120295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
120305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
120315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
120325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
120335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
120345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
120355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
120365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
120375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
120385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
120395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
120405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
120415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
120425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
120435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
120445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
120455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
120465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
120475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
120485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
120495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
120505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
120515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
120525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
120535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
120545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
120555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
120565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
120575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
120585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
120595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
120605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
120615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
120625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
120635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
120645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
120655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
120665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
120675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
120685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
120695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32>
120705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray32 {
120715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
120725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
120735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
120745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
120755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
120765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
120775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
120785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
120795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
120805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
120815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
120825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
120835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
120845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
120855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
120865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
120875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
120885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
120895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
120905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
120915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
120925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
120935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
120945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
120955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
120965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
120975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
120985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
120995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
121005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray32& other);
121015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
121025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
121035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
121045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
121055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
121065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
121075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
121085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
121095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
121105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
121115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
121125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
121135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
121145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
121155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
121165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
121175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
121185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
121195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
121205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
121215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
121225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
121235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
121245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
121255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
121265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
121275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
121285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
121295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
121305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
121315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
121325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
121335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
121345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
121355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
121365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
121375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
121385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
121395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
121405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
121415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
121425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33>
121435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray33 {
121445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
121455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
121465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
121475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
121485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
121495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
121505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
121515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
121525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
121535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
121545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33_(v33) {}
121555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
121565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
121575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
121585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
121595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
121605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
121615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
121625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
121635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
121645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
121655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
121665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
121675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
121685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
121695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_)};
121705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
121715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
121725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
121735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
121745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
121755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray33& other);
121765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
121775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
121785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
121795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
121805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
121815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
121825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
121835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
121845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
121855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
121865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
121875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
121885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
121895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
121905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
121915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
121925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
121935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
121945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
121955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
121965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
121975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
121985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
121995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
122005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
122015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
122025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
122035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
122045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
122055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
122065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
122075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
122085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
122095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
122105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
122115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
122125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
122135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
122145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
122155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
122165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
122175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
122185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34>
122195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray34 {
122205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
122215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
122225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
122235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
122245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
122255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
122265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
122275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
122285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
122295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
122305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33_(v33), v34_(v34) {}
122315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
122325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
122335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
122345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
122355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
122365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
122375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
122385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
122395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
122405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
122415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
122425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
122435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
122445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
122455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_)};
122465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
122475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
122485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
122495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
122505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
122515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray34& other);
122525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
122535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
122545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
122555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
122565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
122575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
122585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
122595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
122605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
122615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
122625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
122635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
122645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
122655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
122665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
122675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
122685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
122695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
122705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
122715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
122725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
122735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
122745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
122755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
122765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
122775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
122785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
122795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
122805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
122815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
122825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
122835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
122845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
122855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
122865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
122875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
122885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
122895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
122905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
122915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
122925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
122935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
122945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
122955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35>
122965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray35 {
122975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
122985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
122995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
123005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
123015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
123025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
123035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
123045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
123055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
123065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
123075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
123085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
123095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
123105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
123115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
123125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
123135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
123145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
123155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
123165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
123175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
123185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
123195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
123205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
123215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
123225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
123235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
123245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
123255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
123265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
123275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
123285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray35& other);
123295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
123305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
123315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
123325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
123335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
123345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
123355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
123365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
123375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
123385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
123395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
123405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
123415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
123425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
123435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
123445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
123455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
123465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
123475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
123485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
123495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
123505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
123515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
123525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
123535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
123545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
123555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
123565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
123575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
123585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
123595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
123605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
123615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
123625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
123635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
123645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
123655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
123665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
123675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
123685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
123695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
123705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
123715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
123725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
123735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
123745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36>
123755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray36 {
123765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
123775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
123785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
123795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
123805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
123815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
123825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
123835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
123845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
123855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
123865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
123875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
123885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
123895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
123905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
123915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
123925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
123935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
123945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
123955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
123965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
123975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
123985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
123995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
124005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
124015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
124025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_)};
124035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
124045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
124055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
124065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
124075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
124085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray36& other);
124095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
124105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
124115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
124125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
124135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
124145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
124155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
124165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
124175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
124185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
124195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
124205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
124215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
124225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
124235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
124245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
124255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
124265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
124275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
124285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
124295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
124305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
124315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
124325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
124335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
124345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
124355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
124365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
124375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
124385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
124395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
124405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
124415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
124425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
124435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
124445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
124455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
124465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
124475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
124485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
124495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
124505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
124515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
124525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
124535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
124545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
124555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37>
124565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray37 {
124575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
124585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
124595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
124605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
124615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
124625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
124635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
124645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
124655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
124665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
124675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
124685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v36_(v36), v37_(v37) {}
124695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
124705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
124715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
124725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
124735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
124745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
124755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
124765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
124775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
124785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
124795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
124805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
124815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
124825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
124835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
124845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_)};
124855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
124865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
124875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
124885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
124895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
124905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray37& other);
124915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
124925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
124935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
124945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
124955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
124965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
124975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
124985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
124995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
125005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
125015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
125025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
125035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
125045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
125055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
125065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
125075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
125085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
125095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
125105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
125115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
125125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
125135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
125145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
125155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
125165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
125175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
125185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
125195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
125205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
125215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
125225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
125235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
125245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
125255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
125265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
125275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
125285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
125295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
125305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
125315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
125325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
125335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
125345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
125355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
125365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
125375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
125385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38>
125395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray38 {
125405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
125415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
125425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
125435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
125445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
125455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
125465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
125475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
125485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
125495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
125505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
125515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
125525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
125535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
125545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
125555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
125565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
125575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
125585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
125595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
125605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
125615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
125625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
125635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
125645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
125655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
125665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
125675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
125685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
125695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
125705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
125715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
125725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
125735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray38& other);
125745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
125755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
125765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
125775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
125785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
125795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
125805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
125815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
125825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
125835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
125845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
125855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
125865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
125875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
125885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
125895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
125905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
125915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
125925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
125935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
125945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
125955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
125965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
125975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
125985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
125995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
126005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
126015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
126025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
126035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
126045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
126055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
126065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
126075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
126085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
126095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
126105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
126115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
126125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
126135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
126145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
126155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
126165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
126175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
126185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
126195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
126205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
126215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
126225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39>
126235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray39 {
126245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
126255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
126265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
126275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
126285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
126295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
126305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
126315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
126325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
126335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
126345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
126355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
126365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
126375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
126385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
126395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
126405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
126415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
126425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
126435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
126445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
126455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
126465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
126475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
126485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
126495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
126505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
126515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
126525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_)};
126535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
126545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
126555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
126565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
126575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
126585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray39& other);
126595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
126605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
126615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
126625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
126635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
126645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
126655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
126665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
126675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
126685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
126695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
126705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
126715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
126725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
126735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
126745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
126755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
126765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
126775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
126785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
126795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
126805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
126815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
126825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
126835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
126845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
126855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
126865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
126875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
126885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
126895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
126905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
126915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
126925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
126935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
126945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
126955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
126965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
126975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
126985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
126995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
127005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
127015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
127025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
127035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
127045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
127055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
127065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
127075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
127085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40>
127095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray40 {
127105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
127115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
127125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
127135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
127145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
127155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
127165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
127175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
127185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
127195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
127205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
127215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
127225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v40_(v40) {}
127235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
127245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
127255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
127265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
127275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
127285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
127295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
127305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
127315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
127325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
127335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
127345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
127355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
127365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
127375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
127385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
127395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_)};
127405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
127415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
127425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
127435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
127445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
127455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray40& other);
127465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
127475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
127485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
127495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
127505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
127515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
127525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
127535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
127545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
127555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
127565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
127575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
127585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
127595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
127605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
127615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
127625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
127635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
127645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
127655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
127665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
127675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
127685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
127695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
127705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
127715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
127725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
127735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
127745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
127755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
127765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
127775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
127785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
127795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
127805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
127815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
127825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
127835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
127845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
127855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
127865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
127875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
127885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
127895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
127905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
127915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
127925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
127935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
127945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
127955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
127965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
127975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41>
127985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray41 {
127995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
128005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
128015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
128025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
128035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
128045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
128055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
128065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
128075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
128085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
128095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
128105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
128115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v39_(v39), v40_(v40), v41_(v41) {}
128125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
128135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
128145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
128155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
128165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
128175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
128185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
128195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
128205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
128215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
128225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
128235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
128245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
128255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
128265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
128275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
128285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
128295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
128305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
128315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
128325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
128335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
128345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray41& other);
128355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
128365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
128375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
128385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
128395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
128405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
128415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
128425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
128435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
128445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
128455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
128465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
128475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
128485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
128495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
128505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
128515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
128525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
128535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
128545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
128555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
128565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
128575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
128585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
128595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
128605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
128615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
128625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
128635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
128645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
128655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
128665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
128675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
128685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
128695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
128705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
128715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
128725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
128735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
128745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
128755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
128765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
128775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
128785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
128795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
128805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
128815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
128825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
128835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
128845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
128855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
128865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
128875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42>
128885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray42 {
128895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
128905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
128915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
128925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
128935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
128945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
128955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
128965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
128975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
128985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
128995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
129005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
129015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
129025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
129035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
129045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
129055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
129065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
129075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
129085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
129095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
129105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
129115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
129125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
129135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
129145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
129155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
129165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
129175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
129185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
129195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_)};
129205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
129215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
129225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
129235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
129245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
129255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray42& other);
129265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
129275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
129285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
129295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
129305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
129315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
129325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
129335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
129345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
129355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
129365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
129375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
129385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
129395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
129405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
129415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
129425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
129435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
129445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
129455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
129465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
129475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
129485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
129495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
129505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
129515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
129525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
129535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
129545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
129555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
129565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
129575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
129585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
129595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
129605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
129615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
129625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
129635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
129645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
129655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
129665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
129675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
129685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
129695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
129705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
129715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
129725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
129735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
129745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
129755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
129765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
129775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
129785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
129795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43>
129805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray43 {
129815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
129825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
129835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
129845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
129855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
129865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
129875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
129885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
129895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
129905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
129915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
129925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
129935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
129945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
129955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
129965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
129975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
129985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
129995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
130005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
130015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
130025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
130035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
130045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
130055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
130065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
130075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
130085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
130095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
130105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
130115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_)};
130125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
130135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
130145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
130155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
130165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
130175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray43& other);
130185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
130195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
130205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
130215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
130225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
130235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
130245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
130255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
130265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
130275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
130285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
130295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
130305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
130315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
130325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
130335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
130345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
130355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
130365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
130375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
130385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
130395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
130405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
130415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
130425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
130435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
130445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
130455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
130465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
130475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
130485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
130495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
130505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
130515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
130525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
130535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
130545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
130555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
130565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
130575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
130585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
130595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
130605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
130615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
130625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
130635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
130645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
130655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
130665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
130675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
130685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
130695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
130705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
130715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
130725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44>
130735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray44 {
130745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
130755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
130765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
130775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
130785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
130795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
130805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
130815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
130825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
130835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
130845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
130855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
130865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
130875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v43_(v43), v44_(v44) {}
130885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
130895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
130905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
130915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
130925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
130935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
130945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
130955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
130965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
130975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
130985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
130995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
131005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
131015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
131025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
131035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
131045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
131055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
131065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
131075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
131085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
131095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
131105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
131115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray44& other);
131125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
131135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
131145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
131155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
131165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
131175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
131185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
131195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
131205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
131215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
131225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
131235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
131245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
131255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
131265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
131275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
131285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
131295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
131305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
131315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
131325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
131335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
131345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
131355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
131365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
131375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
131385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
131395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
131405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
131415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
131425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
131435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
131445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
131455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
131465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
131475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
131485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
131495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
131505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
131515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
131525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
131535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
131545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
131555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
131565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
131575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
131585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
131595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
131605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
131615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
131625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
131635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
131645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
131655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
131665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
131675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45>
131685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray45 {
131695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
131705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
131715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
131725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
131735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
131745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
131755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
131765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
131775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
131785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
131795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
131805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
131815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
131825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
131835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
131845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
131855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
131865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
131875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
131885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
131895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
131905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
131915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
131925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
131935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
131945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
131955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
131965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
131975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
131985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
131995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
132005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
132015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v45_)};
132025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
132035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
132045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
132055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
132065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
132075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray45& other);
132085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
132095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
132105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
132115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
132125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
132135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
132145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
132155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
132165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
132175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
132185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
132195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
132205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
132215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
132225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
132235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
132245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
132255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
132265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
132275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
132285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
132295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
132305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
132315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
132325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
132335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
132345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
132355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
132365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
132375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
132385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
132395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
132405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
132415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
132425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
132435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
132445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
132455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
132465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
132475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
132485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
132495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
132505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
132515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
132525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
132535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T45 v45_;
132545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
132555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
132565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
132575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
132585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
132595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
132605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
132615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
132625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
132635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
132645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
132655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46>
132665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray46 {
132675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
132685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
132695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
132705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
132715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
132725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
132735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
132745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
132755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
132765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
132775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
132785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
132795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
132805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
132815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
132825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
132835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
132845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
132855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
132865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
132875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
132885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
132895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
132905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
132915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
132925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
132935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
132945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
132955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
132965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
132975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
132985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
132995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v45_), static_cast<T>(v46_)};
133005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
133015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
133025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
133035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
133045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
133055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray46& other);
133065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
133075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
133085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
133095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
133105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
133115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
133125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
133135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
133145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
133155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
133165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
133175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
133185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
133195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
133205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
133215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
133225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
133235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
133245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
133255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
133265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
133275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
133285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
133295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
133305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
133315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
133325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
133335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
133345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
133355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
133365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
133375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
133385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
133395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
133405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
133415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
133425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
133435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
133445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
133455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
133465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
133475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
133485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
133495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
133505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
133515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T45 v45_;
133525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T46 v46_;
133535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
133545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
133555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
133565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
133575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
133585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
133595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
133605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
133615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
133625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
133635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
133645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47>
133655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray47 {
133665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
133675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
133685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
133695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
133705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
133715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
133725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
133735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
133745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
133755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
133765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
133775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
133785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
133795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
133805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v47_(v47) {}
133815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
133825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
133835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
133845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
133855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
133865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
133875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
133885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
133895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
133905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
133915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
133925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
133935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
133945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
133955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
133965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
133975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
133985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
133995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
134005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
134015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
134025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
134035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
134045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
134055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray47& other);
134065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
134075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
134085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
134095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
134105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
134115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
134125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
134135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
134145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
134155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
134165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
134175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
134185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
134195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
134205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
134215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
134225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
134235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
134245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
134255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
134265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
134275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
134285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
134295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
134305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
134315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
134325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
134335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
134345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
134355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
134365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
134375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
134385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
134395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
134405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
134415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
134425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
134435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
134445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
134455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
134465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
134475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
134485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
134495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
134505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
134515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T45 v45_;
134525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T46 v46_;
134535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T47 v47_;
134545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
134555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
134565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
134575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
134585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
134595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
134605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
134615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
134625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
134635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
134645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
134655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48>
134665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray48 {
134675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
134685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
134695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
134705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
134715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
134725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
134735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
134745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
134755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
134765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
134775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
134785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
134795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
134805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
134815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v46_(v46), v47_(v47), v48_(v48) {}
134825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
134835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
134845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
134855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
134865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
134875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
134885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
134895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
134905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
134915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
134925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
134935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
134945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
134955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
134965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
134975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
134985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
134995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
135005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
135015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v48_)};
135025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
135035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
135045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
135055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
135065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
135075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray48& other);
135085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
135095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
135105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
135115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
135125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
135135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
135145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
135155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
135165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
135175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
135185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
135195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
135205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
135215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
135225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
135235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
135245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
135255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
135265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
135275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
135285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
135295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
135305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
135315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
135325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
135335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
135345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
135355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
135365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
135375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
135385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
135395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
135405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
135415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
135425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
135435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
135445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
135455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
135465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
135475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
135485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
135495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
135505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
135515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
135525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
135535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T45 v45_;
135545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T46 v46_;
135555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T47 v47_;
135565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T48 v48_;
135575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
135585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
135595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
135605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
135615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
135625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
135635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
135645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
135655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
135665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
135675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
135685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49>
135695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray49 {
135705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
135715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
135725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
135735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
135745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
135755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
135765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
135775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
135785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
135795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
135805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
135815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
135825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
135835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
135845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
135855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
135865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
135875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
135885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
135895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
135905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
135915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
135925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
135935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
135945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
135955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
135965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
135975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
135985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
135995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
136005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
136015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
136025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
136035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
136045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v48_), static_cast<T>(v49_)};
136055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
136065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
136075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
136085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
136095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
136105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray49& other);
136115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
136125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
136135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
136145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
136155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
136165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
136175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
136185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
136195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
136205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
136215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
136225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
136235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
136245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
136255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
136265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
136275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
136285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
136295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
136305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
136315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
136325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
136335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
136345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
136355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
136365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
136375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
136385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
136395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
136405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
136415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
136425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
136435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
136445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
136455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
136465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
136475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
136485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
136495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
136505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
136515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
136525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
136535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
136545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
136555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
136565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T45 v45_;
136575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T46 v46_;
136585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T47 v47_;
136595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T48 v48_;
136605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T49 v49_;
136615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
136625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
136635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
136645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
136655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
136665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
136675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
136685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
136695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
136705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
136715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
136725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49, typename T50>
136735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ValueArray50 {
136745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
136755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
136765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
136775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
136785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
136795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
136805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
136815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
136825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
136835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
136845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
136855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
136865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
136875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
136885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
136895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
136905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T>
136915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator<T>() const {
136925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
136935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
136945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
136955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
136965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
136975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
136985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
136995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
137005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
137015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
137025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
137035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
137045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
137055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
137065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
137075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
137085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
137095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ValuesIn(array);
137105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
137115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
137135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
137145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const ValueArray50& other);
137155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T1 v1_;
137175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T2 v2_;
137185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T3 v3_;
137195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T4 v4_;
137205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T5 v5_;
137215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T6 v6_;
137225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T7 v7_;
137235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T8 v8_;
137245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T9 v9_;
137255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T10 v10_;
137265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T11 v11_;
137275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T12 v12_;
137285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T13 v13_;
137295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T14 v14_;
137305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T15 v15_;
137315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T16 v16_;
137325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T17 v17_;
137335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T18 v18_;
137345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T19 v19_;
137355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T20 v20_;
137365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T21 v21_;
137375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T22 v22_;
137385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T23 v23_;
137395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T24 v24_;
137405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T25 v25_;
137415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T26 v26_;
137425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T27 v27_;
137435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T28 v28_;
137445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T29 v29_;
137455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T30 v30_;
137465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T31 v31_;
137475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T32 v32_;
137485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T33 v33_;
137495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T34 v34_;
137505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T35 v35_;
137515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T36 v36_;
137525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T37 v37_;
137535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T38 v38_;
137545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T39 v39_;
137555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T40 v40_;
137565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T41 v41_;
137575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T42 v42_;
137585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T43 v43_;
137595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T44 v44_;
137605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T45 v45_;
137615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T46 v46_;
137625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T47 v47_;
137635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T48 v48_;
137645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T49 v49_;
137655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const T50 v50_;
137665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
137675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_HAS_COMBINE
137695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
137705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
137715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates values from the Cartesian product of values produced
137725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by the argument generators.
137735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
137745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
137755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator2
137765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
137775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
137785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2> ParamType;
137795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
137815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2)
137825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2) {}
137835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator2() {}
137845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
137865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
137875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
137885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
137895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
137905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
137915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
137935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
137945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
137955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
137965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
137975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
137985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
137995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2)
138005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
138015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
138025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
138035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
138045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
138065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
138085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
138095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
138115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
138125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
138135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
138145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current2_;
138155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
138165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
138175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
138185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
138195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
138205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
138225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
138235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
138255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
138265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
138275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
138285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
138295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
138305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
138315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
138325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
138335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
138345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
138355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
138365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
138375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
138385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
138395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_);
138405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
138435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
138445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
138455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
138465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
138475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
138485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
138495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
138505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_) {
138515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
138525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
138555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
138565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_);
138575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
138595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
138605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
138615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
138625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
138635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_;
138645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
138655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
138675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
138685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
138705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
138715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
138725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
138735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
138745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
138755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
138765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
138775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
138785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
138795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator2::Iterator
138805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
138825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator2& other);
138835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
138855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
138865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator2
138875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3>
138905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator3
138915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
138925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
138935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
138945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
138965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
138975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3) {}
138985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator3() {}
138995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
139015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
139025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin());
139035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
139045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
139055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
139065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
139075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
139095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
139105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
139115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
139125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
139135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
139145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
139155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
139165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
139175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3)
139185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
139195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
139205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
139215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
139225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
139235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
139255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
139275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
139285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
139305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
139315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
139325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
139335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current3_;
139345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
139355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
139365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
139375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
139385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
139395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
139405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
139415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
139425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
139435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
139455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
139465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
139485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
139495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
139505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
139515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
139525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
139535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
139545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
139555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
139565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
139575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
139585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
139595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
139605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
139615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
139625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
139635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_);
139645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
139675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
139685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
139695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
139705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
139715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
139725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
139735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
139745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
139755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
139765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
139775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_) {
139785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
139795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
139825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
139835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_);
139845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
139865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
139875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
139885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
139895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
139905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
139915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_;
139925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
139935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
139955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
139965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
139975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
139985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
139995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
140005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
140015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
140025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
140035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
140045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
140055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
140065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
140075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
140085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
140095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
140105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator3::Iterator
140115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
140135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator3& other);
140145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
140165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
140175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
140185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator3
140195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4>
140225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator4
140235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
140245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
140255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
140265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
140285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
140295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4)
140305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
140315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator4() {}
140325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
140345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
140355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin());
140365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
140375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
140385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
140395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end());
140405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
140415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
140435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
140445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
140455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
140465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
140475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
140485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
140495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
140505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
140515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
140525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
140535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4)
140545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
140555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
140565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
140575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
140585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
140595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
140605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
140615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
140625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
140635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
140645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
140655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
140665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
140675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
140685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
140695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
140705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current4_;
140715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
140725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
140735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
140745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
140755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
140765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
140775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
140785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
140795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
140805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
140815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
140825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
140835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
140845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
140855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
140865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
140875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
140885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
140895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
140905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
140915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
140925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
140935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
140945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
140955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
140965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
140975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
140985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
140995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
141005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
141015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
141025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
141035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
141045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
141055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_);
141065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
141075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
141095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
141105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
141115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
141125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
141135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
141145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
141155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
141165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
141175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
141185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
141195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
141205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
141215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
141225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_) {
141235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
141245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
141255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
141275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
141285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
141295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_);
141305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
141315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
141325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
141335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
141345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
141355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
141365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
141375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
141385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_;
141395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
141405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
141425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
141435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
141455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
141465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
141475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
141485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
141495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
141505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
141515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
141525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
141535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
141545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
141555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
141565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
141575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
141585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
141595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
141605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator4::Iterator
141615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
141635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator4& other);
141645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
141665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
141675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
141685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
141695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator4
141705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
141735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator5
141745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
141755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
141765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
141775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
141795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
141805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
141815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
141825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator5() {}
141835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
141855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
141865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
141875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
141885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
141895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
141905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end(), g5_, g5_.end());
141915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
141925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
141935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
141945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
141955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
141965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
141975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
141985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
141995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
142005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
142015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
142025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
142035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
142045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4,
142055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T5>& g5,
142065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T5>::iterator& current5)
142075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
142085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
142095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
142105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
142115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
142125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
142135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
142145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
142165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
142175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
142185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
142195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
142215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
142225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
142235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
142245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current5_;
142255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current5_ == end5_) {
142265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_ = begin5_;
142275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current4_;
142285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
142295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
142305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
142315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
142325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
142335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
142345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
142355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
142365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
142375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
142385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
142395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
142405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
142415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
142425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
142445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
142455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
142475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
142485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
142495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
142505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
142515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
142525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
142535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
142545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
142555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
142565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
142575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
142585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
142595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
142605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
142615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
142625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
142635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_ &&
142645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == typed_other->current5_);
142655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
142675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
142685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
142695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
142705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
142715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
142725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
142735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
142745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
142755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
142765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
142775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
142785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
142795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
142805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
142815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_),
142825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin5_(other.begin5_),
142835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end5_(other.end5_),
142845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_(other.current5_) {
142855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
142865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
142885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
142895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
142905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
142915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_, *current5_);
142925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
142935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
142945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
142955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
142965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
142975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
142985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
142995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
143005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_ ||
143015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == end5_;
143025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
143035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
143055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
143065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
143085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
143095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
143105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
143115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
143125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
143135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
143145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
143155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
143165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
143175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
143185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
143195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
143205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
143215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
143225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator begin5_;
143235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator end5_;
143245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T5>::iterator current5_;
143255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
143265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator5::Iterator
143275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
143295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator5& other);
143305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
143325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
143335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
143345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
143355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T5> g5_;
143365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator5
143375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
143405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6>
143415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator6
143425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
143435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T6> > {
143445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
143455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
143465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
143485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
143495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
143505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6)
143515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
143525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator6() {}
143535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
143555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
143565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
143575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
143585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
143595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
143605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
143615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
143625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
143645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
143655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
143665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
143675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
143685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
143695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
143705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
143715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
143725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
143735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
143745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4,
143755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T5>& g5,
143765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T5>::iterator& current5,
143775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6,
143785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T6>::iterator& current6)
143795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
143805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
143815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
143825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
143835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
143845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
143855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
143865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
143875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
143885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
143895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
143905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
143915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
143925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
143935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
143945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
143955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
143965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
143975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current6_;
143985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current6_ == end6_) {
143995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_ = begin6_;
144005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current5_;
144015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
144025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current5_ == end5_) {
144035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_ = begin5_;
144045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current4_;
144055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
144065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
144075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
144085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
144095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
144105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
144115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
144125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
144135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
144145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
144155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
144165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
144175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
144185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
144195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
144205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
144215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
144225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
144235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
144245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
144255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
144265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
144275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
144285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
144295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
144305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
144315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
144325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
144335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
144345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
144355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
144365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
144375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
144385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
144395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
144405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_ &&
144415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == typed_other->current5_ &&
144425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == typed_other->current6_);
144435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
144445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
144455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
144465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
144475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
144485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
144495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
144505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
144515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
144525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
144535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
144545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
144555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
144565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
144575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
144585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
144595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_),
144605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin5_(other.begin5_),
144615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end5_(other.end5_),
144625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_(other.current5_),
144635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin6_(other.begin6_),
144645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end6_(other.end6_),
144655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_(other.current6_) {
144665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
144675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
144685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
144695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
144705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
144715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
144725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_, *current5_, *current6_);
144735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
144745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
144755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
144765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
144775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
144785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
144795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
144805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
144815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_ ||
144825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == end5_ ||
144835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == end6_;
144845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
144855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
144865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
144875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
144885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
144895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
144905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
144915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
144925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
144935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
144945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
144955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
144965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
144975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
144985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
144995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
145005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
145015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
145025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
145035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
145045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator begin5_;
145055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator end5_;
145065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T5>::iterator current5_;
145075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator begin6_;
145085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator end6_;
145095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T6>::iterator current6_;
145105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
145115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator6::Iterator
145125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
145145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator6& other);
145155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
145175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
145185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
145195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
145205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T5> g5_;
145215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T6> g6_;
145225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator6
145235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
145265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7>
145275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator7
145285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
145295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T7> > {
145305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
145315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
145325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
145345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
145355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
145365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
145375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
145385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator7() {}
145395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
145415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
145425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
145435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g7_.begin());
145445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
145455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
145465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
145475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
145485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
145495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
145515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
145525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
145535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
145545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
145555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
145565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
145575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
145585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
145595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
145605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
145615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4,
145625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T5>& g5,
145635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T5>::iterator& current5,
145645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6,
145655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T6>::iterator& current6,
145665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T7>& g7,
145675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T7>::iterator& current7)
145685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
145695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
145705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
145715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
145725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
145735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
145745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
145755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
145765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
145775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
145785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
145795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
145805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
145815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
145825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
145835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
145845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
145855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
145865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
145875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current7_;
145885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current7_ == end7_) {
145895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_ = begin7_;
145905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current6_;
145915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
145925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current6_ == end6_) {
145935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_ = begin6_;
145945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current5_;
145955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
145965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current5_ == end5_) {
145975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_ = begin5_;
145985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current4_;
145995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
146005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
146015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
146025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
146035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
146045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
146055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
146065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
146075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
146085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
146095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
146105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
146115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
146125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
146135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
146145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
146155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
146165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
146175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
146185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
146195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
146205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
146215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
146225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
146235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
146245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
146255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
146265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
146275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
146285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
146295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
146305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
146315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
146325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
146335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
146345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_ &&
146355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == typed_other->current5_ &&
146365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == typed_other->current6_ &&
146375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == typed_other->current7_);
146385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
146395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
146405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
146415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
146425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
146435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
146445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
146455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
146465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
146475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
146485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
146495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
146505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
146515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
146525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
146535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
146545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_),
146555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin5_(other.begin5_),
146565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end5_(other.end5_),
146575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_(other.current5_),
146585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin6_(other.begin6_),
146595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end6_(other.end6_),
146605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_(other.current6_),
146615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin7_(other.begin7_),
146625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end7_(other.end7_),
146635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_(other.current7_) {
146645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
146655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
146665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
146675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
146685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
146695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
146705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_, *current5_, *current6_, *current7_);
146715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
146725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
146735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
146745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
146755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
146765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
146775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
146785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
146795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_ ||
146805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == end5_ ||
146815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == end6_ ||
146825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == end7_;
146835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
146845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
146855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
146865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
146875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
146885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
146895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
146905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
146915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
146925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
146935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
146945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
146955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
146965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
146975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
146985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
146995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
147005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
147015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
147025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
147035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator begin5_;
147045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator end5_;
147055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T5>::iterator current5_;
147065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator begin6_;
147075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator end6_;
147085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T6>::iterator current6_;
147095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator begin7_;
147105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator end7_;
147115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T7>::iterator current7_;
147125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
147135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator7::Iterator
147145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
147165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator7& other);
147175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
147195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
147205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
147215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
147225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T5> g5_;
147235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T6> g6_;
147245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T7> g7_;
147255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator7
147265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
147295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8>
147305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator8
147315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
147325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T7, T8> > {
147335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
147345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
147355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
147375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
147385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
147395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
147405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T8>& g8)
147415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
147425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          g8_(g8) {}
147435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator8() {}
147445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
147465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
147475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
147485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g7_.begin(), g8_, g8_.begin());
147495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
147505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
147515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
147525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
147535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g8_.end());
147545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
147555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
147575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
147585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
147595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
147605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
147615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
147625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
147635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
147645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
147655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
147665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
147675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4,
147685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T5>& g5,
147695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T5>::iterator& current5,
147705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6,
147715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T6>::iterator& current6,
147725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T7>& g7,
147735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T7>::iterator& current7,
147745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T8>& g8,
147755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T8>::iterator& current8)
147765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
147775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
147785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
147795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
147805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
147815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
147825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
147835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
147845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
147855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
147865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
147875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
147885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
147895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
147905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
147915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
147925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
147935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
147945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
147955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
147965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current8_;
147975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current8_ == end8_) {
147985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current8_ = begin8_;
147995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current7_;
148005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current7_ == end7_) {
148025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_ = begin7_;
148035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current6_;
148045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current6_ == end6_) {
148065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_ = begin6_;
148075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current5_;
148085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current5_ == end5_) {
148105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_ = begin5_;
148115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current4_;
148125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
148145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
148155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
148165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
148185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
148195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
148205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
148225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
148235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
148245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
148255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
148265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
148275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
148285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
148295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
148305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
148315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
148325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
148335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
148345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
148355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
148365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
148375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
148385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
148395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
148405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
148415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
148425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
148435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
148445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
148455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
148465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
148475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_ &&
148485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == typed_other->current5_ &&
148495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == typed_other->current6_ &&
148505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == typed_other->current7_ &&
148515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current8_ == typed_other->current8_);
148525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
148535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
148545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
148555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
148565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
148575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
148585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
148595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
148605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
148615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
148625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
148635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
148645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
148655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
148665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
148675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
148685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_),
148695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin5_(other.begin5_),
148705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end5_(other.end5_),
148715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_(other.current5_),
148725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin6_(other.begin6_),
148735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end6_(other.end6_),
148745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_(other.current6_),
148755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin7_(other.begin7_),
148765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end7_(other.end7_),
148775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_(other.current7_),
148785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin8_(other.begin8_),
148795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end8_(other.end8_),
148805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current8_(other.current8_) {
148815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
148825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
148835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
148845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
148855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
148865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
148875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_, *current5_, *current6_, *current7_, *current8_);
148885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
148895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
148905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
148915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
148925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
148935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
148945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
148955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
148965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_ ||
148975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == end5_ ||
148985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == end6_ ||
148995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == end7_ ||
149005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current8_ == end8_;
149015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
149025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
149045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
149055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
149075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
149085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
149095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
149105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
149115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
149125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
149135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
149145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
149155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
149165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
149175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
149185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
149195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
149205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
149215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator begin5_;
149225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator end5_;
149235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T5>::iterator current5_;
149245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator begin6_;
149255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator end6_;
149265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T6>::iterator current6_;
149275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator begin7_;
149285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator end7_;
149295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T7>::iterator current7_;
149305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T8>::iterator begin8_;
149315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T8>::iterator end8_;
149325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T8>::iterator current8_;
149335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
149345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator8::Iterator
149355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
149375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator8& other);
149385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
149405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
149415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
149425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
149435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T5> g5_;
149445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T6> g6_;
149455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T7> g7_;
149465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T8> g8_;
149475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator8
149485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
149515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9>
149525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator9
149535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
149545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T7, T8, T9> > {
149555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
149565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
149575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
149595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
149605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
149615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
149625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
149635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
149645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          g9_(g9) {}
149655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator9() {}
149665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
149685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
149695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
149705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
149715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
149725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
149735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
149745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
149755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g8_.end(), g9_, g9_.end());
149765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
149775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
149785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
149795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
149805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
149815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
149825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
149835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
149845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
149855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
149865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
149875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
149885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
149895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4,
149905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T5>& g5,
149915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T5>::iterator& current5,
149925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6,
149935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T6>::iterator& current6,
149945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T7>& g7,
149955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T7>::iterator& current7,
149965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T8>& g8,
149975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T8>::iterator& current8,
149985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T9>& g9,
149995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T9>::iterator& current9)
150005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
150015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
150025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
150035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
150045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
150055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
150065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
150075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
150085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
150095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
150105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
150115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
150125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
150135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
150145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
150155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
150165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
150175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
150185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
150195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
150205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
150215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current9_;
150225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current9_ == end9_) {
150235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current9_ = begin9_;
150245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current8_;
150255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current8_ == end8_) {
150275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current8_ = begin8_;
150285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current7_;
150295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current7_ == end7_) {
150315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_ = begin7_;
150325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current6_;
150335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current6_ == end6_) {
150355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_ = begin6_;
150365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current5_;
150375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current5_ == end5_) {
150395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_ = begin5_;
150405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current4_;
150415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
150435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
150445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
150455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
150475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
150485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
150495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
150515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
150525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
150535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
150545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
150555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
150565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
150575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
150585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
150595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
150605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
150615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
150625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
150635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
150645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
150655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
150665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
150675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
150685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
150695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
150705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
150715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
150725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
150735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
150745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
150755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
150765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_ &&
150775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == typed_other->current5_ &&
150785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == typed_other->current6_ &&
150795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == typed_other->current7_ &&
150805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current8_ == typed_other->current8_ &&
150815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current9_ == typed_other->current9_);
150825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
150835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
150845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
150855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
150865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
150875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
150885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
150895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
150905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
150915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
150925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
150935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
150945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
150955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
150965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
150975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
150985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_),
150995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin5_(other.begin5_),
151005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end5_(other.end5_),
151015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_(other.current5_),
151025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin6_(other.begin6_),
151035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end6_(other.end6_),
151045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_(other.current6_),
151055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin7_(other.begin7_),
151065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end7_(other.end7_),
151075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_(other.current7_),
151085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin8_(other.begin8_),
151095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end8_(other.end8_),
151105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current8_(other.current8_),
151115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin9_(other.begin9_),
151125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end9_(other.end9_),
151135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current9_(other.current9_) {
151145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
151155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
151165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
151185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
151195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
151205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_, *current5_, *current6_, *current7_, *current8_,
151215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current9_);
151225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
151235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
151245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
151255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
151265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
151275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
151285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
151295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
151305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_ ||
151315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == end5_ ||
151325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == end6_ ||
151335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == end7_ ||
151345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current8_ == end8_ ||
151355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current9_ == end9_;
151365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
151375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
151395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
151405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
151425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
151435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
151445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
151455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
151465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
151475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
151485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
151495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
151505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
151515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
151525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
151535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
151545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
151555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
151565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator begin5_;
151575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator end5_;
151585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T5>::iterator current5_;
151595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator begin6_;
151605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator end6_;
151615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T6>::iterator current6_;
151625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator begin7_;
151635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator end7_;
151645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T7>::iterator current7_;
151655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T8>::iterator begin8_;
151665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T8>::iterator end8_;
151675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T8>::iterator current8_;
151685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T9>::iterator begin9_;
151695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T9>::iterator end9_;
151705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T9>::iterator current9_;
151715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
151725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator9::Iterator
151735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
151755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator9& other);
151765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
151785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
151795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
151805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
151815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T5> g5_;
151825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T6> g6_;
151835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T7> g7_;
151845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T8> g8_;
151855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T9> g9_;
151865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator9
151875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
151905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10>
151915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductGenerator10
151925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
151935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T7, T8, T9, T10> > {
151945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
151955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
151965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
151975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
151985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
151995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
152005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
152015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
152025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T10>& g10)
152035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
152045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          g9_(g9), g10_(g10) {}
152055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~CartesianProductGenerator10() {}
152065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
152075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* Begin() const {
152085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
152095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
152105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
152115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
152125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ParamIteratorInterface<ParamType>* End() const {
152135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
152145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
152155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
152165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
152175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
152185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
152195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class Iterator : public ParamIteratorInterface<ParamType> {
152205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
152215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const ParamGeneratorInterface<ParamType>* base,
152225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T1>& g1,
152235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T1>::iterator& current1,
152245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T2>& g2,
152255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T2>::iterator& current2,
152265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T3>& g3,
152275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T3>::iterator& current3,
152285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T4>& g4,
152295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T4>::iterator& current4,
152305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T5>& g5,
152315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T5>::iterator& current5,
152325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T6>& g6,
152335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T6>::iterator& current6,
152345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T7>& g7,
152355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T7>::iterator& current7,
152365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T8>& g8,
152375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T8>::iterator& current8,
152385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T9>& g9,
152395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T9>::iterator& current9,
152405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const ParamGenerator<T10>& g10,
152415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const typename ParamGenerator<T10>::iterator& current10)
152425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(base),
152435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
152445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
152455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
152465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
152475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
152485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
152495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
152505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
152515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
152525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
152535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
152545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
152555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~Iterator() {}
152565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
152575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
152585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return base_;
152595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
152605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Advance should not be called on beyond-of-range iterators
152615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // so no component iterators must be beyond end of range, either.
152625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Advance() {
152635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      assert(!AtEnd());
152645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++current10_;
152655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current10_ == end10_) {
152665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current10_ = begin10_;
152675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current9_;
152685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current9_ == end9_) {
152705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current9_ = begin9_;
152715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current8_;
152725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current8_ == end8_) {
152745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current8_ = begin8_;
152755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current7_;
152765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current7_ == end7_) {
152785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_ = begin7_;
152795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current6_;
152805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current6_ == end6_) {
152825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_ = begin6_;
152835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current5_;
152845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current5_ == end5_) {
152865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_ = begin5_;
152875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current4_;
152885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current4_ == end4_) {
152905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_ = begin4_;
152915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current3_;
152925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current3_ == end3_) {
152945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_ = begin3_;
152955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current2_;
152965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
152975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (current2_ == end2_) {
152985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_ = begin2_;
152995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++current1_;
153005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
153015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
153025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
153035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ParamIteratorInterface<ParamType>* Clone() const {
153045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return new Iterator(*this);
153055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
153065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual const ParamType* Current() const { return &current_value_; }
153075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
153085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Having the same base generator guarantees that the other
153095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // iterator is of the same type and we can downcast.
153105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
153115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "The program attempted to compare iterators "
153125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "from different generators." << std::endl;
153135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const Iterator* typed_other =
153145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CheckedDowncastToActualType<const Iterator>(&other);
153155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterators equal if they both point beyond their
153165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // respective ranges. That can happen in a variety of fashions,
153175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // so we have to consult AtEnd().
153185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (AtEnd() && typed_other->AtEnd()) ||
153195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (
153205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == typed_other->current1_ &&
153215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == typed_other->current2_ &&
153225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == typed_other->current3_ &&
153235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == typed_other->current4_ &&
153245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == typed_other->current5_ &&
153255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == typed_other->current6_ &&
153265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == typed_other->current7_ &&
153275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current8_ == typed_other->current8_ &&
153285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current9_ == typed_other->current9_ &&
153295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current10_ == typed_other->current10_);
153305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
153315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
153325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
153335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Iterator(const Iterator& other)
153345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : base_(other.base_),
153355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin1_(other.begin1_),
153365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end1_(other.end1_),
153375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current1_(other.current1_),
153385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin2_(other.begin2_),
153395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end2_(other.end2_),
153405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current2_(other.current2_),
153415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin3_(other.begin3_),
153425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end3_(other.end3_),
153435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current3_(other.current3_),
153445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin4_(other.begin4_),
153455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end4_(other.end4_),
153465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current4_(other.current4_),
153475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin5_(other.begin5_),
153485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end5_(other.end5_),
153495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current5_(other.current5_),
153505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin6_(other.begin6_),
153515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end6_(other.end6_),
153525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current6_(other.current6_),
153535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin7_(other.begin7_),
153545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end7_(other.end7_),
153555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current7_(other.current7_),
153565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin8_(other.begin8_),
153575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end8_(other.end8_),
153585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current8_(other.current8_),
153595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin9_(other.begin9_),
153605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end9_(other.end9_),
153615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current9_(other.current9_),
153625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        begin10_(other.begin10_),
153635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        end10_(other.end10_),
153645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current10_(other.current10_) {
153655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ComputeCurrentValue();
153665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
153675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
153685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void ComputeCurrentValue() {
153695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!AtEnd())
153705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        current_value_ = ParamType(*current1_, *current2_, *current3_,
153715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current4_, *current5_, *current6_, *current7_, *current8_,
153725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            *current9_, *current10_);
153735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
153745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool AtEnd() const {
153755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We must report iterator past the end of the range when either of the
153765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // component iterators has reached the end of its range.
153775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return
153785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current1_ == end1_ ||
153795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current2_ == end2_ ||
153805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current3_ == end3_ ||
153815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current4_ == end4_ ||
153825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current5_ == end5_ ||
153835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current6_ == end6_ ||
153845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current7_ == end7_ ||
153855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current8_ == end8_ ||
153865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current9_ == end9_ ||
153875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          current10_ == end10_;
153885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
153895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
153905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No implementation - assignment is unsupported.
153915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void operator=(const Iterator& other);
153925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
153935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ParamGeneratorInterface<ParamType>* const base_;
153945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
153955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // current[i]_ is the actual traversing iterator.
153965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator begin1_;
153975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T1>::iterator end1_;
153985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T1>::iterator current1_;
153995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator begin2_;
154005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T2>::iterator end2_;
154015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T2>::iterator current2_;
154025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator begin3_;
154035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T3>::iterator end3_;
154045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T3>::iterator current3_;
154055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator begin4_;
154065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T4>::iterator end4_;
154075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T4>::iterator current4_;
154085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator begin5_;
154095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T5>::iterator end5_;
154105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T5>::iterator current5_;
154115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator begin6_;
154125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T6>::iterator end6_;
154135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T6>::iterator current6_;
154145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator begin7_;
154155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T7>::iterator end7_;
154165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T7>::iterator current7_;
154175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T8>::iterator begin8_;
154185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T8>::iterator end8_;
154195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T8>::iterator current8_;
154205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T9>::iterator begin9_;
154215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T9>::iterator end9_;
154225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T9>::iterator current9_;
154235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T10>::iterator begin10_;
154245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const typename ParamGenerator<T10>::iterator end10_;
154255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename ParamGenerator<T10>::iterator current10_;
154265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ParamType current_value_;
154275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class CartesianProductGenerator10::Iterator
154285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
154305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductGenerator10& other);
154315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T1> g1_;
154335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T2> g2_;
154345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T3> g3_;
154355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T4> g4_;
154365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T5> g5_;
154375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T6> g6_;
154385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T7> g7_;
154395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T8> g8_;
154405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T9> g9_;
154415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamGenerator<T10> g10_;
154425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductGenerator10
154435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
154465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
154475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper classes providing Combine() with polymorphic features. They allow
154485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
154495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// convertible to U.
154505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
154515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2>
154525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder2 {
154535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
154545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder2(const Generator1& g1, const Generator2& g2)
154555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2) {}
154565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2>
154575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
154585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
154595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator2<T1, T2>(
154605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
154615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_)));
154625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
154635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
154655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
154665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder2& other);
154675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
154695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
154705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder2
154715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3>
154735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder3 {
154745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
154755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder3(const Generator1& g1, const Generator2& g2,
154765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3)
154775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3) {}
154785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3>
154795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
154805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
154815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator3<T1, T2, T3>(
154825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
154835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
154845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_)));
154855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
154865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
154885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
154895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder3& other);
154905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
154925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
154935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
154945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder3
154955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
154965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
154975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4>
154985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder4 {
154995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
155005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder4(const Generator1& g1, const Generator2& g2,
155015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4)
155025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
155035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4>
155045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
155055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
155065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator4<T1, T2, T3, T4>(
155075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
155085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
155095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
155105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_)));
155115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
155125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
155145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
155155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder4& other);
155165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
155185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
155195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
155205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
155215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder4
155225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
155245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4, class Generator5>
155255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder5 {
155265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
155275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder5(const Generator1& g1, const Generator2& g2,
155285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4, const Generator5& g5)
155295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
155305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4, typename T5>
155315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
155325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
155335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
155345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
155355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
155365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
155375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_),
155385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T5> >(g5_)));
155395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
155405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
155425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
155435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder5& other);
155445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
155465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
155475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
155485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
155495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator5 g5_;
155505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder5
155515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
155535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4, class Generator5, class Generator6>
155545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder6 {
155555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
155565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder6(const Generator1& g1, const Generator2& g2,
155575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4, const Generator5& g5,
155585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator6& g6)
155595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
155605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4, typename T5,
155615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      typename T6>
155625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
155635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
155645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
155655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
155665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
155675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
155685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_),
155695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T5> >(g5_),
155705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T6> >(g6_)));
155715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
155725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
155745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
155755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder6& other);
155765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
155785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
155795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
155805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
155815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator5 g5_;
155825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator6 g6_;
155835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder6
155845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
155855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
155865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4, class Generator5, class Generator6, class Generator7>
155875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder7 {
155885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
155895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder7(const Generator1& g1, const Generator2& g2,
155905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4, const Generator5& g5,
155915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator6& g6, const Generator7& g7)
155925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
155935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4, typename T5,
155945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      typename T6, typename T7>
155955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
155965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T7> >() const {
155975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
155985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
155995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
156005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
156015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
156025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_),
156035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T5> >(g5_),
156045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T6> >(g6_),
156055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T7> >(g7_)));
156065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
156075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
156095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
156105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder7& other);
156115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
156135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
156145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
156155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
156165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator5 g5_;
156175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator6 g6_;
156185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator7 g7_;
156195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder7
156205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
156225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4, class Generator5, class Generator6, class Generator7,
156235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator8>
156245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder8 {
156255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
156265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder8(const Generator1& g1, const Generator2& g2,
156275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4, const Generator5& g5,
156285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator6& g6, const Generator7& g7, const Generator8& g8)
156295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
156305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          g8_(g8) {}
156315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4, typename T5,
156325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      typename T6, typename T7, typename T8>
156335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
156345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T8> >() const {
156355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
156365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
156375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
156385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
156395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
156405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_),
156415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T5> >(g5_),
156425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T6> >(g6_),
156435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T7> >(g7_),
156445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T8> >(g8_)));
156455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
156465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
156485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
156495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder8& other);
156505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
156525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
156535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
156545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
156555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator5 g5_;
156565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator6 g6_;
156575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator7 g7_;
156585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator8 g8_;
156595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder8
156605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
156625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4, class Generator5, class Generator6, class Generator7,
156635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator8, class Generator9>
156645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder9 {
156655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
156665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder9(const Generator1& g1, const Generator2& g2,
156675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4, const Generator5& g5,
156685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator6& g6, const Generator7& g7, const Generator8& g8,
156695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator9& g9)
156705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
156715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          g9_(g9) {}
156725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4, typename T5,
156735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      typename T6, typename T7, typename T8, typename T9>
156745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
156755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T9> >() const {
156765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
156775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T9> >(
156785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
156795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
156805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
156815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
156825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_),
156835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T5> >(g5_),
156845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T6> >(g6_),
156855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T7> >(g7_),
156865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T8> >(g8_),
156875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T9> >(g9_)));
156885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
156895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
156915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
156925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder9& other);
156935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
156945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
156955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
156965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
156975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
156985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator5 g5_;
156995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator6 g6_;
157005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator7 g7_;
157015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator8 g8_;
157025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator9 g9_;
157035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder9
157045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Generator1, class Generator2, class Generator3,
157065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator4, class Generator5, class Generator6, class Generator7,
157075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class Generator8, class Generator9, class Generator10>
157085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CartesianProductHolder10 {
157095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
157105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangCartesianProductHolder10(const Generator1& g1, const Generator2& g2,
157115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator3& g3, const Generator4& g4, const Generator5& g5,
157125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator6& g6, const Generator7& g7, const Generator8& g8,
157135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator9& g9, const Generator10& g10)
157145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
157155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          g9_(g9), g10_(g10) {}
157165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename T1, typename T2, typename T3, typename T4, typename T5,
157175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      typename T6, typename T7, typename T8, typename T9, typename T10>
157185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
157195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T9, T10> >() const {
157205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
157215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        T9, T10> >(
157225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
157235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            T10>(
157245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T1> >(g1_),
157255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T2> >(g2_),
157265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T3> >(g3_),
157275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T4> >(g4_),
157285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T5> >(g5_),
157295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T6> >(g6_),
157305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T7> >(g7_),
157315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T8> >(g8_),
157325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T9> >(g9_),
157335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<ParamGenerator<T10> >(g10_)));
157345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
157355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
157375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No implementation - assignment is unsupported.
157385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void operator=(const CartesianProductHolder10& other);
157395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator1 g1_;
157415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator2 g2_;
157425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator3 g3_;
157435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator4 g4_;
157445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator5 g5_;
157455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator6 g6_;
157465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator7 g7_;
157475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator8 g8_;
157485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator9 g9_;
157495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Generator10 g10_;
157505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class CartesianProductHolder10
157515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_HAS_COMBINE
157535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
157555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
157565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  //  GTEST_HAS_PARAM_TEST
157585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
157605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
157625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
157645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Functions producing parameter generators.
157665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
157675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test uses these generators to produce parameters for value-
157685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameterized tests. When a parameterized test case is instantiated
157695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with a particular generator, Google Test creates and runs tests
157705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for each element in the sequence produced by the generator.
157715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
157725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In the following sample, tests from test case FooTest are instantiated
157735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each three times with parameter values 3, 5, and 8:
157745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
157755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class FooTest : public TestWithParam<int> { ... };
157765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
157775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST_P(FooTest, TestThis) {
157785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
157795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST_P(FooTest, TestThat) {
157805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
157815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
157825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
157835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
157845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Range() returns generators providing sequences of values in a range.
157855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
157865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Synopsis:
157875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Range(start, end)
157885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing a sequence of values {start, start+1,
157895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     start+2, ..., }.
157905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Range(start, end, step)
157915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing a sequence of values {start, start+step,
157925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     start+step+step, ..., }.
157935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Notes:
157945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   * The generated sequences never include end. For example, Range(1, 5)
157955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
157965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     returns a generator producing {1, 3, 5, 7}.
157975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   * start and end must have the same type. That type may be any integral or
157985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     floating-point type or a user defined type satisfying these conditions:
157995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * It must be assignable (have operator=() defined).
158005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * It must have operator+() (operator+(int-compatible type) for
158015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       two-operand version).
158025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * It must have operator<() defined.
158035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     Elements in the resulting sequences will also have that type.
158045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   * Condition start < end must be satisfied in order for resulting sequences
158055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     to contain any elements.
158065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, typename IncrementT>
158085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
158095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ParamGenerator<T>(
158105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      new internal::RangeGenerator<T, IncrementT>(start, end, step));
158115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
158125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
158135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
158145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<T> Range(T start, T end) {
158155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return Range(start, end, 1);
158165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
158175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
158185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ValuesIn() function allows generation of tests with parameters coming from
158195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a container.
158205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Synopsis:
158225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ValuesIn(const T (&array)[N])
158235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing sequences with elements from
158245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     a C-style array.
158255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ValuesIn(const Container& container)
158265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing sequences with elements from
158275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     an STL-style container.
158285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ValuesIn(Iterator begin, Iterator end)
158295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing sequences with elements from
158305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     a range [begin, end) defined by a pair of STL-style iterators. These
158315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     iterators can also be plain C pointers.
158325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Please note that ValuesIn copies the values from the containers
158345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// passed in and keeps them to generate tests in RUN_ALL_TESTS().
158355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Examples:
158375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This instantiates tests from test case StringTest
158395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each with C-string values of "foo", "bar", and "baz":
158405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// const char* strings[] = {"foo", "bar", "baz"};
158425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
158435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This instantiates tests from test case StlStringTest
158455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each with STL strings with values "a" and "b":
158465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::std::vector< ::std::string> GetParameterStrings() {
158485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ::std::vector< ::std::string> v;
158495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   v.push_back("a");
158505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   v.push_back("b");
158515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   return v;
158525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
158535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(CharSequence,
158555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         StlStringTest,
158565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         ValuesIn(GetParameterStrings()));
158575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This will also instantiate tests from CharTest
158605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each with parameter values 'a' and 'b':
158615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::std::list<char> GetParameterChars() {
158635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ::std::list<char> list;
158645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   list.push_back('a');
158655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   list.push_back('b');
158665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   return list;
158675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
158685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::std::list<char> l = GetParameterChars();
158695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(CharSequence2,
158705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         CharTest,
158715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         ValuesIn(l.begin(), l.end()));
158725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename ForwardIterator>
158745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<
158755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
158765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangValuesIn(ForwardIterator begin, ForwardIterator end) {
158775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
158785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::value_type ParamType;
158795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ParamGenerator<ParamType>(
158805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
158815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
158825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
158835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T, size_t N>
158845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
158855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ValuesIn(array, array + N);
158865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
158875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
158885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Container>
158895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParamGenerator<typename Container::value_type> ValuesIn(
158905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Container& container) {
158915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ValuesIn(container.begin(), container.end());
158925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
158935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
158945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Values() allows generating tests from explicitly specified list of
158955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameters.
158965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
158975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Synopsis:
158985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Values(T v1, T v2, ..., T vN)
158995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing sequences with elements v1, v2, ..., vN.
159005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
159015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For example, this instantiates tests from test case BarTest each
159025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with values "one", "two", and "three":
159035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
159045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
159055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
159065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
159075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The exact type of values will depend on the type of parameter in BazTest.
159085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
159095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
159105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
159115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Currently, Values() supports from 1 to 50 parameters.
159125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
159135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1>
159145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray1<T1> Values(T1 v1) {
159155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray1<T1>(v1);
159165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2>
159195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
159205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray2<T1, T2>(v1, v2);
159215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3>
159245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
159255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
159265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4>
159295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
159305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
159315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
159345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
159355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T5 v5) {
159365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
159375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6>
159415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
159425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T4 v4, T5 v5, T6 v6) {
159435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
159445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7>
159485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
159495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T4 v4, T5 v5, T6 v6, T7 v7) {
159505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
159515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v6, v7);
159525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8>
159565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
159575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
159585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
159595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5, v6, v7, v8);
159605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9>
159645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
159655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
159665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
159675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4, v5, v6, v7, v8, v9);
159685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10>
159725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
159735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
159745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
159755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2, v3, v4, v5, v6, v7, v8, v9, v10);
159765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
159805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11>
159815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
159825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
159835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11) {
159845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
159855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
159865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
159905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12>
159915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
159925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
159935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12) {
159945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
159955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
159965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
159975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
159985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
159995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13>
160015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
160025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
160035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13) {
160045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
160065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14>
160115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
160135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
160145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
160165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14);
160175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15>
160225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
160245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
160255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
160275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13, v14, v15);
160285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
160335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16>
160345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
160365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
160375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16) {
160385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
160405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12, v13, v14, v15, v16);
160415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
160465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17>
160475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
160495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
160505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17) {
160515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
160535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11, v12, v13, v14, v15, v16, v17);
160545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
160595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18>
160605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
160625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
160635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18) {
160645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
160665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10, v11, v12, v13, v14, v15, v16, v17, v18);
160675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
160725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19>
160735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
160755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
160765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
160775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
160795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
160805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
160855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20>
160865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
160875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
160885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
160895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
160905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
160915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
160925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
160935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
160945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
160955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
160965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
160975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
160985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
160995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21>
161005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
161025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
161035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
161045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
161055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
161065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
161075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
161085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
161095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
161105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
161115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
161125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
161135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22>
161145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
161165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
161175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
161185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T21 v21, T22 v22) {
161195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
161205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
161215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
161225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20, v21, v22);
161235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
161245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
161255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
161265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
161275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
161285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
161295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23>
161305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
161325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
161335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
161345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T21 v21, T22 v22, T23 v23) {
161355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
161365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
161375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
161385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20, v21, v22, v23);
161395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
161405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
161415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
161425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
161435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
161445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
161455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24>
161465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
161485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
161495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
161505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T21 v21, T22 v22, T23 v23, T24 v24) {
161515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
161525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
161535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
161545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v19, v20, v21, v22, v23, v24);
161555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
161565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
161575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
161585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
161595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
161605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
161615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25>
161625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
161645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
161655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
161665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
161675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
161685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
161695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
161705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v18, v19, v20, v21, v22, v23, v24, v25);
161715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
161725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
161735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
161745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
161755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
161765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
161775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
161785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26>
161795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
161815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
161825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
161835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
161845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26) {
161855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
161865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
161875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
161885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
161895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
161905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
161915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
161925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
161935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
161945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
161955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
161965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27>
161975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
161985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
161995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
162005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
162015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
162025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27) {
162035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
162045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
162055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
162065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
162075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
162085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
162095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
162105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
162115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
162125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
162135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
162145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28>
162155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
162165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
162175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
162185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
162195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
162205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27, T28 v28) {
162215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
162225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
162235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
162245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
162255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v28);
162265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
162275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
162285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
162295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
162305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
162315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
162325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
162335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29>
162345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
162355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
162365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
162375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
162385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
162395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27, T28 v28, T29 v29) {
162405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
162415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
162425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
162435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
162445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27, v28, v29);
162455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
162465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
162475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
162485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
162495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
162505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
162515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
162525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30>
162535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
162545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
162555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
162565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
162575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
162585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
162595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
162605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
162615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
162625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
162635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v26, v27, v28, v29, v30);
162645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
162655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
162665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
162675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
162685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
162695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
162705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
162715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
162725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31>
162735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
162745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
162755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
162765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
162775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
162785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
162795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
162805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
162815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
162825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
162835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v25, v26, v27, v28, v29, v30, v31);
162845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
162855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
162865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
162875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
162885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
162895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
162905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
162915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
162925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32>
162935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
162945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
162955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
162965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
162975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
162985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
162995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T32 v32) {
163005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
163015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
163025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
163035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
163045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24, v25, v26, v27, v28, v29, v30, v31, v32);
163055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
163065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
163075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
163085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
163095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
163105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
163115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
163125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
163135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33>
163145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
163155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
163165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
163175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
163185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
163195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
163205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T32 v32, T33 v33) {
163215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
163225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
163235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
163245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
163255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
163265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
163275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
163285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
163295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
163305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
163315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
163325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
163335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
163345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34>
163355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
163365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
163375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
163385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
163395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
163405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
163415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31 v31, T32 v32, T33 v33, T34 v34) {
163425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
163435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
163445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
163455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
163465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
163475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
163485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
163495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
163505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
163515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
163525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
163535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
163545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
163555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35>
163565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
163575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
163585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
163595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
163605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
163615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
163625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
163635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
163645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
163655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
163665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
163675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
163685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
163695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
163705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
163715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
163725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
163735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
163745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
163755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
163765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
163775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36>
163785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
163795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
163805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
163815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
163825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
163835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
163845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
163855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
163865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
163875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
163885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
163895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
163905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v34, v35, v36);
163915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
163925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
163935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
163945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
163955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
163965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
163975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
163985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
163995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
164005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37>
164015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
164025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
164035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
164045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
164055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
164065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
164075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
164085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T37 v37) {
164095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
164105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
164115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
164125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
164135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
164145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v34, v35, v36, v37);
164155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
164165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
164175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
164185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
164195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
164205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
164215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
164225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
164235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
164245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38>
164255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
164265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
164275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
164285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
164295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
164305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
164315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
164325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T37 v37, T38 v38) {
164335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
164345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
164355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
164365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
164375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
164385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v33, v34, v35, v36, v37, v38);
164395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
164405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
164415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
164425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
164435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
164445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
164455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
164465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
164475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
164485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39>
164495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
164505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
164515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
164525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
164535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
164545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
164555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
164565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T37 v37, T38 v38, T39 v39) {
164575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
164585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
164595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
164605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
164615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
164625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v32, v33, v34, v35, v36, v37, v38, v39);
164635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
164645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
164655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
164665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
164675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
164685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
164695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
164705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
164715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
164725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40>
164735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
164745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
164755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
164765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
164775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
164785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
164795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
164805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
164815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
164825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
164835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
164845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
164855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
164865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
164875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
164885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
164895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
164905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
164915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
164925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
164935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
164945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
164955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
164965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
164975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41>
164985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
164995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
165005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
165015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
165025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
165035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
165045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
165055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
165065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
165075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
165085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
165095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
165105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
165115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
165125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
165135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
165145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
165155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
165165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
165175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
165185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
165195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
165205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
165215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
165225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42>
165235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
165245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
165255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
165265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
165275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
165285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
165295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
165305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
165315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T42 v42) {
165325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
165335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
165345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
165355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
165365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
165375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
165385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v42);
165395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
165405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
165415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
165425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
165435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
165445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
165455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
165465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
165475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
165485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
165495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43>
165505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
165515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
165525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
165535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
165545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
165555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
165565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
165575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
165585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T42 v42, T43 v43) {
165595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
165605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
165615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
165625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
165635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
165645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
165655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v41, v42, v43);
165665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
165675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
165685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
165695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
165705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
165715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
165725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
165735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
165745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
165755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
165765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44>
165775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
165785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
165795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
165805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
165815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
165825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
165835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
165845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
165855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T42 v42, T43 v43, T44 v44) {
165865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
165875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
165885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
165895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
165905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
165915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
165925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v40, v41, v42, v43, v44);
165935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
165945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
165955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
165965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
165975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
165985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
165995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
166005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
166015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
166025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
166035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45>
166045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
166055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
166065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
166075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
166085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
166095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
166105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
166115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
166125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
166135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
166145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
166155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
166165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
166175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
166185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
166195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v39, v40, v41, v42, v43, v44, v45);
166205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
166215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
166225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
166235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
166245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
166255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
166265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
166275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
166285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
166295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
166305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
166315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46>
166325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
166335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
166345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
166355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
166365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
166375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
166385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
166395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
166405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
166415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
166425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
166435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
166445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
166455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
166465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
166475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v38, v39, v40, v41, v42, v43, v44, v45, v46);
166485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
166495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
166505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
166515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
166525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
166535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
166545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
166555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
166565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
166575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
166585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
166595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47>
166605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
166615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
166625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
166635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
166645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
166655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
166665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
166675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
166685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
166695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
166705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
166715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
166725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
166735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
166745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
166755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
166765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
166775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
166785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
166795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
166805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
166815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
166825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
166835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
166845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
166855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
166865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
166875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48>
166885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
166895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
166905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
166915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
166925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
166935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
166945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
166955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
166965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
166975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T48 v48) {
166985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
166995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
167005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
167015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
167025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
167035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
167045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
167055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
167065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
167075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
167085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
167095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
167105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
167115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
167125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
167135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
167145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
167155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
167165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49>
167175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
167185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
167195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
167205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
167215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
167225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
167235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
167245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
167255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
167265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T47 v47, T48 v48, T49 v49) {
167275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
167285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
167295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
167305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
167315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
167325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
167335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
167345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
167355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
167365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
167375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T6, typename T7, typename T8, typename T9, typename T10,
167385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T11, typename T12, typename T13, typename T14, typename T15,
167395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T16, typename T17, typename T18, typename T19, typename T20,
167405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T21, typename T22, typename T23, typename T24, typename T25,
167415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T26, typename T27, typename T28, typename T29, typename T30,
167425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T31, typename T32, typename T33, typename T34, typename T35,
167435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T36, typename T37, typename T38, typename T39, typename T40,
167445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T41, typename T42, typename T43, typename T44, typename T45,
167455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename T46, typename T47, typename T48, typename T49, typename T50>
167465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
167475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
167485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
167495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
167505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
167515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
167525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
167535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
167545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
167555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
167565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
167575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
167585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
167595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
167605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
167615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
167625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
167635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      v48, v49, v50);
167645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
167655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
167665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Bool() allows generating tests with parameters in a set of (false, true).
167675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
167685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Synopsis:
167695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Bool()
167705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing sequences with elements {false, true}.
167715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
167725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// It is useful when testing code that depends on Boolean flags. Combinations
167735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of multiple flags can be tested when several Bool()'s are combined using
167745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Combine() function.
167755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
167765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In the following example all tests in the test case FlagDependentTest
167775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will be instantiated twice with parameters false and true.
167785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
167795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class FlagDependentTest : public testing::TestWithParam<bool> {
167805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   virtual void SetUp() {
167815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     external_flag = GetParam();
167825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   }
167835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
167845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
167855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
167865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline internal::ParamGenerator<bool> Bool() {
167875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return Values(false, true);
167885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
167895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
167905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_HAS_COMBINE
167915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Combine() allows the user to combine two or more sequences to produce
167925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// values of a Cartesian product of those sequences' elements.
167935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
167945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Synopsis:
167955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Combine(gen1, gen2, ..., genN)
167965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - returns a generator producing sequences with elements coming from
167975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     the Cartesian product of elements from the sequences generated by
167985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     gen1, gen2, ..., genN. The sequence elements will have a type of
167995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
168005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     of elements from sequences produces by gen1, gen2, ..., genN.
168015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Combine can have up to 10 arguments. This number is currently limited
168035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by the maximum number of elements in the tuple implementation used by Google
168045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Test.
168055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Example:
168075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This will instantiate tests in test case AnimalTest each one with
168095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
168105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tuple("dog", BLACK), and tuple("dog", WHITE):
168115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enum Color { BLACK, GRAY, WHITE };
168135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class AnimalTest
168145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
168155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST_P(AnimalTest, AnimalLooksNice) {...}
168175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
168195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         Combine(Values("cat", "dog"),
168205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                                 Values(BLACK, WHITE)));
168215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This will instantiate tests in FlagDependentTest with all variations of two
168235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Boolean flags:
168245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class FlagDependentTest
168265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     : public testing::TestWithParam<tuple<bool, bool> > {
168275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   virtual void SetUp() {
168285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
168295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     tie(external_flag_1, external_flag_2) = GetParam();
168305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   }
168315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// };
168325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST_P(FlagDependentTest, TestFeature1) {
168345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Test your code using external_flag_1 and external_flag_2 here.
168355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
168365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
168375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                         Combine(Bool(), Bool()));
168385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
168395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2>
168405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder2<Generator1, Generator2> Combine(
168415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2) {
168425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder2<Generator1, Generator2>(
168435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2);
168445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
168455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
168465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3>
168475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
168485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
168495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
168505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3);
168515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
168525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
168535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
168545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4>
168555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder4<Generator1, Generator2, Generator3,
168565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4> Combine(
168575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
168585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4) {
168595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
168605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4>(
168615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4);
168625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
168635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
168645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
168655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4, typename Generator5>
168665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder5<Generator1, Generator2, Generator3,
168675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4, Generator5> Combine(
168685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
168695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4, const Generator5& g5) {
168705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
168715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4, Generator5>(
168725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4, g5);
168735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
168745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
168755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
168765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4, typename Generator5, typename Generator6>
168775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder6<Generator1, Generator2, Generator3,
168785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4, Generator5, Generator6> Combine(
168795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
168805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
168815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
168825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4, Generator5, Generator6>(
168835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4, g5, g6);
168845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
168855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
168865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
168875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4, typename Generator5, typename Generator6,
168885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator7>
168895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder7<Generator1, Generator2, Generator3,
168905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4, Generator5, Generator6, Generator7> Combine(
168915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
168925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4, const Generator5& g5, const Generator6& g6,
168935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator7& g7) {
168945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
168955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4, Generator5, Generator6, Generator7>(
168965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4, g5, g6, g7);
168975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
168985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
168995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
169005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4, typename Generator5, typename Generator6,
169015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator7, typename Generator8>
169025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder8<Generator1, Generator2, Generator3,
169035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
169045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
169055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4, const Generator5& g5, const Generator6& g6,
169065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator7& g7, const Generator8& g8) {
169075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
169085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4, Generator5, Generator6, Generator7, Generator8>(
169095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4, g5, g6, g7, g8);
169105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
169115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
169135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4, typename Generator5, typename Generator6,
169145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator7, typename Generator8, typename Generator9>
169155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder9<Generator1, Generator2, Generator3,
169165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4, Generator5, Generator6, Generator7, Generator8,
169175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator9> Combine(
169185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
169195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4, const Generator5& g5, const Generator6& g6,
169205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
169215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
169225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
169235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4, g5, g6, g7, g8, g9);
169245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
169255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Generator1, typename Generator2, typename Generator3,
169275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator4, typename Generator5, typename Generator6,
169285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator7, typename Generator8, typename Generator9,
169295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typename Generator10>
169305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::CartesianProductHolder10<Generator1, Generator2, Generator3,
169315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
169325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Generator10> Combine(
169335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Generator1& g1, const Generator2& g2, const Generator3& g3,
169345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator4& g4, const Generator5& g5, const Generator6& g6,
169355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator7& g7, const Generator8& g8, const Generator9& g9,
169365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const Generator10& g10) {
169375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
169385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
169395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Generator10>(
169405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
169415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
169425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_HAS_COMBINE
169435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define TEST_P(test_case_name, test_name) \
169475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
169485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : public test_case_name { \
169495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public: \
169505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
169515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void TestBody(); \
169525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private: \
169535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static int AddToRegistry() { \
169545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
169555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          GetTestCasePatternHolder<test_case_name>(\
169565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
169575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  #test_case_name, \
169585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  #test_name, \
169595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  new ::testing::internal::TestMetaFactory< \
169605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
169615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return 0; \
169625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
169635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static int gtest_registering_dummy_; \
169645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
169655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
169665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }; \
169675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int GTEST_TEST_CLASS_NAME_(test_case_name, \
169685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             test_name)::gtest_registering_dummy_ = \
169695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
169705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
169715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
169735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
169745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
169755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int gtest_##prefix##test_case_name##_dummy_ = \
169765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
169775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          GetTestCasePatternHolder<test_case_name>(\
169785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
169795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  #prefix, \
169805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
169815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  __FILE__, __LINE__)
169825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
169845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PARAM_TEST
169865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
169875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
169885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2006, Google Inc.
169895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
169905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
169915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
169925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
169935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
169945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
169955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
169965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
169975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
169985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
169995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
170005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
170015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
170025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
170035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
170045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
170065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
170075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
170085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
170095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
170105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
170115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
170125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
170135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
170145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
170155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
170165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
170185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google C++ Testing Framework definitions useful in production code.
170205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
170225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
170235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// When you need to test the private or protected members of a class,
170255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// use the FRIEND_TEST macro to declare your tests as friends of the
170265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class.  For example:
170275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class MyClass {
170295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  private:
170305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   void MyMethod();
170315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   FRIEND_TEST(MyClassTest, MyMethod);
170325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// };
170335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class MyClassTest : public testing::Test {
170355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // ...
170365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// };
170375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TEST_F(MyClassTest, MyMethod) {
170395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   // Can call MyClass::MyMethod() here.
170405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// }
170415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define FRIEND_TEST(test_case_name, test_name)\
170435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangfriend class test_case_name##_##test_name##_Test
170445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
170465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008, Google Inc.
170475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
170485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
170505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
170515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
170525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
170545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
170555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
170565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
170575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
170585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
170595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
170605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
170615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
170625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
170645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
170655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
170665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
170675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
170685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
170695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
170705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
170715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
170725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
170735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
170745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: mheule@google.com (Markus Heule)
170765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
170795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
170805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <iosfwd>
170825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <vector>
170835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
170855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
170865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A copyable object representing the result of a test part (i.e. an
170875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
170885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
170895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't inherit from TestPartResult as its destructor is not virtual.
170905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ TestPartResult {
170915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
170925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The possible outcomes of a test part (i.e. an assertion or an
170935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
170945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  enum Type {
170955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    kSuccess,          // Succeeded.
170965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    kNonFatalFailure,  // Failed but the test can continue.
170975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    kFatalFailure      // Failed and the test should be terminated.
170985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
170995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // C'tor.  TestPartResult does NOT have a default constructor.
171015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Always use this constructor (with parameters) to create a
171025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TestPartResult object.
171035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResult(Type a_type,
171045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 const char* a_file_name,
171055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 int a_line_number,
171065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 const char* a_message)
171075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : type_(a_type),
171085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        file_name_(a_file_name == NULL ? "" : a_file_name),
171095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        line_number_(a_line_number),
171105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        summary_(ExtractSummary(a_message)),
171115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        message_(a_message) {
171125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
171135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the outcome of the test part.
171155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Type type() const { return type_; }
171165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the name of the source file where the test part took place, or
171185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NULL if it's unknown.
171195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* file_name() const {
171205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return file_name_.empty() ? NULL : file_name_.c_str();
171215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
171225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the line in the source file where the test part took place,
171245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // or -1 if it's unknown.
171255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int line_number() const { return line_number_; }
171265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the summary of the failure message.
171285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* summary() const { return summary_.c_str(); }
171295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the message associated with the test part.
171315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* message() const { return message_.c_str(); }
171325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test part passed.
171345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool passed() const { return type_ == kSuccess; }
171355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test part failed.
171375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool failed() const { return type_ != kSuccess; }
171385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test part non-fatally failed.
171405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
171415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test part fatally failed.
171435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool fatally_failed() const { return type_ == kFatalFailure; }
171445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
171465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Type type_;
171475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the summary of the failure message by omitting the stack
171495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // trace in it.
171505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string ExtractSummary(const char* message);
171515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The name of the source file where the test part took place, or
171535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // "" if the source file is unknown.
171545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string file_name_;
171555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The line in the source file where the test part took place, or -1
171565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // if the line number is unknown.
171575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int line_number_;
171585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string summary_;  // The test failure summary.
171595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string message_;  // The test failure message.
171605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
171615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a TestPartResult object.
171635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
171645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// An array of TestPartResult objects.
171665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
171675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't inherit from TestPartResultArray as its destructor is not
171685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// virtual.
171695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ TestPartResultArray {
171705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
171715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultArray() {}
171725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Appends the given TestPartResult to the array.
171745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Append(const TestPartResult& result);
171755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the TestPartResult at the given index (0-based).
171775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestPartResult& GetTestPartResult(int index) const;
171785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the number of TestPartResult objects in the array.
171805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int size() const;
171815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
171835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<TestPartResult> array_;
171845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
171865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
171875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This interface knows how to report a test part result.
171895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestPartResultReporterInterface {
171905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
171915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~TestPartResultReporterInterface() {}
171925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
171945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
171955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
171975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
171985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
171995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// statement generates new fatal failures. To do so it registers itself as the
172005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// current test part result reporter. Besides checking if fatal failures were
172015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// reported, it only delegates the reporting to the former result reporter.
172025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The original result reporter is restored in the destructor.
172035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
172045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ HasNewFatalFailureHelper
172055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public TestPartResultReporterInterface {
172065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
172075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  HasNewFatalFailureHelper();
172085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~HasNewFatalFailureHelper();
172095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void ReportTestPartResult(const TestPartResult& result);
172105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
172115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
172125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool has_new_fatal_failure_;
172135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultReporterInterface* original_reporter_;
172145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
172165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
172175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
172195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
172215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
172235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008 Google Inc.
172245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All Rights Reserved.
172255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
172265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
172275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
172285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
172295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
172305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
172315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
172325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
172335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
172345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
172355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
172365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
172375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
172385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
172395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
172405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
172435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
172445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
172455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
172465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
172475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
172485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
172495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
172505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
172515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
172525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
172535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
172555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
172565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header implements typed tests and type-parameterized tests.
172585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Typed (aka type-driven) tests repeat the same test for types in a
172605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// list.  You must know which types you want to test with when writing
172615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// typed tests. Here's how you do it:
172625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if 0
172645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// First, define a fixture class template.  It should be parameterized
172665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by a type.  Remember to derive it from testing::Test.
172675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
172685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FooTest : public testing::Test {
172695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
172705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ...
172715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef std::list<T> List;
172725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static T shared_;
172735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  T value_;
172745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
172755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Next, associate a list of types with the test case, which will be
172775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// repeated for each type in the list.  The typedef is necessary for
172785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the macro to parse correctly.
172795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef testing::Types<char, int, unsigned int> MyTypes;
172805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTYPED_TEST_CASE(FooTest, MyTypes);
172815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the type list contains only one type, you can write that type
172835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// directly without Types<...>:
172845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   TYPED_TEST_CASE(FooTest, int);
172855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
172875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tests for this test case as you want.
172885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTYPED_TEST(FooTest, DoesBlah) {
172895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Inside a test, refer to TypeParam to get the type parameter.
172905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Since we are inside a derived class template, C++ requires use to
172915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // visit the members of FooTest via 'this'.
172925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TypeParam n = this->value_;
172935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // To visit static members of the fixture, add the TestFixture::
172955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // prefix.
172965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  n += TestFixture::shared_;
172975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
172985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // To refer to typedefs in the fixture, add the "typename
172995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TestFixture::" prefix.
173005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typename TestFixture::List values;
173015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  values.push_back(n);
173025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ...
173035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
173045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTYPED_TEST(FooTest, HasPropertyA) { ... }
173065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // 0
173085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Type-parameterized tests are abstract test patterns parameterized
173105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by a type.  Compared with typed tests, type-parameterized tests
173115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// allow you to define the test pattern without knowing what the type
173125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameters are.  The defined pattern can be instantiated with
173135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// different types any number of times, in any number of translation
173145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// units.
173155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
173165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If you are designing an interface or concept, you can define a
173175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// suite of type-parameterized tests to verify properties that any
173185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// valid implementation of the interface/concept should have.  Then,
173195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each implementation can easily instantiate the test suite to verify
173205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that it conforms to the requirements, without having to write
173215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// similar tests repeatedly.  Here's an example:
173225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if 0
173245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// First, define a fixture class template.  It should be parameterized
173265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by a type.  Remember to derive it from testing::Test.
173275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
173285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FooTest : public testing::Test {
173295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ...
173305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
173315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Next, declare that you will define a type-parameterized test case
173335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (the _P suffix is for "parameterized" or "pattern", whichever you
173345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prefer):
173355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTYPED_TEST_CASE_P(FooTest);
173365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Then, use TYPED_TEST_P() to define as many type-parameterized tests
173385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for this type-parameterized test case as you want.
173395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTYPED_TEST_P(FooTest, DoesBlah) {
173405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Inside a test, refer to TypeParam to get the type parameter.
173415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TypeParam n = 0;
173425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ...
173435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
173445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTYPED_TEST_P(FooTest, HasPropertyA) { ... }
173465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Now the tricky part: you need to register all test patterns before
173485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// you can instantiate them.  The first argument of the macro is the
173495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test case name; the rest are the names of the tests in this test
173505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// case.
173515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangREGISTER_TYPED_TEST_CASE_P(FooTest,
173525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           DoesBlah, HasPropertyA);
173535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Finally, you are free to instantiate the pattern with the types you
173555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// want.  If you put the above code in a header file, you can #include
173565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it in multiple C++ source files and instantiate it multiple times.
173575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
173585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// To distinguish different instances of the pattern, the first
173595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// argument to the INSTANTIATE_* macro is a prefix that will be added
173605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to the actual test case name.  Remember to pick unique prefixes for
173615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// different instances.
173625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef testing::Types<char, int, unsigned int> MyTypes;
173635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
173645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the type list contains only one type, you can write that type
173665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// directly without Types<...>:
173675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
173685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // 0
173705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements typed tests.
173735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TYPED_TEST
173755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
173775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
173785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Expands to the name of the typedef for the type parameters of the
173795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given test case.
173805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
173815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The 'Types' template argument below must have spaces around it
173835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// since some compilers may choke on '>>' when passing a template
173845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instance (e.g. Types<int>)
173855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define TYPED_TEST_CASE(CaseName, Types) \
173865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::testing::internal::TypeList< Types >::type \
173875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_TYPE_PARAMS_(CaseName)
173885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
173895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define TYPED_TEST(CaseName, TestName) \
173905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename gtest_TypeParam_> \
173915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
173925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : public CaseName<gtest_TypeParam_> { \
173935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private: \
173945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef CaseName<gtest_TypeParam_> TestFixture; \
173955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef gtest_TypeParam_ TypeParam; \
173965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void TestBody(); \
173975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }; \
173985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
173995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::internal::TypeParameterizedTest< \
174005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          CaseName, \
174015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::internal::TemplateSel< \
174025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
174035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
174045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              "", #CaseName, #TestName, 0); \
174055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename gtest_TypeParam_> \
174065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
174075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TYPED_TEST
174095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements type-parameterized tests.
174115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TYPED_TEST_P
174135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
174155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
174165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Expands to the namespace name that the type-parameterized tests for
174175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the given type-parameterized test case are defined in.  The exact
174185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// name of the namespace is subject to change without notice.
174195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_CASE_NAMESPACE_(TestCaseName) \
174205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  gtest_case_##TestCaseName##_
174215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
174235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
174245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Expands to the name of the variable used to remember the names of
174255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the defined tests in the given test case.
174265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
174275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  gtest_typed_test_case_p_state_##TestCaseName##_
174285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
174305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
174315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Expands to the name of the variable used to remember the names of
174325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the registered tests in the given test case.
174335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
174345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  gtest_registered_test_names_##TestCaseName##_
174355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The variables defined in the type-parameterized test macros are
174375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// static as typically these macros are used in a .h file that can be
174385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// #included in multiple translation units linked together.
174395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define TYPED_TEST_CASE_P(CaseName) \
174405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static ::testing::internal::TypedTestCasePState \
174415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
174425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define TYPED_TEST_P(CaseName, TestName) \
174445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
174455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename gtest_TypeParam_> \
174465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class TestName : public CaseName<gtest_TypeParam_> { \
174475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private: \
174485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef CaseName<gtest_TypeParam_> TestFixture; \
174495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    typedef gtest_TypeParam_ TypeParam; \
174505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void TestBody(); \
174515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }; \
174525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
174535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
174545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          __FILE__, __LINE__, #CaseName, #TestName); \
174555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } \
174565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename gtest_TypeParam_> \
174575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
174585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
174605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
174615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
174625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } \
174635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
174645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
174655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          __FILE__, __LINE__, #__VA_ARGS__)
174665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The 'Types' template argument below must have spaces around it
174685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// since some compilers may choke on '>>' when passing a template
174695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instance (e.g. Types<int>)
174705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
174715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
174725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::internal::TypeParameterizedTestCase<CaseName, \
174735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
174745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::internal::TypeList< Types >::type>::Register(\
174755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
174765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TYPED_TEST_P
174785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
174795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
174801b362b15af34006e6a11974088a46d42b903418eJohann
174811b362b15af34006e6a11974088a46d42b903418eJohann// Depending on the platform, different string classes are available.
174821b362b15af34006e6a11974088a46d42b903418eJohann// On Linux, in addition to ::std::string, Google also makes use of
174831b362b15af34006e6a11974088a46d42b903418eJohann// class ::string, which has the same interface as ::std::string, but
174841b362b15af34006e6a11974088a46d42b903418eJohann// has a different implementation.
174851b362b15af34006e6a11974088a46d42b903418eJohann//
174861b362b15af34006e6a11974088a46d42b903418eJohann// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
174871b362b15af34006e6a11974088a46d42b903418eJohann// ::string is available AND is a distinct type to ::std::string, or
174881b362b15af34006e6a11974088a46d42b903418eJohann// define it to 0 to indicate otherwise.
174891b362b15af34006e6a11974088a46d42b903418eJohann//
174901b362b15af34006e6a11974088a46d42b903418eJohann// If the user's ::std::string and ::string are the same class due to
174911b362b15af34006e6a11974088a46d42b903418eJohann// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
174921b362b15af34006e6a11974088a46d42b903418eJohann//
174931b362b15af34006e6a11974088a46d42b903418eJohann// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
174941b362b15af34006e6a11974088a46d42b903418eJohann// heuristically.
174951b362b15af34006e6a11974088a46d42b903418eJohann
174961b362b15af34006e6a11974088a46d42b903418eJohannnamespace testing {
174971b362b15af34006e6a11974088a46d42b903418eJohann
174981b362b15af34006e6a11974088a46d42b903418eJohann// Declares the flags.
174991b362b15af34006e6a11974088a46d42b903418eJohann
175001b362b15af34006e6a11974088a46d42b903418eJohann// This flag temporary enables the disabled tests.
175011b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(also_run_disabled_tests);
175021b362b15af34006e6a11974088a46d42b903418eJohann
175031b362b15af34006e6a11974088a46d42b903418eJohann// This flag brings the debugger on an assertion failure.
175041b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(break_on_failure);
175051b362b15af34006e6a11974088a46d42b903418eJohann
175061b362b15af34006e6a11974088a46d42b903418eJohann// This flag controls whether Google Test catches all test-thrown exceptions
175071b362b15af34006e6a11974088a46d42b903418eJohann// and logs them as failures.
175081b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(catch_exceptions);
175091b362b15af34006e6a11974088a46d42b903418eJohann
175101b362b15af34006e6a11974088a46d42b903418eJohann// This flag enables using colors in terminal output. Available values are
175111b362b15af34006e6a11974088a46d42b903418eJohann// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
175121b362b15af34006e6a11974088a46d42b903418eJohann// to let Google Test decide.
175131b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_string_(color);
175141b362b15af34006e6a11974088a46d42b903418eJohann
175151b362b15af34006e6a11974088a46d42b903418eJohann// This flag sets up the filter to select by name using a glob pattern
175161b362b15af34006e6a11974088a46d42b903418eJohann// the tests to run. If the filter is not given all tests are executed.
175171b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_string_(filter);
175181b362b15af34006e6a11974088a46d42b903418eJohann
175191b362b15af34006e6a11974088a46d42b903418eJohann// This flag causes the Google Test to list tests. None of the tests listed
175201b362b15af34006e6a11974088a46d42b903418eJohann// are actually run if the flag is provided.
175211b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(list_tests);
175221b362b15af34006e6a11974088a46d42b903418eJohann
175231b362b15af34006e6a11974088a46d42b903418eJohann// This flag controls whether Google Test emits a detailed XML report to a file
175241b362b15af34006e6a11974088a46d42b903418eJohann// in addition to its normal textual output.
175251b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_string_(output);
175261b362b15af34006e6a11974088a46d42b903418eJohann
175271b362b15af34006e6a11974088a46d42b903418eJohann// This flags control whether Google Test prints the elapsed time for each
175281b362b15af34006e6a11974088a46d42b903418eJohann// test.
175291b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(print_time);
175301b362b15af34006e6a11974088a46d42b903418eJohann
175311b362b15af34006e6a11974088a46d42b903418eJohann// This flag specifies the random number seed.
175321b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_int32_(random_seed);
175331b362b15af34006e6a11974088a46d42b903418eJohann
175341b362b15af34006e6a11974088a46d42b903418eJohann// This flag sets how many times the tests are repeated. The default value
175351b362b15af34006e6a11974088a46d42b903418eJohann// is 1. If the value is -1 the tests are repeating forever.
175361b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_int32_(repeat);
175371b362b15af34006e6a11974088a46d42b903418eJohann
175381b362b15af34006e6a11974088a46d42b903418eJohann// This flag controls whether Google Test includes Google Test internal
175391b362b15af34006e6a11974088a46d42b903418eJohann// stack frames in failure stack traces.
175401b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(show_internal_stack_frames);
175411b362b15af34006e6a11974088a46d42b903418eJohann
175421b362b15af34006e6a11974088a46d42b903418eJohann// When this flag is specified, tests' order is randomized on every iteration.
175431b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(shuffle);
175441b362b15af34006e6a11974088a46d42b903418eJohann
175451b362b15af34006e6a11974088a46d42b903418eJohann// This flag specifies the maximum number of stack frames to be
175461b362b15af34006e6a11974088a46d42b903418eJohann// printed in a failure message.
175471b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_int32_(stack_trace_depth);
175481b362b15af34006e6a11974088a46d42b903418eJohann
175491b362b15af34006e6a11974088a46d42b903418eJohann// When this flag is specified, a failed assertion will throw an
175501b362b15af34006e6a11974088a46d42b903418eJohann// exception if exceptions are enabled, or exit the program with a
175511b362b15af34006e6a11974088a46d42b903418eJohann// non-zero code otherwise.
175521b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_bool_(throw_on_failure);
175531b362b15af34006e6a11974088a46d42b903418eJohann
175541b362b15af34006e6a11974088a46d42b903418eJohann// When this flag is set with a "host:port" string, on supported
175551b362b15af34006e6a11974088a46d42b903418eJohann// platforms test results are streamed to the specified port on
175561b362b15af34006e6a11974088a46d42b903418eJohann// the specified host machine.
175571b362b15af34006e6a11974088a46d42b903418eJohannGTEST_DECLARE_string_(stream_result_to);
175581b362b15af34006e6a11974088a46d42b903418eJohann
175591b362b15af34006e6a11974088a46d42b903418eJohann// The upper limit for valid stack trace depths.
175601b362b15af34006e6a11974088a46d42b903418eJohannconst int kMaxStackTraceDepth = 100;
175611b362b15af34006e6a11974088a46d42b903418eJohann
175621b362b15af34006e6a11974088a46d42b903418eJohannnamespace internal {
175631b362b15af34006e6a11974088a46d42b903418eJohann
175641b362b15af34006e6a11974088a46d42b903418eJohannclass AssertHelper;
175651b362b15af34006e6a11974088a46d42b903418eJohannclass DefaultGlobalTestPartResultReporter;
175661b362b15af34006e6a11974088a46d42b903418eJohannclass ExecDeathTest;
175671b362b15af34006e6a11974088a46d42b903418eJohannclass NoExecDeathTest;
175681b362b15af34006e6a11974088a46d42b903418eJohannclass FinalSuccessChecker;
175691b362b15af34006e6a11974088a46d42b903418eJohannclass GTestFlagSaver;
175705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass StreamingListenerTest;
175711b362b15af34006e6a11974088a46d42b903418eJohannclass TestResultAccessor;
175721b362b15af34006e6a11974088a46d42b903418eJohannclass TestEventListenersAccessor;
175731b362b15af34006e6a11974088a46d42b903418eJohannclass TestEventRepeater;
175745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass UnitTestRecordPropertyTestHelper;
175751b362b15af34006e6a11974088a46d42b903418eJohannclass WindowsDeathTest;
175761b362b15af34006e6a11974088a46d42b903418eJohannclass UnitTestImpl* GetUnitTestImpl();
175771b362b15af34006e6a11974088a46d42b903418eJohannvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
175785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                    const std::string& message);
175791b362b15af34006e6a11974088a46d42b903418eJohann
175801b362b15af34006e6a11974088a46d42b903418eJohann}  // namespace internal
175811b362b15af34006e6a11974088a46d42b903418eJohann
175821b362b15af34006e6a11974088a46d42b903418eJohann// The friend relationship of some of these classes is cyclic.
175831b362b15af34006e6a11974088a46d42b903418eJohann// If we don't forward declare them the compiler might confuse the classes
175841b362b15af34006e6a11974088a46d42b903418eJohann// in friendship clauses with same named classes on the scope.
175851b362b15af34006e6a11974088a46d42b903418eJohannclass Test;
175861b362b15af34006e6a11974088a46d42b903418eJohannclass TestCase;
175871b362b15af34006e6a11974088a46d42b903418eJohannclass TestInfo;
175881b362b15af34006e6a11974088a46d42b903418eJohannclass UnitTest;
175891b362b15af34006e6a11974088a46d42b903418eJohann
175901b362b15af34006e6a11974088a46d42b903418eJohann// A class for indicating whether an assertion was successful.  When
175911b362b15af34006e6a11974088a46d42b903418eJohann// the assertion wasn't successful, the AssertionResult object
175921b362b15af34006e6a11974088a46d42b903418eJohann// remembers a non-empty message that describes how it failed.
175931b362b15af34006e6a11974088a46d42b903418eJohann//
175941b362b15af34006e6a11974088a46d42b903418eJohann// To create an instance of this class, use one of the factory functions
175951b362b15af34006e6a11974088a46d42b903418eJohann// (AssertionSuccess() and AssertionFailure()).
175961b362b15af34006e6a11974088a46d42b903418eJohann//
175971b362b15af34006e6a11974088a46d42b903418eJohann// This class is useful for two purposes:
175981b362b15af34006e6a11974088a46d42b903418eJohann//   1. Defining predicate functions to be used with Boolean test assertions
175991b362b15af34006e6a11974088a46d42b903418eJohann//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
176001b362b15af34006e6a11974088a46d42b903418eJohann//   2. Defining predicate-format functions to be
176011b362b15af34006e6a11974088a46d42b903418eJohann//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
176021b362b15af34006e6a11974088a46d42b903418eJohann//
176031b362b15af34006e6a11974088a46d42b903418eJohann// For example, if you define IsEven predicate:
176041b362b15af34006e6a11974088a46d42b903418eJohann//
176051b362b15af34006e6a11974088a46d42b903418eJohann//   testing::AssertionResult IsEven(int n) {
176061b362b15af34006e6a11974088a46d42b903418eJohann//     if ((n % 2) == 0)
176071b362b15af34006e6a11974088a46d42b903418eJohann//       return testing::AssertionSuccess();
176081b362b15af34006e6a11974088a46d42b903418eJohann//     else
176091b362b15af34006e6a11974088a46d42b903418eJohann//       return testing::AssertionFailure() << n << " is odd";
176101b362b15af34006e6a11974088a46d42b903418eJohann//   }
176111b362b15af34006e6a11974088a46d42b903418eJohann//
176121b362b15af34006e6a11974088a46d42b903418eJohann// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
176131b362b15af34006e6a11974088a46d42b903418eJohann// will print the message
176141b362b15af34006e6a11974088a46d42b903418eJohann//
176151b362b15af34006e6a11974088a46d42b903418eJohann//   Value of: IsEven(Fib(5))
176161b362b15af34006e6a11974088a46d42b903418eJohann//     Actual: false (5 is odd)
176171b362b15af34006e6a11974088a46d42b903418eJohann//   Expected: true
176181b362b15af34006e6a11974088a46d42b903418eJohann//
176191b362b15af34006e6a11974088a46d42b903418eJohann// instead of a more opaque
176201b362b15af34006e6a11974088a46d42b903418eJohann//
176211b362b15af34006e6a11974088a46d42b903418eJohann//   Value of: IsEven(Fib(5))
176221b362b15af34006e6a11974088a46d42b903418eJohann//     Actual: false
176231b362b15af34006e6a11974088a46d42b903418eJohann//   Expected: true
176241b362b15af34006e6a11974088a46d42b903418eJohann//
176251b362b15af34006e6a11974088a46d42b903418eJohann// in case IsEven is a simple Boolean predicate.
176261b362b15af34006e6a11974088a46d42b903418eJohann//
176271b362b15af34006e6a11974088a46d42b903418eJohann// If you expect your predicate to be reused and want to support informative
176281b362b15af34006e6a11974088a46d42b903418eJohann// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
176291b362b15af34006e6a11974088a46d42b903418eJohann// about half as often as positive ones in our tests), supply messages for
176301b362b15af34006e6a11974088a46d42b903418eJohann// both success and failure cases:
176311b362b15af34006e6a11974088a46d42b903418eJohann//
176321b362b15af34006e6a11974088a46d42b903418eJohann//   testing::AssertionResult IsEven(int n) {
176331b362b15af34006e6a11974088a46d42b903418eJohann//     if ((n % 2) == 0)
176341b362b15af34006e6a11974088a46d42b903418eJohann//       return testing::AssertionSuccess() << n << " is even";
176351b362b15af34006e6a11974088a46d42b903418eJohann//     else
176361b362b15af34006e6a11974088a46d42b903418eJohann//       return testing::AssertionFailure() << n << " is odd";
176371b362b15af34006e6a11974088a46d42b903418eJohann//   }
176381b362b15af34006e6a11974088a46d42b903418eJohann//
176391b362b15af34006e6a11974088a46d42b903418eJohann// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
176401b362b15af34006e6a11974088a46d42b903418eJohann//
176411b362b15af34006e6a11974088a46d42b903418eJohann//   Value of: IsEven(Fib(6))
176421b362b15af34006e6a11974088a46d42b903418eJohann//     Actual: true (8 is even)
176431b362b15af34006e6a11974088a46d42b903418eJohann//   Expected: false
176441b362b15af34006e6a11974088a46d42b903418eJohann//
176451b362b15af34006e6a11974088a46d42b903418eJohann// NB: Predicates that support negative Boolean assertions have reduced
176461b362b15af34006e6a11974088a46d42b903418eJohann// performance in positive ones so be careful not to use them in tests
176471b362b15af34006e6a11974088a46d42b903418eJohann// that have lots (tens of thousands) of positive Boolean assertions.
176481b362b15af34006e6a11974088a46d42b903418eJohann//
176491b362b15af34006e6a11974088a46d42b903418eJohann// To use this class with EXPECT_PRED_FORMAT assertions such as:
176501b362b15af34006e6a11974088a46d42b903418eJohann//
176511b362b15af34006e6a11974088a46d42b903418eJohann//   // Verifies that Foo() returns an even number.
176521b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_PRED_FORMAT1(IsEven, Foo());
176531b362b15af34006e6a11974088a46d42b903418eJohann//
176541b362b15af34006e6a11974088a46d42b903418eJohann// you need to define:
176551b362b15af34006e6a11974088a46d42b903418eJohann//
176561b362b15af34006e6a11974088a46d42b903418eJohann//   testing::AssertionResult IsEven(const char* expr, int n) {
176571b362b15af34006e6a11974088a46d42b903418eJohann//     if ((n % 2) == 0)
176581b362b15af34006e6a11974088a46d42b903418eJohann//       return testing::AssertionSuccess();
176591b362b15af34006e6a11974088a46d42b903418eJohann//     else
176601b362b15af34006e6a11974088a46d42b903418eJohann//       return testing::AssertionFailure()
176611b362b15af34006e6a11974088a46d42b903418eJohann//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
176621b362b15af34006e6a11974088a46d42b903418eJohann//   }
176631b362b15af34006e6a11974088a46d42b903418eJohann//
176641b362b15af34006e6a11974088a46d42b903418eJohann// If Foo() returns 5, you will see the following message:
176651b362b15af34006e6a11974088a46d42b903418eJohann//
176661b362b15af34006e6a11974088a46d42b903418eJohann//   Expected: Foo() is even
176671b362b15af34006e6a11974088a46d42b903418eJohann//     Actual: it's 5
176681b362b15af34006e6a11974088a46d42b903418eJohann//
176691b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ AssertionResult {
176701b362b15af34006e6a11974088a46d42b903418eJohann public:
176711b362b15af34006e6a11974088a46d42b903418eJohann  // Copy constructor.
176721b362b15af34006e6a11974088a46d42b903418eJohann  // Used in EXPECT_TRUE/FALSE(assertion_result).
176731b362b15af34006e6a11974088a46d42b903418eJohann  AssertionResult(const AssertionResult& other);
176741b362b15af34006e6a11974088a46d42b903418eJohann  // Used in the EXPECT_TRUE/FALSE(bool_expression).
176751b362b15af34006e6a11974088a46d42b903418eJohann  explicit AssertionResult(bool success) : success_(success) {}
176761b362b15af34006e6a11974088a46d42b903418eJohann
176771b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the assertion succeeded.
176781b362b15af34006e6a11974088a46d42b903418eJohann  operator bool() const { return success_; }  // NOLINT
176791b362b15af34006e6a11974088a46d42b903418eJohann
176801b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
176811b362b15af34006e6a11974088a46d42b903418eJohann  AssertionResult operator!() const;
176821b362b15af34006e6a11974088a46d42b903418eJohann
176831b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the text streamed into this AssertionResult. Test assertions
176841b362b15af34006e6a11974088a46d42b903418eJohann  // use it when they fail (i.e., the predicate's outcome doesn't match the
176851b362b15af34006e6a11974088a46d42b903418eJohann  // assertion's expectation). When nothing has been streamed into the
176861b362b15af34006e6a11974088a46d42b903418eJohann  // object, returns an empty string.
176871b362b15af34006e6a11974088a46d42b903418eJohann  const char* message() const {
176881b362b15af34006e6a11974088a46d42b903418eJohann    return message_.get() != NULL ?  message_->c_str() : "";
176891b362b15af34006e6a11974088a46d42b903418eJohann  }
176901b362b15af34006e6a11974088a46d42b903418eJohann  // TODO(vladl@google.com): Remove this after making sure no clients use it.
176911b362b15af34006e6a11974088a46d42b903418eJohann  // Deprecated; please use message() instead.
176921b362b15af34006e6a11974088a46d42b903418eJohann  const char* failure_message() const { return message(); }
176931b362b15af34006e6a11974088a46d42b903418eJohann
176941b362b15af34006e6a11974088a46d42b903418eJohann  // Streams a custom failure message into this object.
176951b362b15af34006e6a11974088a46d42b903418eJohann  template <typename T> AssertionResult& operator<<(const T& value) {
176961b362b15af34006e6a11974088a46d42b903418eJohann    AppendMessage(Message() << value);
176971b362b15af34006e6a11974088a46d42b903418eJohann    return *this;
176981b362b15af34006e6a11974088a46d42b903418eJohann  }
176991b362b15af34006e6a11974088a46d42b903418eJohann
177001b362b15af34006e6a11974088a46d42b903418eJohann  // Allows streaming basic output manipulators such as endl or flush into
177011b362b15af34006e6a11974088a46d42b903418eJohann  // this object.
177021b362b15af34006e6a11974088a46d42b903418eJohann  AssertionResult& operator<<(
177031b362b15af34006e6a11974088a46d42b903418eJohann      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
177041b362b15af34006e6a11974088a46d42b903418eJohann    AppendMessage(Message() << basic_manipulator);
177051b362b15af34006e6a11974088a46d42b903418eJohann    return *this;
177061b362b15af34006e6a11974088a46d42b903418eJohann  }
177071b362b15af34006e6a11974088a46d42b903418eJohann
177081b362b15af34006e6a11974088a46d42b903418eJohann private:
177091b362b15af34006e6a11974088a46d42b903418eJohann  // Appends the contents of message to message_.
177101b362b15af34006e6a11974088a46d42b903418eJohann  void AppendMessage(const Message& a_message) {
177111b362b15af34006e6a11974088a46d42b903418eJohann    if (message_.get() == NULL)
177121b362b15af34006e6a11974088a46d42b903418eJohann      message_.reset(new ::std::string);
177131b362b15af34006e6a11974088a46d42b903418eJohann    message_->append(a_message.GetString().c_str());
177141b362b15af34006e6a11974088a46d42b903418eJohann  }
177151b362b15af34006e6a11974088a46d42b903418eJohann
177161b362b15af34006e6a11974088a46d42b903418eJohann  // Stores result of the assertion predicate.
177171b362b15af34006e6a11974088a46d42b903418eJohann  bool success_;
177181b362b15af34006e6a11974088a46d42b903418eJohann  // Stores the message describing the condition in case the expectation
177191b362b15af34006e6a11974088a46d42b903418eJohann  // construct is not satisfied with the predicate's outcome.
177201b362b15af34006e6a11974088a46d42b903418eJohann  // Referenced via a pointer to avoid taking too much stack frame space
177211b362b15af34006e6a11974088a46d42b903418eJohann  // with test assertions.
177221b362b15af34006e6a11974088a46d42b903418eJohann  internal::scoped_ptr< ::std::string> message_;
177231b362b15af34006e6a11974088a46d42b903418eJohann
177241b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_ASSIGN_(AssertionResult);
177251b362b15af34006e6a11974088a46d42b903418eJohann};
177261b362b15af34006e6a11974088a46d42b903418eJohann
177271b362b15af34006e6a11974088a46d42b903418eJohann// Makes a successful assertion result.
177281b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult AssertionSuccess();
177291b362b15af34006e6a11974088a46d42b903418eJohann
177301b362b15af34006e6a11974088a46d42b903418eJohann// Makes a failed assertion result.
177311b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult AssertionFailure();
177321b362b15af34006e6a11974088a46d42b903418eJohann
177331b362b15af34006e6a11974088a46d42b903418eJohann// Makes a failed assertion result with the given failure message.
177341b362b15af34006e6a11974088a46d42b903418eJohann// Deprecated; use AssertionFailure() << msg.
177351b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult AssertionFailure(const Message& msg);
177361b362b15af34006e6a11974088a46d42b903418eJohann
177371b362b15af34006e6a11974088a46d42b903418eJohann// The abstract class that all tests inherit from.
177381b362b15af34006e6a11974088a46d42b903418eJohann//
177391b362b15af34006e6a11974088a46d42b903418eJohann// In Google Test, a unit test program contains one or many TestCases, and
177401b362b15af34006e6a11974088a46d42b903418eJohann// each TestCase contains one or many Tests.
177411b362b15af34006e6a11974088a46d42b903418eJohann//
177421b362b15af34006e6a11974088a46d42b903418eJohann// When you define a test using the TEST macro, you don't need to
177431b362b15af34006e6a11974088a46d42b903418eJohann// explicitly derive from Test - the TEST macro automatically does
177441b362b15af34006e6a11974088a46d42b903418eJohann// this for you.
177451b362b15af34006e6a11974088a46d42b903418eJohann//
177461b362b15af34006e6a11974088a46d42b903418eJohann// The only time you derive from Test is when defining a test fixture
177471b362b15af34006e6a11974088a46d42b903418eJohann// to be used a TEST_F.  For example:
177481b362b15af34006e6a11974088a46d42b903418eJohann//
177491b362b15af34006e6a11974088a46d42b903418eJohann//   class FooTest : public testing::Test {
177501b362b15af34006e6a11974088a46d42b903418eJohann//    protected:
177511b362b15af34006e6a11974088a46d42b903418eJohann//     virtual void SetUp() { ... }
177521b362b15af34006e6a11974088a46d42b903418eJohann//     virtual void TearDown() { ... }
177531b362b15af34006e6a11974088a46d42b903418eJohann//     ...
177541b362b15af34006e6a11974088a46d42b903418eJohann//   };
177551b362b15af34006e6a11974088a46d42b903418eJohann//
177561b362b15af34006e6a11974088a46d42b903418eJohann//   TEST_F(FooTest, Bar) { ... }
177571b362b15af34006e6a11974088a46d42b903418eJohann//   TEST_F(FooTest, Baz) { ... }
177581b362b15af34006e6a11974088a46d42b903418eJohann//
177591b362b15af34006e6a11974088a46d42b903418eJohann// Test is not copyable.
177601b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ Test {
177611b362b15af34006e6a11974088a46d42b903418eJohann public:
177621b362b15af34006e6a11974088a46d42b903418eJohann  friend class TestInfo;
177631b362b15af34006e6a11974088a46d42b903418eJohann
177641b362b15af34006e6a11974088a46d42b903418eJohann  // Defines types for pointers to functions that set up and tear down
177651b362b15af34006e6a11974088a46d42b903418eJohann  // a test case.
177661b362b15af34006e6a11974088a46d42b903418eJohann  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
177671b362b15af34006e6a11974088a46d42b903418eJohann  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
177681b362b15af34006e6a11974088a46d42b903418eJohann
177691b362b15af34006e6a11974088a46d42b903418eJohann  // The d'tor is virtual as we intend to inherit from Test.
177701b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~Test();
177711b362b15af34006e6a11974088a46d42b903418eJohann
177721b362b15af34006e6a11974088a46d42b903418eJohann  // Sets up the stuff shared by all tests in this test case.
177731b362b15af34006e6a11974088a46d42b903418eJohann  //
177741b362b15af34006e6a11974088a46d42b903418eJohann  // Google Test will call Foo::SetUpTestCase() before running the first
177751b362b15af34006e6a11974088a46d42b903418eJohann  // test in test case Foo.  Hence a sub-class can define its own
177761b362b15af34006e6a11974088a46d42b903418eJohann  // SetUpTestCase() method to shadow the one defined in the super
177771b362b15af34006e6a11974088a46d42b903418eJohann  // class.
177781b362b15af34006e6a11974088a46d42b903418eJohann  static void SetUpTestCase() {}
177791b362b15af34006e6a11974088a46d42b903418eJohann
177801b362b15af34006e6a11974088a46d42b903418eJohann  // Tears down the stuff shared by all tests in this test case.
177811b362b15af34006e6a11974088a46d42b903418eJohann  //
177821b362b15af34006e6a11974088a46d42b903418eJohann  // Google Test will call Foo::TearDownTestCase() after running the last
177831b362b15af34006e6a11974088a46d42b903418eJohann  // test in test case Foo.  Hence a sub-class can define its own
177841b362b15af34006e6a11974088a46d42b903418eJohann  // TearDownTestCase() method to shadow the one defined in the super
177851b362b15af34006e6a11974088a46d42b903418eJohann  // class.
177861b362b15af34006e6a11974088a46d42b903418eJohann  static void TearDownTestCase() {}
177871b362b15af34006e6a11974088a46d42b903418eJohann
177881b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the current test has a fatal failure.
177891b362b15af34006e6a11974088a46d42b903418eJohann  static bool HasFatalFailure();
177901b362b15af34006e6a11974088a46d42b903418eJohann
177911b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the current test has a non-fatal failure.
177921b362b15af34006e6a11974088a46d42b903418eJohann  static bool HasNonfatalFailure();
177931b362b15af34006e6a11974088a46d42b903418eJohann
177941b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the current test has a (either fatal or
177951b362b15af34006e6a11974088a46d42b903418eJohann  // non-fatal) failure.
177961b362b15af34006e6a11974088a46d42b903418eJohann  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
177971b362b15af34006e6a11974088a46d42b903418eJohann
177985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Logs a property for the current test, test case, or for the entire
177995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // invocation of the test program when used outside of the context of a
178005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test case.  Only the last value for a given key is remembered.  These
178015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // are public static so they can be called from utility functions that are
178025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // not members of the test fixture.  Calls to RecordProperty made during
178035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // lifespan of the test (from the moment its constructor starts to the
178045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // moment its destructor finishes) will be output in XML as attributes of
178055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the <testcase> element.  Properties recorded from fixture's
178065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // SetUpTestCase or TearDownTestCase are logged as attributes of the
178075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // corresponding <testsuite> element.  Calls to RecordProperty made in the
178085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // global context (before or after invocation of RUN_ALL_TESTS and from
178095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // SetUp/TearDown method of Environment objects registered with Google
178105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Test) will be output as attributes of the <testsuites> element.
178115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void RecordProperty(const std::string& key, const std::string& value);
178125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void RecordProperty(const std::string& key, int value);
178131b362b15af34006e6a11974088a46d42b903418eJohann
178141b362b15af34006e6a11974088a46d42b903418eJohann protected:
178151b362b15af34006e6a11974088a46d42b903418eJohann  // Creates a Test object.
178161b362b15af34006e6a11974088a46d42b903418eJohann  Test();
178171b362b15af34006e6a11974088a46d42b903418eJohann
178181b362b15af34006e6a11974088a46d42b903418eJohann  // Sets up the test fixture.
178191b362b15af34006e6a11974088a46d42b903418eJohann  virtual void SetUp();
178201b362b15af34006e6a11974088a46d42b903418eJohann
178211b362b15af34006e6a11974088a46d42b903418eJohann  // Tears down the test fixture.
178221b362b15af34006e6a11974088a46d42b903418eJohann  virtual void TearDown();
178231b362b15af34006e6a11974088a46d42b903418eJohann
178241b362b15af34006e6a11974088a46d42b903418eJohann private:
178251b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the current test has the same fixture class as
178261b362b15af34006e6a11974088a46d42b903418eJohann  // the first test in the current test case.
178271b362b15af34006e6a11974088a46d42b903418eJohann  static bool HasSameFixtureClass();
178281b362b15af34006e6a11974088a46d42b903418eJohann
178291b362b15af34006e6a11974088a46d42b903418eJohann  // Runs the test after the test fixture has been set up.
178301b362b15af34006e6a11974088a46d42b903418eJohann  //
178311b362b15af34006e6a11974088a46d42b903418eJohann  // A sub-class must implement this to define the test logic.
178321b362b15af34006e6a11974088a46d42b903418eJohann  //
178331b362b15af34006e6a11974088a46d42b903418eJohann  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
178341b362b15af34006e6a11974088a46d42b903418eJohann  // Instead, use the TEST or TEST_F macro.
178351b362b15af34006e6a11974088a46d42b903418eJohann  virtual void TestBody() = 0;
178361b362b15af34006e6a11974088a46d42b903418eJohann
178371b362b15af34006e6a11974088a46d42b903418eJohann  // Sets up, executes, and tears down the test.
178381b362b15af34006e6a11974088a46d42b903418eJohann  void Run();
178391b362b15af34006e6a11974088a46d42b903418eJohann
178401b362b15af34006e6a11974088a46d42b903418eJohann  // Deletes self.  We deliberately pick an unusual name for this
178411b362b15af34006e6a11974088a46d42b903418eJohann  // internal method to avoid clashing with names used in user TESTs.
178421b362b15af34006e6a11974088a46d42b903418eJohann  void DeleteSelf_() { delete this; }
178431b362b15af34006e6a11974088a46d42b903418eJohann
178441b362b15af34006e6a11974088a46d42b903418eJohann  // Uses a GTestFlagSaver to save and restore all Google Test flags.
178451b362b15af34006e6a11974088a46d42b903418eJohann  const internal::GTestFlagSaver* const gtest_flag_saver_;
178461b362b15af34006e6a11974088a46d42b903418eJohann
178471b362b15af34006e6a11974088a46d42b903418eJohann  // Often a user mis-spells SetUp() as Setup() and spends a long time
178481b362b15af34006e6a11974088a46d42b903418eJohann  // wondering why it is never called by Google Test.  The declaration of
178491b362b15af34006e6a11974088a46d42b903418eJohann  // the following method is solely for catching such an error at
178501b362b15af34006e6a11974088a46d42b903418eJohann  // compile time:
178511b362b15af34006e6a11974088a46d42b903418eJohann  //
178521b362b15af34006e6a11974088a46d42b903418eJohann  //   - The return type is deliberately chosen to be not void, so it
178531b362b15af34006e6a11974088a46d42b903418eJohann  //   will be a conflict if a user declares void Setup() in his test
178541b362b15af34006e6a11974088a46d42b903418eJohann  //   fixture.
178551b362b15af34006e6a11974088a46d42b903418eJohann  //
178561b362b15af34006e6a11974088a46d42b903418eJohann  //   - This method is private, so it will be another compiler error
178571b362b15af34006e6a11974088a46d42b903418eJohann  //   if a user calls it from his test fixture.
178581b362b15af34006e6a11974088a46d42b903418eJohann  //
178591b362b15af34006e6a11974088a46d42b903418eJohann  // DO NOT OVERRIDE THIS FUNCTION.
178601b362b15af34006e6a11974088a46d42b903418eJohann  //
178611b362b15af34006e6a11974088a46d42b903418eJohann  // If you see an error about overriding the following function or
178621b362b15af34006e6a11974088a46d42b903418eJohann  // about it being private, you have mis-spelled SetUp() as Setup().
178631b362b15af34006e6a11974088a46d42b903418eJohann  struct Setup_should_be_spelled_SetUp {};
178641b362b15af34006e6a11974088a46d42b903418eJohann  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
178651b362b15af34006e6a11974088a46d42b903418eJohann
178661b362b15af34006e6a11974088a46d42b903418eJohann  // We disallow copying Tests.
178671b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
178681b362b15af34006e6a11974088a46d42b903418eJohann};
178691b362b15af34006e6a11974088a46d42b903418eJohann
178701b362b15af34006e6a11974088a46d42b903418eJohanntypedef internal::TimeInMillis TimeInMillis;
178711b362b15af34006e6a11974088a46d42b903418eJohann
178721b362b15af34006e6a11974088a46d42b903418eJohann// A copyable object representing a user specified test property which can be
178731b362b15af34006e6a11974088a46d42b903418eJohann// output as a key/value string pair.
178741b362b15af34006e6a11974088a46d42b903418eJohann//
178751b362b15af34006e6a11974088a46d42b903418eJohann// Don't inherit from TestProperty as its destructor is not virtual.
178761b362b15af34006e6a11974088a46d42b903418eJohannclass TestProperty {
178771b362b15af34006e6a11974088a46d42b903418eJohann public:
178781b362b15af34006e6a11974088a46d42b903418eJohann  // C'tor.  TestProperty does NOT have a default constructor.
178791b362b15af34006e6a11974088a46d42b903418eJohann  // Always use this constructor (with parameters) to create a
178801b362b15af34006e6a11974088a46d42b903418eJohann  // TestProperty object.
178815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestProperty(const std::string& a_key, const std::string& a_value) :
178821b362b15af34006e6a11974088a46d42b903418eJohann    key_(a_key), value_(a_value) {
178831b362b15af34006e6a11974088a46d42b903418eJohann  }
178841b362b15af34006e6a11974088a46d42b903418eJohann
178851b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the user supplied key.
178861b362b15af34006e6a11974088a46d42b903418eJohann  const char* key() const {
178871b362b15af34006e6a11974088a46d42b903418eJohann    return key_.c_str();
178881b362b15af34006e6a11974088a46d42b903418eJohann  }
178891b362b15af34006e6a11974088a46d42b903418eJohann
178901b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the user supplied value.
178911b362b15af34006e6a11974088a46d42b903418eJohann  const char* value() const {
178921b362b15af34006e6a11974088a46d42b903418eJohann    return value_.c_str();
178931b362b15af34006e6a11974088a46d42b903418eJohann  }
178941b362b15af34006e6a11974088a46d42b903418eJohann
178951b362b15af34006e6a11974088a46d42b903418eJohann  // Sets a new value, overriding the one supplied in the constructor.
178965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void SetValue(const std::string& new_value) {
178971b362b15af34006e6a11974088a46d42b903418eJohann    value_ = new_value;
178981b362b15af34006e6a11974088a46d42b903418eJohann  }
178991b362b15af34006e6a11974088a46d42b903418eJohann
179001b362b15af34006e6a11974088a46d42b903418eJohann private:
179011b362b15af34006e6a11974088a46d42b903418eJohann  // The key supplied by the user.
179025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string key_;
179031b362b15af34006e6a11974088a46d42b903418eJohann  // The value supplied by the user.
179045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string value_;
179051b362b15af34006e6a11974088a46d42b903418eJohann};
179061b362b15af34006e6a11974088a46d42b903418eJohann
179071b362b15af34006e6a11974088a46d42b903418eJohann// The result of a single Test.  This includes a list of
179081b362b15af34006e6a11974088a46d42b903418eJohann// TestPartResults, a list of TestProperties, a count of how many
179091b362b15af34006e6a11974088a46d42b903418eJohann// death tests there are in the Test, and how much time it took to run
179101b362b15af34006e6a11974088a46d42b903418eJohann// the Test.
179111b362b15af34006e6a11974088a46d42b903418eJohann//
179121b362b15af34006e6a11974088a46d42b903418eJohann// TestResult is not copyable.
179131b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ TestResult {
179141b362b15af34006e6a11974088a46d42b903418eJohann public:
179151b362b15af34006e6a11974088a46d42b903418eJohann  // Creates an empty TestResult.
179161b362b15af34006e6a11974088a46d42b903418eJohann  TestResult();
179171b362b15af34006e6a11974088a46d42b903418eJohann
179181b362b15af34006e6a11974088a46d42b903418eJohann  // D'tor.  Do not inherit from TestResult.
179191b362b15af34006e6a11974088a46d42b903418eJohann  ~TestResult();
179201b362b15af34006e6a11974088a46d42b903418eJohann
179211b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of all test parts.  This is the sum of the number
179221b362b15af34006e6a11974088a46d42b903418eJohann  // of successful test parts and the number of failed test parts.
179231b362b15af34006e6a11974088a46d42b903418eJohann  int total_part_count() const;
179241b362b15af34006e6a11974088a46d42b903418eJohann
179251b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the number of the test properties.
179261b362b15af34006e6a11974088a46d42b903418eJohann  int test_property_count() const;
179271b362b15af34006e6a11974088a46d42b903418eJohann
179281b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the test passed (i.e. no test part failed).
179291b362b15af34006e6a11974088a46d42b903418eJohann  bool Passed() const { return !Failed(); }
179301b362b15af34006e6a11974088a46d42b903418eJohann
179311b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the test failed.
179321b362b15af34006e6a11974088a46d42b903418eJohann  bool Failed() const;
179331b362b15af34006e6a11974088a46d42b903418eJohann
179341b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the test fatally failed.
179351b362b15af34006e6a11974088a46d42b903418eJohann  bool HasFatalFailure() const;
179361b362b15af34006e6a11974088a46d42b903418eJohann
179371b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the test has a non-fatal failure.
179381b362b15af34006e6a11974088a46d42b903418eJohann  bool HasNonfatalFailure() const;
179391b362b15af34006e6a11974088a46d42b903418eJohann
179401b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the elapsed time, in milliseconds.
179411b362b15af34006e6a11974088a46d42b903418eJohann  TimeInMillis elapsed_time() const { return elapsed_time_; }
179421b362b15af34006e6a11974088a46d42b903418eJohann
179431b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the i-th test part result among all the results. i can range
179441b362b15af34006e6a11974088a46d42b903418eJohann  // from 0 to test_property_count() - 1. If i is not in that range, aborts
179451b362b15af34006e6a11974088a46d42b903418eJohann  // the program.
179461b362b15af34006e6a11974088a46d42b903418eJohann  const TestPartResult& GetTestPartResult(int i) const;
179471b362b15af34006e6a11974088a46d42b903418eJohann
179481b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the i-th test property. i can range from 0 to
179491b362b15af34006e6a11974088a46d42b903418eJohann  // test_property_count() - 1. If i is not in that range, aborts the
179501b362b15af34006e6a11974088a46d42b903418eJohann  // program.
179511b362b15af34006e6a11974088a46d42b903418eJohann  const TestProperty& GetTestProperty(int i) const;
179521b362b15af34006e6a11974088a46d42b903418eJohann
179531b362b15af34006e6a11974088a46d42b903418eJohann private:
179541b362b15af34006e6a11974088a46d42b903418eJohann  friend class TestInfo;
179555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class TestCase;
179561b362b15af34006e6a11974088a46d42b903418eJohann  friend class UnitTest;
179571b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::DefaultGlobalTestPartResultReporter;
179581b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::ExecDeathTest;
179591b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::TestResultAccessor;
179601b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::UnitTestImpl;
179611b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::WindowsDeathTest;
179621b362b15af34006e6a11974088a46d42b903418eJohann
179631b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the vector of TestPartResults.
179641b362b15af34006e6a11974088a46d42b903418eJohann  const std::vector<TestPartResult>& test_part_results() const {
179651b362b15af34006e6a11974088a46d42b903418eJohann    return test_part_results_;
179661b362b15af34006e6a11974088a46d42b903418eJohann  }
179671b362b15af34006e6a11974088a46d42b903418eJohann
179681b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the vector of TestProperties.
179691b362b15af34006e6a11974088a46d42b903418eJohann  const std::vector<TestProperty>& test_properties() const {
179701b362b15af34006e6a11974088a46d42b903418eJohann    return test_properties_;
179711b362b15af34006e6a11974088a46d42b903418eJohann  }
179721b362b15af34006e6a11974088a46d42b903418eJohann
179731b362b15af34006e6a11974088a46d42b903418eJohann  // Sets the elapsed time.
179741b362b15af34006e6a11974088a46d42b903418eJohann  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
179751b362b15af34006e6a11974088a46d42b903418eJohann
179761b362b15af34006e6a11974088a46d42b903418eJohann  // Adds a test property to the list. The property is validated and may add
179771b362b15af34006e6a11974088a46d42b903418eJohann  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
179781b362b15af34006e6a11974088a46d42b903418eJohann  // key names). If a property is already recorded for the same key, the
179791b362b15af34006e6a11974088a46d42b903418eJohann  // value will be updated, rather than storing multiple values for the same
179805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // key.  xml_element specifies the element for which the property is being
179815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // recorded and is used for validation.
179825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RecordProperty(const std::string& xml_element,
179835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      const TestProperty& test_property);
179841b362b15af34006e6a11974088a46d42b903418eJohann
179851b362b15af34006e6a11974088a46d42b903418eJohann  // Adds a failure if the key is a reserved attribute of Google Test
179861b362b15af34006e6a11974088a46d42b903418eJohann  // testcase tags.  Returns true if the property is valid.
179871b362b15af34006e6a11974088a46d42b903418eJohann  // TODO(russr): Validate attribute names are legal and human readable.
179885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool ValidateTestProperty(const std::string& xml_element,
179895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const TestProperty& test_property);
179901b362b15af34006e6a11974088a46d42b903418eJohann
179911b362b15af34006e6a11974088a46d42b903418eJohann  // Adds a test part result to the list.
179921b362b15af34006e6a11974088a46d42b903418eJohann  void AddTestPartResult(const TestPartResult& test_part_result);
179931b362b15af34006e6a11974088a46d42b903418eJohann
179941b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the death test count.
179951b362b15af34006e6a11974088a46d42b903418eJohann  int death_test_count() const { return death_test_count_; }
179961b362b15af34006e6a11974088a46d42b903418eJohann
179971b362b15af34006e6a11974088a46d42b903418eJohann  // Increments the death test count, returning the new count.
179981b362b15af34006e6a11974088a46d42b903418eJohann  int increment_death_test_count() { return ++death_test_count_; }
179991b362b15af34006e6a11974088a46d42b903418eJohann
180001b362b15af34006e6a11974088a46d42b903418eJohann  // Clears the test part results.
180011b362b15af34006e6a11974088a46d42b903418eJohann  void ClearTestPartResults();
180021b362b15af34006e6a11974088a46d42b903418eJohann
180031b362b15af34006e6a11974088a46d42b903418eJohann  // Clears the object.
180041b362b15af34006e6a11974088a46d42b903418eJohann  void Clear();
180051b362b15af34006e6a11974088a46d42b903418eJohann
180061b362b15af34006e6a11974088a46d42b903418eJohann  // Protects mutable state of the property vector and of owned
180071b362b15af34006e6a11974088a46d42b903418eJohann  // properties, whose values may be updated.
180081b362b15af34006e6a11974088a46d42b903418eJohann  internal::Mutex test_properites_mutex_;
180091b362b15af34006e6a11974088a46d42b903418eJohann
180101b362b15af34006e6a11974088a46d42b903418eJohann  // The vector of TestPartResults
180111b362b15af34006e6a11974088a46d42b903418eJohann  std::vector<TestPartResult> test_part_results_;
180121b362b15af34006e6a11974088a46d42b903418eJohann  // The vector of TestProperties
180131b362b15af34006e6a11974088a46d42b903418eJohann  std::vector<TestProperty> test_properties_;
180141b362b15af34006e6a11974088a46d42b903418eJohann  // Running count of death tests.
180151b362b15af34006e6a11974088a46d42b903418eJohann  int death_test_count_;
180161b362b15af34006e6a11974088a46d42b903418eJohann  // The elapsed time, in milliseconds.
180171b362b15af34006e6a11974088a46d42b903418eJohann  TimeInMillis elapsed_time_;
180181b362b15af34006e6a11974088a46d42b903418eJohann
180191b362b15af34006e6a11974088a46d42b903418eJohann  // We disallow copying TestResult.
180201b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
180211b362b15af34006e6a11974088a46d42b903418eJohann};  // class TestResult
180221b362b15af34006e6a11974088a46d42b903418eJohann
180231b362b15af34006e6a11974088a46d42b903418eJohann// A TestInfo object stores the following information about a test:
180241b362b15af34006e6a11974088a46d42b903418eJohann//
180251b362b15af34006e6a11974088a46d42b903418eJohann//   Test case name
180261b362b15af34006e6a11974088a46d42b903418eJohann//   Test name
180271b362b15af34006e6a11974088a46d42b903418eJohann//   Whether the test should be run
180281b362b15af34006e6a11974088a46d42b903418eJohann//   A function pointer that creates the test object when invoked
180291b362b15af34006e6a11974088a46d42b903418eJohann//   Test result
180301b362b15af34006e6a11974088a46d42b903418eJohann//
180311b362b15af34006e6a11974088a46d42b903418eJohann// The constructor of TestInfo registers itself with the UnitTest
180321b362b15af34006e6a11974088a46d42b903418eJohann// singleton such that the RUN_ALL_TESTS() macro knows which tests to
180331b362b15af34006e6a11974088a46d42b903418eJohann// run.
180341b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ TestInfo {
180351b362b15af34006e6a11974088a46d42b903418eJohann public:
180361b362b15af34006e6a11974088a46d42b903418eJohann  // Destructs a TestInfo object.  This function is not virtual, so
180371b362b15af34006e6a11974088a46d42b903418eJohann  // don't inherit from TestInfo.
180381b362b15af34006e6a11974088a46d42b903418eJohann  ~TestInfo();
180391b362b15af34006e6a11974088a46d42b903418eJohann
180401b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the test case name.
180411b362b15af34006e6a11974088a46d42b903418eJohann  const char* test_case_name() const { return test_case_name_.c_str(); }
180421b362b15af34006e6a11974088a46d42b903418eJohann
180431b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the test name.
180441b362b15af34006e6a11974088a46d42b903418eJohann  const char* name() const { return name_.c_str(); }
180451b362b15af34006e6a11974088a46d42b903418eJohann
180461b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the name of the parameter type, or NULL if this is not a typed
180471b362b15af34006e6a11974088a46d42b903418eJohann  // or a type-parameterized test.
180481b362b15af34006e6a11974088a46d42b903418eJohann  const char* type_param() const {
180491b362b15af34006e6a11974088a46d42b903418eJohann    if (type_param_.get() != NULL)
180501b362b15af34006e6a11974088a46d42b903418eJohann      return type_param_->c_str();
180511b362b15af34006e6a11974088a46d42b903418eJohann    return NULL;
180521b362b15af34006e6a11974088a46d42b903418eJohann  }
180531b362b15af34006e6a11974088a46d42b903418eJohann
180541b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the text representation of the value parameter, or NULL if this
180551b362b15af34006e6a11974088a46d42b903418eJohann  // is not a value-parameterized test.
180561b362b15af34006e6a11974088a46d42b903418eJohann  const char* value_param() const {
180571b362b15af34006e6a11974088a46d42b903418eJohann    if (value_param_.get() != NULL)
180581b362b15af34006e6a11974088a46d42b903418eJohann      return value_param_->c_str();
180591b362b15af34006e6a11974088a46d42b903418eJohann    return NULL;
180601b362b15af34006e6a11974088a46d42b903418eJohann  }
180611b362b15af34006e6a11974088a46d42b903418eJohann
180625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if this test should run, that is if the test is not
180635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // disabled (or it is disabled but the also_run_disabled_tests flag has
180645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // been specified) and its full name matches the user-specified filter.
180651b362b15af34006e6a11974088a46d42b903418eJohann  //
180661b362b15af34006e6a11974088a46d42b903418eJohann  // Google Test allows the user to filter the tests by their full names.
180671b362b15af34006e6a11974088a46d42b903418eJohann  // The full name of a test Bar in test case Foo is defined as
180681b362b15af34006e6a11974088a46d42b903418eJohann  // "Foo.Bar".  Only the tests that match the filter will run.
180691b362b15af34006e6a11974088a46d42b903418eJohann  //
180701b362b15af34006e6a11974088a46d42b903418eJohann  // A filter is a colon-separated list of glob (not regex) patterns,
180711b362b15af34006e6a11974088a46d42b903418eJohann  // optionally followed by a '-' and a colon-separated list of
180721b362b15af34006e6a11974088a46d42b903418eJohann  // negative patterns (tests to exclude).  A test is run if it
180731b362b15af34006e6a11974088a46d42b903418eJohann  // matches one of the positive patterns and does not match any of
180741b362b15af34006e6a11974088a46d42b903418eJohann  // the negative patterns.
180751b362b15af34006e6a11974088a46d42b903418eJohann  //
180761b362b15af34006e6a11974088a46d42b903418eJohann  // For example, *A*:Foo.* is a filter that matches any string that
180771b362b15af34006e6a11974088a46d42b903418eJohann  // contains the character 'A' or starts with "Foo.".
180781b362b15af34006e6a11974088a46d42b903418eJohann  bool should_run() const { return should_run_; }
180791b362b15af34006e6a11974088a46d42b903418eJohann
180805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff this test will appear in the XML report.
180815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool is_reportable() const {
180825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // For now, the XML report includes all tests matching the filter.
180835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // In the future, we may trim tests that are excluded because of
180845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // sharding.
180855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return matches_filter_;
180865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
180875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
180881b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the result of the test.
180891b362b15af34006e6a11974088a46d42b903418eJohann  const TestResult* result() const { return &result_; }
180901b362b15af34006e6a11974088a46d42b903418eJohann
180911b362b15af34006e6a11974088a46d42b903418eJohann private:
180921b362b15af34006e6a11974088a46d42b903418eJohann#if GTEST_HAS_DEATH_TEST
180931b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::DefaultDeathTestFactory;
180941b362b15af34006e6a11974088a46d42b903418eJohann#endif  // GTEST_HAS_DEATH_TEST
180951b362b15af34006e6a11974088a46d42b903418eJohann  friend class Test;
180961b362b15af34006e6a11974088a46d42b903418eJohann  friend class TestCase;
180971b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::UnitTestImpl;
180985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class internal::StreamingListenerTest;
180991b362b15af34006e6a11974088a46d42b903418eJohann  friend TestInfo* internal::MakeAndRegisterTestInfo(
181005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* test_case_name,
181015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* name,
181021b362b15af34006e6a11974088a46d42b903418eJohann      const char* type_param,
181031b362b15af34006e6a11974088a46d42b903418eJohann      const char* value_param,
181041b362b15af34006e6a11974088a46d42b903418eJohann      internal::TypeId fixture_class_id,
181051b362b15af34006e6a11974088a46d42b903418eJohann      Test::SetUpTestCaseFunc set_up_tc,
181061b362b15af34006e6a11974088a46d42b903418eJohann      Test::TearDownTestCaseFunc tear_down_tc,
181071b362b15af34006e6a11974088a46d42b903418eJohann      internal::TestFactoryBase* factory);
181081b362b15af34006e6a11974088a46d42b903418eJohann
181091b362b15af34006e6a11974088a46d42b903418eJohann  // Constructs a TestInfo object. The newly constructed instance assumes
181101b362b15af34006e6a11974088a46d42b903418eJohann  // ownership of the factory object.
181115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestInfo(const std::string& test_case_name,
181125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           const std::string& name,
181135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           const char* a_type_param,   // NULL if not a type-parameterized test
181145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           const char* a_value_param,  // NULL if not a value-parameterized test
181151b362b15af34006e6a11974088a46d42b903418eJohann           internal::TypeId fixture_class_id,
181161b362b15af34006e6a11974088a46d42b903418eJohann           internal::TestFactoryBase* factory);
181171b362b15af34006e6a11974088a46d42b903418eJohann
181181b362b15af34006e6a11974088a46d42b903418eJohann  // Increments the number of death tests encountered in this test so
181191b362b15af34006e6a11974088a46d42b903418eJohann  // far.
181201b362b15af34006e6a11974088a46d42b903418eJohann  int increment_death_test_count() {
181211b362b15af34006e6a11974088a46d42b903418eJohann    return result_.increment_death_test_count();
181221b362b15af34006e6a11974088a46d42b903418eJohann  }
181231b362b15af34006e6a11974088a46d42b903418eJohann
181241b362b15af34006e6a11974088a46d42b903418eJohann  // Creates the test object, runs it, records its result, and then
181251b362b15af34006e6a11974088a46d42b903418eJohann  // deletes it.
181261b362b15af34006e6a11974088a46d42b903418eJohann  void Run();
181271b362b15af34006e6a11974088a46d42b903418eJohann
181281b362b15af34006e6a11974088a46d42b903418eJohann  static void ClearTestResult(TestInfo* test_info) {
181291b362b15af34006e6a11974088a46d42b903418eJohann    test_info->result_.Clear();
181301b362b15af34006e6a11974088a46d42b903418eJohann  }
181311b362b15af34006e6a11974088a46d42b903418eJohann
181321b362b15af34006e6a11974088a46d42b903418eJohann  // These fields are immutable properties of the test.
181331b362b15af34006e6a11974088a46d42b903418eJohann  const std::string test_case_name_;     // Test case name
181341b362b15af34006e6a11974088a46d42b903418eJohann  const std::string name_;               // Test name
181351b362b15af34006e6a11974088a46d42b903418eJohann  // Name of the parameter type, or NULL if this is not a typed or a
181361b362b15af34006e6a11974088a46d42b903418eJohann  // type-parameterized test.
181371b362b15af34006e6a11974088a46d42b903418eJohann  const internal::scoped_ptr<const ::std::string> type_param_;
181381b362b15af34006e6a11974088a46d42b903418eJohann  // Text representation of the value parameter, or NULL if this is not a
181391b362b15af34006e6a11974088a46d42b903418eJohann  // value-parameterized test.
181401b362b15af34006e6a11974088a46d42b903418eJohann  const internal::scoped_ptr<const ::std::string> value_param_;
181411b362b15af34006e6a11974088a46d42b903418eJohann  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
181421b362b15af34006e6a11974088a46d42b903418eJohann  bool should_run_;                 // True iff this test should run
181431b362b15af34006e6a11974088a46d42b903418eJohann  bool is_disabled_;                // True iff this test is disabled
181441b362b15af34006e6a11974088a46d42b903418eJohann  bool matches_filter_;             // True if this test matches the
181451b362b15af34006e6a11974088a46d42b903418eJohann                                    // user-specified filter.
181461b362b15af34006e6a11974088a46d42b903418eJohann  internal::TestFactoryBase* const factory_;  // The factory that creates
181471b362b15af34006e6a11974088a46d42b903418eJohann                                              // the test object
181481b362b15af34006e6a11974088a46d42b903418eJohann
181491b362b15af34006e6a11974088a46d42b903418eJohann  // This field is mutable and needs to be reset before running the
181501b362b15af34006e6a11974088a46d42b903418eJohann  // test for the second time.
181511b362b15af34006e6a11974088a46d42b903418eJohann  TestResult result_;
181521b362b15af34006e6a11974088a46d42b903418eJohann
181531b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
181541b362b15af34006e6a11974088a46d42b903418eJohann};
181551b362b15af34006e6a11974088a46d42b903418eJohann
181561b362b15af34006e6a11974088a46d42b903418eJohann// A test case, which consists of a vector of TestInfos.
181571b362b15af34006e6a11974088a46d42b903418eJohann//
181581b362b15af34006e6a11974088a46d42b903418eJohann// TestCase is not copyable.
181591b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ TestCase {
181601b362b15af34006e6a11974088a46d42b903418eJohann public:
181611b362b15af34006e6a11974088a46d42b903418eJohann  // Creates a TestCase with the given name.
181621b362b15af34006e6a11974088a46d42b903418eJohann  //
181631b362b15af34006e6a11974088a46d42b903418eJohann  // TestCase does NOT have a default constructor.  Always use this
181641b362b15af34006e6a11974088a46d42b903418eJohann  // constructor to create a TestCase object.
181651b362b15af34006e6a11974088a46d42b903418eJohann  //
181661b362b15af34006e6a11974088a46d42b903418eJohann  // Arguments:
181671b362b15af34006e6a11974088a46d42b903418eJohann  //
181681b362b15af34006e6a11974088a46d42b903418eJohann  //   name:         name of the test case
181691b362b15af34006e6a11974088a46d42b903418eJohann  //   a_type_param: the name of the test's type parameter, or NULL if
181701b362b15af34006e6a11974088a46d42b903418eJohann  //                 this is not a type-parameterized test.
181711b362b15af34006e6a11974088a46d42b903418eJohann  //   set_up_tc:    pointer to the function that sets up the test case
181721b362b15af34006e6a11974088a46d42b903418eJohann  //   tear_down_tc: pointer to the function that tears down the test case
181731b362b15af34006e6a11974088a46d42b903418eJohann  TestCase(const char* name, const char* a_type_param,
181741b362b15af34006e6a11974088a46d42b903418eJohann           Test::SetUpTestCaseFunc set_up_tc,
181751b362b15af34006e6a11974088a46d42b903418eJohann           Test::TearDownTestCaseFunc tear_down_tc);
181761b362b15af34006e6a11974088a46d42b903418eJohann
181771b362b15af34006e6a11974088a46d42b903418eJohann  // Destructor of TestCase.
181781b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~TestCase();
181791b362b15af34006e6a11974088a46d42b903418eJohann
181801b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the name of the TestCase.
181811b362b15af34006e6a11974088a46d42b903418eJohann  const char* name() const { return name_.c_str(); }
181821b362b15af34006e6a11974088a46d42b903418eJohann
181831b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the name of the parameter type, or NULL if this is not a
181841b362b15af34006e6a11974088a46d42b903418eJohann  // type-parameterized test case.
181851b362b15af34006e6a11974088a46d42b903418eJohann  const char* type_param() const {
181861b362b15af34006e6a11974088a46d42b903418eJohann    if (type_param_.get() != NULL)
181871b362b15af34006e6a11974088a46d42b903418eJohann      return type_param_->c_str();
181881b362b15af34006e6a11974088a46d42b903418eJohann    return NULL;
181891b362b15af34006e6a11974088a46d42b903418eJohann  }
181901b362b15af34006e6a11974088a46d42b903418eJohann
181911b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true if any test in this test case should run.
181921b362b15af34006e6a11974088a46d42b903418eJohann  bool should_run() const { return should_run_; }
181931b362b15af34006e6a11974088a46d42b903418eJohann
181941b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of successful tests in this test case.
181951b362b15af34006e6a11974088a46d42b903418eJohann  int successful_test_count() const;
181961b362b15af34006e6a11974088a46d42b903418eJohann
181971b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of failed tests in this test case.
181981b362b15af34006e6a11974088a46d42b903418eJohann  int failed_test_count() const;
181991b362b15af34006e6a11974088a46d42b903418eJohann
182005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of disabled tests that will be reported in the XML report.
182015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int reportable_disabled_test_count() const;
182025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
182031b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of disabled tests in this test case.
182041b362b15af34006e6a11974088a46d42b903418eJohann  int disabled_test_count() const;
182051b362b15af34006e6a11974088a46d42b903418eJohann
182065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of tests to be printed in the XML report.
182075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int reportable_test_count() const;
182085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
182091b362b15af34006e6a11974088a46d42b903418eJohann  // Get the number of tests in this test case that should run.
182101b362b15af34006e6a11974088a46d42b903418eJohann  int test_to_run_count() const;
182111b362b15af34006e6a11974088a46d42b903418eJohann
182121b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of all tests in this test case.
182131b362b15af34006e6a11974088a46d42b903418eJohann  int total_test_count() const;
182141b362b15af34006e6a11974088a46d42b903418eJohann
182151b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the test case passed.
182161b362b15af34006e6a11974088a46d42b903418eJohann  bool Passed() const { return !Failed(); }
182171b362b15af34006e6a11974088a46d42b903418eJohann
182181b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the test case failed.
182191b362b15af34006e6a11974088a46d42b903418eJohann  bool Failed() const { return failed_test_count() > 0; }
182201b362b15af34006e6a11974088a46d42b903418eJohann
182211b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the elapsed time, in milliseconds.
182221b362b15af34006e6a11974088a46d42b903418eJohann  TimeInMillis elapsed_time() const { return elapsed_time_; }
182231b362b15af34006e6a11974088a46d42b903418eJohann
182241b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the i-th test among all the tests. i can range from 0 to
182251b362b15af34006e6a11974088a46d42b903418eJohann  // total_test_count() - 1. If i is not in that range, returns NULL.
182261b362b15af34006e6a11974088a46d42b903418eJohann  const TestInfo* GetTestInfo(int i) const;
182271b362b15af34006e6a11974088a46d42b903418eJohann
182285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the TestResult that holds test properties recorded during
182295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // execution of SetUpTestCase and TearDownTestCase.
182305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
182315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
182321b362b15af34006e6a11974088a46d42b903418eJohann private:
182331b362b15af34006e6a11974088a46d42b903418eJohann  friend class Test;
182341b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::UnitTestImpl;
182351b362b15af34006e6a11974088a46d42b903418eJohann
182361b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the (mutable) vector of TestInfos in this TestCase.
182371b362b15af34006e6a11974088a46d42b903418eJohann  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
182381b362b15af34006e6a11974088a46d42b903418eJohann
182391b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the (immutable) vector of TestInfos in this TestCase.
182401b362b15af34006e6a11974088a46d42b903418eJohann  const std::vector<TestInfo*>& test_info_list() const {
182411b362b15af34006e6a11974088a46d42b903418eJohann    return test_info_list_;
182421b362b15af34006e6a11974088a46d42b903418eJohann  }
182431b362b15af34006e6a11974088a46d42b903418eJohann
182441b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the i-th test among all the tests. i can range from 0 to
182451b362b15af34006e6a11974088a46d42b903418eJohann  // total_test_count() - 1. If i is not in that range, returns NULL.
182461b362b15af34006e6a11974088a46d42b903418eJohann  TestInfo* GetMutableTestInfo(int i);
182471b362b15af34006e6a11974088a46d42b903418eJohann
182481b362b15af34006e6a11974088a46d42b903418eJohann  // Sets the should_run member.
182491b362b15af34006e6a11974088a46d42b903418eJohann  void set_should_run(bool should) { should_run_ = should; }
182501b362b15af34006e6a11974088a46d42b903418eJohann
182511b362b15af34006e6a11974088a46d42b903418eJohann  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
182521b362b15af34006e6a11974088a46d42b903418eJohann  // destruction of the TestCase object.
182531b362b15af34006e6a11974088a46d42b903418eJohann  void AddTestInfo(TestInfo * test_info);
182541b362b15af34006e6a11974088a46d42b903418eJohann
182551b362b15af34006e6a11974088a46d42b903418eJohann  // Clears the results of all tests in this test case.
182561b362b15af34006e6a11974088a46d42b903418eJohann  void ClearResult();
182571b362b15af34006e6a11974088a46d42b903418eJohann
182581b362b15af34006e6a11974088a46d42b903418eJohann  // Clears the results of all tests in the given test case.
182591b362b15af34006e6a11974088a46d42b903418eJohann  static void ClearTestCaseResult(TestCase* test_case) {
182601b362b15af34006e6a11974088a46d42b903418eJohann    test_case->ClearResult();
182611b362b15af34006e6a11974088a46d42b903418eJohann  }
182621b362b15af34006e6a11974088a46d42b903418eJohann
182631b362b15af34006e6a11974088a46d42b903418eJohann  // Runs every test in this TestCase.
182641b362b15af34006e6a11974088a46d42b903418eJohann  void Run();
182651b362b15af34006e6a11974088a46d42b903418eJohann
182661b362b15af34006e6a11974088a46d42b903418eJohann  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
182671b362b15af34006e6a11974088a46d42b903418eJohann  // for catching exceptions thrown from SetUpTestCase().
182681b362b15af34006e6a11974088a46d42b903418eJohann  void RunSetUpTestCase() { (*set_up_tc_)(); }
182691b362b15af34006e6a11974088a46d42b903418eJohann
182701b362b15af34006e6a11974088a46d42b903418eJohann  // Runs TearDownTestCase() for this TestCase.  This wrapper is
182711b362b15af34006e6a11974088a46d42b903418eJohann  // needed for catching exceptions thrown from TearDownTestCase().
182721b362b15af34006e6a11974088a46d42b903418eJohann  void RunTearDownTestCase() { (*tear_down_tc_)(); }
182731b362b15af34006e6a11974088a46d42b903418eJohann
182741b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff test passed.
182751b362b15af34006e6a11974088a46d42b903418eJohann  static bool TestPassed(const TestInfo* test_info) {
182761b362b15af34006e6a11974088a46d42b903418eJohann    return test_info->should_run() && test_info->result()->Passed();
182771b362b15af34006e6a11974088a46d42b903418eJohann  }
182781b362b15af34006e6a11974088a46d42b903418eJohann
182791b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff test failed.
182801b362b15af34006e6a11974088a46d42b903418eJohann  static bool TestFailed(const TestInfo* test_info) {
182811b362b15af34006e6a11974088a46d42b903418eJohann    return test_info->should_run() && test_info->result()->Failed();
182821b362b15af34006e6a11974088a46d42b903418eJohann  }
182831b362b15af34006e6a11974088a46d42b903418eJohann
182845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test is disabled and will be reported in the XML
182855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // report.
182865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool TestReportableDisabled(const TestInfo* test_info) {
182875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return test_info->is_reportable() && test_info->is_disabled_;
182885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
182895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
182901b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff test is disabled.
182911b362b15af34006e6a11974088a46d42b903418eJohann  static bool TestDisabled(const TestInfo* test_info) {
182921b362b15af34006e6a11974088a46d42b903418eJohann    return test_info->is_disabled_;
182931b362b15af34006e6a11974088a46d42b903418eJohann  }
182941b362b15af34006e6a11974088a46d42b903418eJohann
182955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff this test will appear in the XML report.
182965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool TestReportable(const TestInfo* test_info) {
182975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return test_info->is_reportable();
182985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
182995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
183001b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true if the given test should run.
183011b362b15af34006e6a11974088a46d42b903418eJohann  static bool ShouldRunTest(const TestInfo* test_info) {
183021b362b15af34006e6a11974088a46d42b903418eJohann    return test_info->should_run();
183031b362b15af34006e6a11974088a46d42b903418eJohann  }
183041b362b15af34006e6a11974088a46d42b903418eJohann
183051b362b15af34006e6a11974088a46d42b903418eJohann  // Shuffles the tests in this test case.
183061b362b15af34006e6a11974088a46d42b903418eJohann  void ShuffleTests(internal::Random* random);
183071b362b15af34006e6a11974088a46d42b903418eJohann
183081b362b15af34006e6a11974088a46d42b903418eJohann  // Restores the test order to before the first shuffle.
183091b362b15af34006e6a11974088a46d42b903418eJohann  void UnshuffleTests();
183101b362b15af34006e6a11974088a46d42b903418eJohann
183111b362b15af34006e6a11974088a46d42b903418eJohann  // Name of the test case.
183125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string name_;
183131b362b15af34006e6a11974088a46d42b903418eJohann  // Name of the parameter type, or NULL if this is not a typed or a
183141b362b15af34006e6a11974088a46d42b903418eJohann  // type-parameterized test.
183151b362b15af34006e6a11974088a46d42b903418eJohann  const internal::scoped_ptr<const ::std::string> type_param_;
183161b362b15af34006e6a11974088a46d42b903418eJohann  // The vector of TestInfos in their original order.  It owns the
183171b362b15af34006e6a11974088a46d42b903418eJohann  // elements in the vector.
183181b362b15af34006e6a11974088a46d42b903418eJohann  std::vector<TestInfo*> test_info_list_;
183191b362b15af34006e6a11974088a46d42b903418eJohann  // Provides a level of indirection for the test list to allow easy
183201b362b15af34006e6a11974088a46d42b903418eJohann  // shuffling and restoring the test order.  The i-th element in this
183211b362b15af34006e6a11974088a46d42b903418eJohann  // vector is the index of the i-th test in the shuffled test list.
183221b362b15af34006e6a11974088a46d42b903418eJohann  std::vector<int> test_indices_;
183231b362b15af34006e6a11974088a46d42b903418eJohann  // Pointer to the function that sets up the test case.
183241b362b15af34006e6a11974088a46d42b903418eJohann  Test::SetUpTestCaseFunc set_up_tc_;
183251b362b15af34006e6a11974088a46d42b903418eJohann  // Pointer to the function that tears down the test case.
183261b362b15af34006e6a11974088a46d42b903418eJohann  Test::TearDownTestCaseFunc tear_down_tc_;
183271b362b15af34006e6a11974088a46d42b903418eJohann  // True iff any test in this test case should run.
183281b362b15af34006e6a11974088a46d42b903418eJohann  bool should_run_;
183291b362b15af34006e6a11974088a46d42b903418eJohann  // Elapsed time, in milliseconds.
183301b362b15af34006e6a11974088a46d42b903418eJohann  TimeInMillis elapsed_time_;
183315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Holds test properties recorded during execution of SetUpTestCase and
183325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TearDownTestCase.
183335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestResult ad_hoc_test_result_;
183341b362b15af34006e6a11974088a46d42b903418eJohann
183351b362b15af34006e6a11974088a46d42b903418eJohann  // We disallow copying TestCases.
183361b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
183371b362b15af34006e6a11974088a46d42b903418eJohann};
183381b362b15af34006e6a11974088a46d42b903418eJohann
183391b362b15af34006e6a11974088a46d42b903418eJohann// An Environment object is capable of setting up and tearing down an
183401b362b15af34006e6a11974088a46d42b903418eJohann// environment.  The user should subclass this to define his own
183411b362b15af34006e6a11974088a46d42b903418eJohann// environment(s).
183421b362b15af34006e6a11974088a46d42b903418eJohann//
183431b362b15af34006e6a11974088a46d42b903418eJohann// An Environment object does the set-up and tear-down in virtual
183441b362b15af34006e6a11974088a46d42b903418eJohann// methods SetUp() and TearDown() instead of the constructor and the
183451b362b15af34006e6a11974088a46d42b903418eJohann// destructor, as:
183461b362b15af34006e6a11974088a46d42b903418eJohann//
183471b362b15af34006e6a11974088a46d42b903418eJohann//   1. You cannot safely throw from a destructor.  This is a problem
183481b362b15af34006e6a11974088a46d42b903418eJohann//      as in some cases Google Test is used where exceptions are enabled, and
183491b362b15af34006e6a11974088a46d42b903418eJohann//      we may want to implement ASSERT_* using exceptions where they are
183501b362b15af34006e6a11974088a46d42b903418eJohann//      available.
183511b362b15af34006e6a11974088a46d42b903418eJohann//   2. You cannot use ASSERT_* directly in a constructor or
183521b362b15af34006e6a11974088a46d42b903418eJohann//      destructor.
183531b362b15af34006e6a11974088a46d42b903418eJohannclass Environment {
183541b362b15af34006e6a11974088a46d42b903418eJohann public:
183551b362b15af34006e6a11974088a46d42b903418eJohann  // The d'tor is virtual as we need to subclass Environment.
183561b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~Environment() {}
183571b362b15af34006e6a11974088a46d42b903418eJohann
183581b362b15af34006e6a11974088a46d42b903418eJohann  // Override this to define how to set up the environment.
183591b362b15af34006e6a11974088a46d42b903418eJohann  virtual void SetUp() {}
183601b362b15af34006e6a11974088a46d42b903418eJohann
183611b362b15af34006e6a11974088a46d42b903418eJohann  // Override this to define how to tear down the environment.
183621b362b15af34006e6a11974088a46d42b903418eJohann  virtual void TearDown() {}
183631b362b15af34006e6a11974088a46d42b903418eJohann private:
183641b362b15af34006e6a11974088a46d42b903418eJohann  // If you see an error about overriding the following function or
183651b362b15af34006e6a11974088a46d42b903418eJohann  // about it being private, you have mis-spelled SetUp() as Setup().
183661b362b15af34006e6a11974088a46d42b903418eJohann  struct Setup_should_be_spelled_SetUp {};
183671b362b15af34006e6a11974088a46d42b903418eJohann  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
183681b362b15af34006e6a11974088a46d42b903418eJohann};
183691b362b15af34006e6a11974088a46d42b903418eJohann
183701b362b15af34006e6a11974088a46d42b903418eJohann// The interface for tracing execution of tests. The methods are organized in
183711b362b15af34006e6a11974088a46d42b903418eJohann// the order the corresponding events are fired.
183721b362b15af34006e6a11974088a46d42b903418eJohannclass TestEventListener {
183731b362b15af34006e6a11974088a46d42b903418eJohann public:
183741b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~TestEventListener() {}
183751b362b15af34006e6a11974088a46d42b903418eJohann
183761b362b15af34006e6a11974088a46d42b903418eJohann  // Fired before any test activity starts.
183771b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
183781b362b15af34006e6a11974088a46d42b903418eJohann
183791b362b15af34006e6a11974088a46d42b903418eJohann  // Fired before each iteration of tests starts.  There may be more than
183801b362b15af34006e6a11974088a46d42b903418eJohann  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
183811b362b15af34006e6a11974088a46d42b903418eJohann  // index, starting from 0.
183821b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestIterationStart(const UnitTest& unit_test,
183831b362b15af34006e6a11974088a46d42b903418eJohann                                    int iteration) = 0;
183841b362b15af34006e6a11974088a46d42b903418eJohann
183851b362b15af34006e6a11974088a46d42b903418eJohann  // Fired before environment set-up for each iteration of tests starts.
183861b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
183871b362b15af34006e6a11974088a46d42b903418eJohann
183881b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after environment set-up for each iteration of tests ends.
183891b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
183901b362b15af34006e6a11974088a46d42b903418eJohann
183911b362b15af34006e6a11974088a46d42b903418eJohann  // Fired before the test case starts.
183921b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
183931b362b15af34006e6a11974088a46d42b903418eJohann
183941b362b15af34006e6a11974088a46d42b903418eJohann  // Fired before the test starts.
183951b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestStart(const TestInfo& test_info) = 0;
183961b362b15af34006e6a11974088a46d42b903418eJohann
183971b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after a failed assertion or a SUCCEED() invocation.
183981b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
183991b362b15af34006e6a11974088a46d42b903418eJohann
184001b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after the test ends.
184011b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestEnd(const TestInfo& test_info) = 0;
184021b362b15af34006e6a11974088a46d42b903418eJohann
184031b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after the test case ends.
184041b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
184051b362b15af34006e6a11974088a46d42b903418eJohann
184061b362b15af34006e6a11974088a46d42b903418eJohann  // Fired before environment tear-down for each iteration of tests starts.
184071b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
184081b362b15af34006e6a11974088a46d42b903418eJohann
184091b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after environment tear-down for each iteration of tests ends.
184101b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
184111b362b15af34006e6a11974088a46d42b903418eJohann
184121b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after each iteration of tests finishes.
184131b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestIterationEnd(const UnitTest& unit_test,
184141b362b15af34006e6a11974088a46d42b903418eJohann                                  int iteration) = 0;
184151b362b15af34006e6a11974088a46d42b903418eJohann
184161b362b15af34006e6a11974088a46d42b903418eJohann  // Fired after all test activities have ended.
184171b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
184181b362b15af34006e6a11974088a46d42b903418eJohann};
184191b362b15af34006e6a11974088a46d42b903418eJohann
184201b362b15af34006e6a11974088a46d42b903418eJohann// The convenience class for users who need to override just one or two
184211b362b15af34006e6a11974088a46d42b903418eJohann// methods and are not concerned that a possible change to a signature of
184221b362b15af34006e6a11974088a46d42b903418eJohann// the methods they override will not be caught during the build.  For
184231b362b15af34006e6a11974088a46d42b903418eJohann// comments about each method please see the definition of TestEventListener
184241b362b15af34006e6a11974088a46d42b903418eJohann// above.
184251b362b15af34006e6a11974088a46d42b903418eJohannclass EmptyTestEventListener : public TestEventListener {
184261b362b15af34006e6a11974088a46d42b903418eJohann public:
184271b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
184281b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
184291b362b15af34006e6a11974088a46d42b903418eJohann                                    int /*iteration*/) {}
184301b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
184311b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
184321b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
184331b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
184341b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
184351b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
184361b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
184371b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
184381b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
184391b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
184401b362b15af34006e6a11974088a46d42b903418eJohann                                  int /*iteration*/) {}
184411b362b15af34006e6a11974088a46d42b903418eJohann  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
184421b362b15af34006e6a11974088a46d42b903418eJohann};
184431b362b15af34006e6a11974088a46d42b903418eJohann
184441b362b15af34006e6a11974088a46d42b903418eJohann// TestEventListeners lets users add listeners to track events in Google Test.
184451b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ TestEventListeners {
184461b362b15af34006e6a11974088a46d42b903418eJohann public:
184471b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListeners();
184481b362b15af34006e6a11974088a46d42b903418eJohann  ~TestEventListeners();
184491b362b15af34006e6a11974088a46d42b903418eJohann
184501b362b15af34006e6a11974088a46d42b903418eJohann  // Appends an event listener to the end of the list. Google Test assumes
184511b362b15af34006e6a11974088a46d42b903418eJohann  // the ownership of the listener (i.e. it will delete the listener when
184521b362b15af34006e6a11974088a46d42b903418eJohann  // the test program finishes).
184531b362b15af34006e6a11974088a46d42b903418eJohann  void Append(TestEventListener* listener);
184541b362b15af34006e6a11974088a46d42b903418eJohann
184551b362b15af34006e6a11974088a46d42b903418eJohann  // Removes the given event listener from the list and returns it.  It then
184561b362b15af34006e6a11974088a46d42b903418eJohann  // becomes the caller's responsibility to delete the listener. Returns
184571b362b15af34006e6a11974088a46d42b903418eJohann  // NULL if the listener is not found in the list.
184581b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListener* Release(TestEventListener* listener);
184591b362b15af34006e6a11974088a46d42b903418eJohann
184601b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the standard listener responsible for the default console
184611b362b15af34006e6a11974088a46d42b903418eJohann  // output.  Can be removed from the listeners list to shut down default
184621b362b15af34006e6a11974088a46d42b903418eJohann  // console output.  Note that removing this object from the listener list
184631b362b15af34006e6a11974088a46d42b903418eJohann  // with Release transfers its ownership to the caller and makes this
184641b362b15af34006e6a11974088a46d42b903418eJohann  // function return NULL the next time.
184651b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListener* default_result_printer() const {
184661b362b15af34006e6a11974088a46d42b903418eJohann    return default_result_printer_;
184671b362b15af34006e6a11974088a46d42b903418eJohann  }
184681b362b15af34006e6a11974088a46d42b903418eJohann
184691b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the standard listener responsible for the default XML output
184701b362b15af34006e6a11974088a46d42b903418eJohann  // controlled by the --gtest_output=xml flag.  Can be removed from the
184711b362b15af34006e6a11974088a46d42b903418eJohann  // listeners list by users who want to shut down the default XML output
184721b362b15af34006e6a11974088a46d42b903418eJohann  // controlled by this flag and substitute it with custom one.  Note that
184731b362b15af34006e6a11974088a46d42b903418eJohann  // removing this object from the listener list with Release transfers its
184741b362b15af34006e6a11974088a46d42b903418eJohann  // ownership to the caller and makes this function return NULL the next
184751b362b15af34006e6a11974088a46d42b903418eJohann  // time.
184761b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListener* default_xml_generator() const {
184771b362b15af34006e6a11974088a46d42b903418eJohann    return default_xml_generator_;
184781b362b15af34006e6a11974088a46d42b903418eJohann  }
184791b362b15af34006e6a11974088a46d42b903418eJohann
184801b362b15af34006e6a11974088a46d42b903418eJohann private:
184811b362b15af34006e6a11974088a46d42b903418eJohann  friend class TestCase;
184821b362b15af34006e6a11974088a46d42b903418eJohann  friend class TestInfo;
184831b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::DefaultGlobalTestPartResultReporter;
184841b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::NoExecDeathTest;
184851b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::TestEventListenersAccessor;
184861b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::UnitTestImpl;
184871b362b15af34006e6a11974088a46d42b903418eJohann
184881b362b15af34006e6a11974088a46d42b903418eJohann  // Returns repeater that broadcasts the TestEventListener events to all
184891b362b15af34006e6a11974088a46d42b903418eJohann  // subscribers.
184901b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListener* repeater();
184911b362b15af34006e6a11974088a46d42b903418eJohann
184921b362b15af34006e6a11974088a46d42b903418eJohann  // Sets the default_result_printer attribute to the provided listener.
184931b362b15af34006e6a11974088a46d42b903418eJohann  // The listener is also added to the listener list and previous
184941b362b15af34006e6a11974088a46d42b903418eJohann  // default_result_printer is removed from it and deleted. The listener can
184951b362b15af34006e6a11974088a46d42b903418eJohann  // also be NULL in which case it will not be added to the list. Does
184961b362b15af34006e6a11974088a46d42b903418eJohann  // nothing if the previous and the current listener objects are the same.
184971b362b15af34006e6a11974088a46d42b903418eJohann  void SetDefaultResultPrinter(TestEventListener* listener);
184981b362b15af34006e6a11974088a46d42b903418eJohann
184991b362b15af34006e6a11974088a46d42b903418eJohann  // Sets the default_xml_generator attribute to the provided listener.  The
185001b362b15af34006e6a11974088a46d42b903418eJohann  // listener is also added to the listener list and previous
185011b362b15af34006e6a11974088a46d42b903418eJohann  // default_xml_generator is removed from it and deleted. The listener can
185021b362b15af34006e6a11974088a46d42b903418eJohann  // also be NULL in which case it will not be added to the list. Does
185031b362b15af34006e6a11974088a46d42b903418eJohann  // nothing if the previous and the current listener objects are the same.
185041b362b15af34006e6a11974088a46d42b903418eJohann  void SetDefaultXmlGenerator(TestEventListener* listener);
185051b362b15af34006e6a11974088a46d42b903418eJohann
185061b362b15af34006e6a11974088a46d42b903418eJohann  // Controls whether events will be forwarded by the repeater to the
185071b362b15af34006e6a11974088a46d42b903418eJohann  // listeners in the list.
185081b362b15af34006e6a11974088a46d42b903418eJohann  bool EventForwardingEnabled() const;
185091b362b15af34006e6a11974088a46d42b903418eJohann  void SuppressEventForwarding();
185101b362b15af34006e6a11974088a46d42b903418eJohann
185111b362b15af34006e6a11974088a46d42b903418eJohann  // The actual list of listeners.
185121b362b15af34006e6a11974088a46d42b903418eJohann  internal::TestEventRepeater* repeater_;
185131b362b15af34006e6a11974088a46d42b903418eJohann  // Listener responsible for the standard result output.
185141b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListener* default_result_printer_;
185151b362b15af34006e6a11974088a46d42b903418eJohann  // Listener responsible for the creation of the XML output file.
185161b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListener* default_xml_generator_;
185171b362b15af34006e6a11974088a46d42b903418eJohann
185181b362b15af34006e6a11974088a46d42b903418eJohann  // We disallow copying TestEventListeners.
185191b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
185201b362b15af34006e6a11974088a46d42b903418eJohann};
185211b362b15af34006e6a11974088a46d42b903418eJohann
185221b362b15af34006e6a11974088a46d42b903418eJohann// A UnitTest consists of a vector of TestCases.
185231b362b15af34006e6a11974088a46d42b903418eJohann//
185241b362b15af34006e6a11974088a46d42b903418eJohann// This is a singleton class.  The only instance of UnitTest is
185251b362b15af34006e6a11974088a46d42b903418eJohann// created when UnitTest::GetInstance() is first called.  This
185261b362b15af34006e6a11974088a46d42b903418eJohann// instance is never deleted.
185271b362b15af34006e6a11974088a46d42b903418eJohann//
185281b362b15af34006e6a11974088a46d42b903418eJohann// UnitTest is not copyable.
185291b362b15af34006e6a11974088a46d42b903418eJohann//
185301b362b15af34006e6a11974088a46d42b903418eJohann// This class is thread-safe as long as the methods are called
185311b362b15af34006e6a11974088a46d42b903418eJohann// according to their specification.
185321b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ UnitTest {
185331b362b15af34006e6a11974088a46d42b903418eJohann public:
185341b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the singleton UnitTest object.  The first time this method
185351b362b15af34006e6a11974088a46d42b903418eJohann  // is called, a UnitTest object is constructed and returned.
185361b362b15af34006e6a11974088a46d42b903418eJohann  // Consecutive calls will return the same object.
185371b362b15af34006e6a11974088a46d42b903418eJohann  static UnitTest* GetInstance();
185381b362b15af34006e6a11974088a46d42b903418eJohann
185391b362b15af34006e6a11974088a46d42b903418eJohann  // Runs all tests in this UnitTest object and prints the result.
185401b362b15af34006e6a11974088a46d42b903418eJohann  // Returns 0 if successful, or 1 otherwise.
185411b362b15af34006e6a11974088a46d42b903418eJohann  //
185421b362b15af34006e6a11974088a46d42b903418eJohann  // This method can only be called from the main thread.
185431b362b15af34006e6a11974088a46d42b903418eJohann  //
185441b362b15af34006e6a11974088a46d42b903418eJohann  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
185451b362b15af34006e6a11974088a46d42b903418eJohann  int Run() GTEST_MUST_USE_RESULT_;
185461b362b15af34006e6a11974088a46d42b903418eJohann
185471b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the working directory when the first TEST() or TEST_F()
185481b362b15af34006e6a11974088a46d42b903418eJohann  // was executed.  The UnitTest object owns the string.
185491b362b15af34006e6a11974088a46d42b903418eJohann  const char* original_working_dir() const;
185501b362b15af34006e6a11974088a46d42b903418eJohann
185511b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the TestCase object for the test that's currently running,
185521b362b15af34006e6a11974088a46d42b903418eJohann  // or NULL if no test is running.
185535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestCase* current_test_case() const
185545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
185551b362b15af34006e6a11974088a46d42b903418eJohann
185561b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the TestInfo object for the test that's currently running,
185571b362b15af34006e6a11974088a46d42b903418eJohann  // or NULL if no test is running.
185585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestInfo* current_test_info() const
185595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
185601b362b15af34006e6a11974088a46d42b903418eJohann
185611b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the random seed used at the start of the current test run.
185621b362b15af34006e6a11974088a46d42b903418eJohann  int random_seed() const;
185631b362b15af34006e6a11974088a46d42b903418eJohann
185641b362b15af34006e6a11974088a46d42b903418eJohann#if GTEST_HAS_PARAM_TEST
185651b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the ParameterizedTestCaseRegistry object used to keep track of
185661b362b15af34006e6a11974088a46d42b903418eJohann  // value-parameterized tests and instantiate and register them.
185671b362b15af34006e6a11974088a46d42b903418eJohann  //
185681b362b15af34006e6a11974088a46d42b903418eJohann  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
185695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
185705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
185711b362b15af34006e6a11974088a46d42b903418eJohann#endif  // GTEST_HAS_PARAM_TEST
185721b362b15af34006e6a11974088a46d42b903418eJohann
185731b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of successful test cases.
185741b362b15af34006e6a11974088a46d42b903418eJohann  int successful_test_case_count() const;
185751b362b15af34006e6a11974088a46d42b903418eJohann
185761b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of failed test cases.
185771b362b15af34006e6a11974088a46d42b903418eJohann  int failed_test_case_count() const;
185781b362b15af34006e6a11974088a46d42b903418eJohann
185791b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of all test cases.
185801b362b15af34006e6a11974088a46d42b903418eJohann  int total_test_case_count() const;
185811b362b15af34006e6a11974088a46d42b903418eJohann
185821b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of all test cases that contain at least one test
185831b362b15af34006e6a11974088a46d42b903418eJohann  // that should run.
185841b362b15af34006e6a11974088a46d42b903418eJohann  int test_case_to_run_count() const;
185851b362b15af34006e6a11974088a46d42b903418eJohann
185861b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of successful tests.
185871b362b15af34006e6a11974088a46d42b903418eJohann  int successful_test_count() const;
185881b362b15af34006e6a11974088a46d42b903418eJohann
185891b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of failed tests.
185901b362b15af34006e6a11974088a46d42b903418eJohann  int failed_test_count() const;
185911b362b15af34006e6a11974088a46d42b903418eJohann
185925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of disabled tests that will be reported in the XML report.
185935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int reportable_disabled_test_count() const;
185945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
185951b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of disabled tests.
185961b362b15af34006e6a11974088a46d42b903418eJohann  int disabled_test_count() const;
185971b362b15af34006e6a11974088a46d42b903418eJohann
185985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of tests to be printed in the XML report.
185995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int reportable_test_count() const;
186005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
186011b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of all tests.
186021b362b15af34006e6a11974088a46d42b903418eJohann  int total_test_count() const;
186031b362b15af34006e6a11974088a46d42b903418eJohann
186041b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the number of tests that should run.
186051b362b15af34006e6a11974088a46d42b903418eJohann  int test_to_run_count() const;
186061b362b15af34006e6a11974088a46d42b903418eJohann
186075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the time of the test program start, in ms from the start of the
186085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UNIX epoch.
186095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TimeInMillis start_timestamp() const;
186105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
186111b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the elapsed time, in milliseconds.
186121b362b15af34006e6a11974088a46d42b903418eJohann  TimeInMillis elapsed_time() const;
186131b362b15af34006e6a11974088a46d42b903418eJohann
186141b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the unit test passed (i.e. all test cases passed).
186151b362b15af34006e6a11974088a46d42b903418eJohann  bool Passed() const;
186161b362b15af34006e6a11974088a46d42b903418eJohann
186171b362b15af34006e6a11974088a46d42b903418eJohann  // Returns true iff the unit test failed (i.e. some test case failed
186181b362b15af34006e6a11974088a46d42b903418eJohann  // or something outside of all tests failed).
186191b362b15af34006e6a11974088a46d42b903418eJohann  bool Failed() const;
186201b362b15af34006e6a11974088a46d42b903418eJohann
186211b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the i-th test case among all the test cases. i can range from 0 to
186221b362b15af34006e6a11974088a46d42b903418eJohann  // total_test_case_count() - 1. If i is not in that range, returns NULL.
186231b362b15af34006e6a11974088a46d42b903418eJohann  const TestCase* GetTestCase(int i) const;
186241b362b15af34006e6a11974088a46d42b903418eJohann
186255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the TestResult containing information on test failures and
186265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // properties logged outside of individual test cases.
186275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestResult& ad_hoc_test_result() const;
186285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
186291b362b15af34006e6a11974088a46d42b903418eJohann  // Returns the list of event listeners that can be used to track events
186301b362b15af34006e6a11974088a46d42b903418eJohann  // inside Google Test.
186311b362b15af34006e6a11974088a46d42b903418eJohann  TestEventListeners& listeners();
186321b362b15af34006e6a11974088a46d42b903418eJohann
186331b362b15af34006e6a11974088a46d42b903418eJohann private:
186341b362b15af34006e6a11974088a46d42b903418eJohann  // Registers and returns a global test environment.  When a test
186351b362b15af34006e6a11974088a46d42b903418eJohann  // program is run, all global test environments will be set-up in
186361b362b15af34006e6a11974088a46d42b903418eJohann  // the order they were registered.  After all tests in the program
186371b362b15af34006e6a11974088a46d42b903418eJohann  // have finished, all global test environments will be torn-down in
186381b362b15af34006e6a11974088a46d42b903418eJohann  // the *reverse* order they were registered.
186391b362b15af34006e6a11974088a46d42b903418eJohann  //
186401b362b15af34006e6a11974088a46d42b903418eJohann  // The UnitTest object takes ownership of the given environment.
186411b362b15af34006e6a11974088a46d42b903418eJohann  //
186421b362b15af34006e6a11974088a46d42b903418eJohann  // This method can only be called from the main thread.
186431b362b15af34006e6a11974088a46d42b903418eJohann  Environment* AddEnvironment(Environment* env);
186441b362b15af34006e6a11974088a46d42b903418eJohann
186451b362b15af34006e6a11974088a46d42b903418eJohann  // Adds a TestPartResult to the current TestResult object.  All
186461b362b15af34006e6a11974088a46d42b903418eJohann  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
186471b362b15af34006e6a11974088a46d42b903418eJohann  // eventually call this to report their results.  The user code
186481b362b15af34006e6a11974088a46d42b903418eJohann  // should use the assertion macros instead of calling this directly.
186491b362b15af34006e6a11974088a46d42b903418eJohann  void AddTestPartResult(TestPartResult::Type result_type,
186501b362b15af34006e6a11974088a46d42b903418eJohann                         const char* file_name,
186511b362b15af34006e6a11974088a46d42b903418eJohann                         int line_number,
186525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         const std::string& message,
186535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         const std::string& os_stack_trace)
186545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
186551b362b15af34006e6a11974088a46d42b903418eJohann
186565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Adds a TestProperty to the current TestResult object when invoked from
186575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
186585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // from SetUpTestCase or TearDownTestCase, or to the global property set
186595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // when invoked elsewhere.  If the result already contains a property with
186605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the same key, the value will be updated.
186615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RecordProperty(const std::string& key, const std::string& value);
186621b362b15af34006e6a11974088a46d42b903418eJohann
186631b362b15af34006e6a11974088a46d42b903418eJohann  // Gets the i-th test case among all the test cases. i can range from 0 to
186641b362b15af34006e6a11974088a46d42b903418eJohann  // total_test_case_count() - 1. If i is not in that range, returns NULL.
186651b362b15af34006e6a11974088a46d42b903418eJohann  TestCase* GetMutableTestCase(int i);
186661b362b15af34006e6a11974088a46d42b903418eJohann
186671b362b15af34006e6a11974088a46d42b903418eJohann  // Accessors for the implementation object.
186681b362b15af34006e6a11974088a46d42b903418eJohann  internal::UnitTestImpl* impl() { return impl_; }
186691b362b15af34006e6a11974088a46d42b903418eJohann  const internal::UnitTestImpl* impl() const { return impl_; }
186701b362b15af34006e6a11974088a46d42b903418eJohann
186711b362b15af34006e6a11974088a46d42b903418eJohann  // These classes and funcions are friends as they need to access private
186721b362b15af34006e6a11974088a46d42b903418eJohann  // members of UnitTest.
186731b362b15af34006e6a11974088a46d42b903418eJohann  friend class Test;
186741b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::AssertHelper;
186751b362b15af34006e6a11974088a46d42b903418eJohann  friend class internal::ScopedTrace;
186765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class internal::StreamingListenerTest;
186775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class internal::UnitTestRecordPropertyTestHelper;
186781b362b15af34006e6a11974088a46d42b903418eJohann  friend Environment* AddGlobalTestEnvironment(Environment* env);
186791b362b15af34006e6a11974088a46d42b903418eJohann  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
186801b362b15af34006e6a11974088a46d42b903418eJohann  friend void internal::ReportFailureInUnknownLocation(
186811b362b15af34006e6a11974088a46d42b903418eJohann      TestPartResult::Type result_type,
186825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const std::string& message);
186831b362b15af34006e6a11974088a46d42b903418eJohann
186841b362b15af34006e6a11974088a46d42b903418eJohann  // Creates an empty UnitTest.
186851b362b15af34006e6a11974088a46d42b903418eJohann  UnitTest();
186861b362b15af34006e6a11974088a46d42b903418eJohann
186871b362b15af34006e6a11974088a46d42b903418eJohann  // D'tor
186881b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~UnitTest();
186891b362b15af34006e6a11974088a46d42b903418eJohann
186901b362b15af34006e6a11974088a46d42b903418eJohann  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
186911b362b15af34006e6a11974088a46d42b903418eJohann  // Google Test trace stack.
186925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void PushGTestTrace(const internal::TraceInfo& trace)
186935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
186941b362b15af34006e6a11974088a46d42b903418eJohann
186951b362b15af34006e6a11974088a46d42b903418eJohann  // Pops a trace from the per-thread Google Test trace stack.
186965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void PopGTestTrace()
186975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
186981b362b15af34006e6a11974088a46d42b903418eJohann
186991b362b15af34006e6a11974088a46d42b903418eJohann  // Protects mutable state in *impl_.  This is mutable as some const
187001b362b15af34006e6a11974088a46d42b903418eJohann  // methods need to lock it too.
187011b362b15af34006e6a11974088a46d42b903418eJohann  mutable internal::Mutex mutex_;
187021b362b15af34006e6a11974088a46d42b903418eJohann
187031b362b15af34006e6a11974088a46d42b903418eJohann  // Opaque implementation object.  This field is never changed once
187041b362b15af34006e6a11974088a46d42b903418eJohann  // the object is constructed.  We don't mark it as const here, as
187051b362b15af34006e6a11974088a46d42b903418eJohann  // doing so will cause a warning in the constructor of UnitTest.
187061b362b15af34006e6a11974088a46d42b903418eJohann  // Mutable state in *impl_ is protected by mutex_.
187071b362b15af34006e6a11974088a46d42b903418eJohann  internal::UnitTestImpl* impl_;
187081b362b15af34006e6a11974088a46d42b903418eJohann
187091b362b15af34006e6a11974088a46d42b903418eJohann  // We disallow copying UnitTest.
187101b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
187111b362b15af34006e6a11974088a46d42b903418eJohann};
187121b362b15af34006e6a11974088a46d42b903418eJohann
187131b362b15af34006e6a11974088a46d42b903418eJohann// A convenient wrapper for adding an environment for the test
187141b362b15af34006e6a11974088a46d42b903418eJohann// program.
187151b362b15af34006e6a11974088a46d42b903418eJohann//
187161b362b15af34006e6a11974088a46d42b903418eJohann// You should call this before RUN_ALL_TESTS() is called, probably in
187171b362b15af34006e6a11974088a46d42b903418eJohann// main().  If you use gtest_main, you need to call this before main()
187181b362b15af34006e6a11974088a46d42b903418eJohann// starts for it to take effect.  For example, you can define a global
187191b362b15af34006e6a11974088a46d42b903418eJohann// variable like this:
187201b362b15af34006e6a11974088a46d42b903418eJohann//
187211b362b15af34006e6a11974088a46d42b903418eJohann//   testing::Environment* const foo_env =
187221b362b15af34006e6a11974088a46d42b903418eJohann//       testing::AddGlobalTestEnvironment(new FooEnvironment);
187231b362b15af34006e6a11974088a46d42b903418eJohann//
187241b362b15af34006e6a11974088a46d42b903418eJohann// However, we strongly recommend you to write your own main() and
187251b362b15af34006e6a11974088a46d42b903418eJohann// call AddGlobalTestEnvironment() there, as relying on initialization
187261b362b15af34006e6a11974088a46d42b903418eJohann// of global variables makes the code harder to read and may cause
187271b362b15af34006e6a11974088a46d42b903418eJohann// problems when you register multiple environments from different
187281b362b15af34006e6a11974088a46d42b903418eJohann// translation units and the environments have dependencies among them
187291b362b15af34006e6a11974088a46d42b903418eJohann// (remember that the compiler doesn't guarantee the order in which
187301b362b15af34006e6a11974088a46d42b903418eJohann// global variables from different translation units are initialized).
187311b362b15af34006e6a11974088a46d42b903418eJohanninline Environment* AddGlobalTestEnvironment(Environment* env) {
187321b362b15af34006e6a11974088a46d42b903418eJohann  return UnitTest::GetInstance()->AddEnvironment(env);
187331b362b15af34006e6a11974088a46d42b903418eJohann}
187341b362b15af34006e6a11974088a46d42b903418eJohann
187351b362b15af34006e6a11974088a46d42b903418eJohann// Initializes Google Test.  This must be called before calling
187361b362b15af34006e6a11974088a46d42b903418eJohann// RUN_ALL_TESTS().  In particular, it parses a command line for the
187371b362b15af34006e6a11974088a46d42b903418eJohann// flags that Google Test recognizes.  Whenever a Google Test flag is
187381b362b15af34006e6a11974088a46d42b903418eJohann// seen, it is removed from argv, and *argc is decremented.
187391b362b15af34006e6a11974088a46d42b903418eJohann//
187401b362b15af34006e6a11974088a46d42b903418eJohann// No value is returned.  Instead, the Google Test flag variables are
187411b362b15af34006e6a11974088a46d42b903418eJohann// updated.
187421b362b15af34006e6a11974088a46d42b903418eJohann//
187431b362b15af34006e6a11974088a46d42b903418eJohann// Calling the function for the second time has no user-visible effect.
187441b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ void InitGoogleTest(int* argc, char** argv);
187451b362b15af34006e6a11974088a46d42b903418eJohann
187461b362b15af34006e6a11974088a46d42b903418eJohann// This overloaded version can be used in Windows programs compiled in
187471b362b15af34006e6a11974088a46d42b903418eJohann// UNICODE mode.
187481b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
187491b362b15af34006e6a11974088a46d42b903418eJohann
187501b362b15af34006e6a11974088a46d42b903418eJohannnamespace internal {
187511b362b15af34006e6a11974088a46d42b903418eJohann
187525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
187535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value of type ToPrint that is an operand of a comparison assertion
187545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
187555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the comparison, and is used to help determine the best way to
187565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// format the value.  In particular, when the value is a C string
187575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (char pointer) and the other operand is an STL string object, we
187585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// want to format the C string as a string, since we know it is
187595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compared by value with the string object.  If the value is a char
187605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// pointer but the other operand is not an STL string object, we don't
187615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// know whether the pointer is supposed to point to a NUL-terminated
187625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// string, and thus want to print it as a pointer to be safe.
187635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
187645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
187655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
187665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The default case.
187675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename ToPrint, typename OtherOperand>
187685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FormatForComparison {
187695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
187705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static ::std::string Format(const ToPrint& value) {
187715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ::testing::PrintToString(value);
187725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
187735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
187745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
187755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Array.
187765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename ToPrint, size_t N, typename OtherOperand>
187775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FormatForComparison<ToPrint[N], OtherOperand> {
187785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
187795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static ::std::string Format(const ToPrint* value) {
187805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
187815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
187825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
187835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
187845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// By default, print C string as pointers to be safe, as we don't know
187855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// whether they actually point to a NUL-terminated string.
187865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
187875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
187885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename OtherOperand>                                      \
187895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class FormatForComparison<CharType*, OtherOperand> {                  \
187905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:                                                              \
187915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static ::std::string Format(CharType* value) {                      \
187925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return ::testing::PrintToString(static_cast<const void*>(value)); \
187935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }                                                                   \
187945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
187955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
187965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
187975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
187985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
187995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
188005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
188025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If a C string is compared with an STL string object, we know it's meant
188045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to point to a NUL-terminated string, and thus can print it as a string.
188055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
188075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <>                                                           \
188085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class FormatForComparison<CharType*, OtherStringType> {               \
188095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:                                                              \
188105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static ::std::string Format(CharType* value) {                      \
188115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return ::testing::PrintToString(value);                           \
188125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }                                                                   \
188135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
188145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
188165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
188175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_STRING
188195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
188205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
188215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
188225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_WSTRING
188245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
188255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
188265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
188275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
188295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
188305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
188315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
188325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
188345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
188351b362b15af34006e6a11974088a46d42b903418eJohann// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
188361b362b15af34006e6a11974088a46d42b903418eJohann// operand to be used in a failure message.  The type (but not value)
188371b362b15af34006e6a11974088a46d42b903418eJohann// of the other operand may affect the format.  This allows us to
188381b362b15af34006e6a11974088a46d42b903418eJohann// print a char* as a raw pointer when it is compared against another
188395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// char* or void*, and print it as a C string when it is compared
188405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// against an std::string object, for example.
188411b362b15af34006e6a11974088a46d42b903418eJohann//
188421b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
188431b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T1, typename T2>
188445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string FormatForComparisonFailureMessage(
188455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const T1& value, const T2& /* other_operand */) {
188465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FormatForComparison<T1, T2>::Format(value);
188471b362b15af34006e6a11974088a46d42b903418eJohann}
188481b362b15af34006e6a11974088a46d42b903418eJohann
188491b362b15af34006e6a11974088a46d42b903418eJohann// The helper function for {ASSERT|EXPECT}_EQ.
188501b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T1, typename T2>
188511b362b15af34006e6a11974088a46d42b903418eJohannAssertionResult CmpHelperEQ(const char* expected_expression,
188521b362b15af34006e6a11974088a46d42b903418eJohann                            const char* actual_expression,
188531b362b15af34006e6a11974088a46d42b903418eJohann                            const T1& expected,
188541b362b15af34006e6a11974088a46d42b903418eJohann                            const T2& actual) {
188551b362b15af34006e6a11974088a46d42b903418eJohann#ifdef _MSC_VER
188561b362b15af34006e6a11974088a46d42b903418eJohann# pragma warning(push)          // Saves the current warning state.
188571b362b15af34006e6a11974088a46d42b903418eJohann# pragma warning(disable:4389)  // Temporarily disables warning on
188585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                // signed/unsigned mismatch.
188591b362b15af34006e6a11974088a46d42b903418eJohann#endif
188601b362b15af34006e6a11974088a46d42b903418eJohann
188611b362b15af34006e6a11974088a46d42b903418eJohann  if (expected == actual) {
188621b362b15af34006e6a11974088a46d42b903418eJohann    return AssertionSuccess();
188631b362b15af34006e6a11974088a46d42b903418eJohann  }
188641b362b15af34006e6a11974088a46d42b903418eJohann
188651b362b15af34006e6a11974088a46d42b903418eJohann#ifdef _MSC_VER
188661b362b15af34006e6a11974088a46d42b903418eJohann# pragma warning(pop)          // Restores the warning state.
188671b362b15af34006e6a11974088a46d42b903418eJohann#endif
188681b362b15af34006e6a11974088a46d42b903418eJohann
188691b362b15af34006e6a11974088a46d42b903418eJohann  return EqFailure(expected_expression,
188701b362b15af34006e6a11974088a46d42b903418eJohann                   actual_expression,
188711b362b15af34006e6a11974088a46d42b903418eJohann                   FormatForComparisonFailureMessage(expected, actual),
188721b362b15af34006e6a11974088a46d42b903418eJohann                   FormatForComparisonFailureMessage(actual, expected),
188731b362b15af34006e6a11974088a46d42b903418eJohann                   false);
188741b362b15af34006e6a11974088a46d42b903418eJohann}
188751b362b15af34006e6a11974088a46d42b903418eJohann
188761b362b15af34006e6a11974088a46d42b903418eJohann// With this overloaded version, we allow anonymous enums to be used
188771b362b15af34006e6a11974088a46d42b903418eJohann// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
188781b362b15af34006e6a11974088a46d42b903418eJohann// can be implicitly cast to BiggestInt.
188791b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
188801b362b15af34006e6a11974088a46d42b903418eJohann                                       const char* actual_expression,
188811b362b15af34006e6a11974088a46d42b903418eJohann                                       BiggestInt expected,
188821b362b15af34006e6a11974088a46d42b903418eJohann                                       BiggestInt actual);
188831b362b15af34006e6a11974088a46d42b903418eJohann
188841b362b15af34006e6a11974088a46d42b903418eJohann// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
188851b362b15af34006e6a11974088a46d42b903418eJohann// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
188861b362b15af34006e6a11974088a46d42b903418eJohann// is a null pointer literal.  The following default implementation is
188871b362b15af34006e6a11974088a46d42b903418eJohann// for lhs_is_null_literal being false.
188881b362b15af34006e6a11974088a46d42b903418eJohanntemplate <bool lhs_is_null_literal>
188891b362b15af34006e6a11974088a46d42b903418eJohannclass EqHelper {
188901b362b15af34006e6a11974088a46d42b903418eJohann public:
188911b362b15af34006e6a11974088a46d42b903418eJohann  // This templatized version is for the general case.
188921b362b15af34006e6a11974088a46d42b903418eJohann  template <typename T1, typename T2>
188931b362b15af34006e6a11974088a46d42b903418eJohann  static AssertionResult Compare(const char* expected_expression,
188941b362b15af34006e6a11974088a46d42b903418eJohann                                 const char* actual_expression,
188951b362b15af34006e6a11974088a46d42b903418eJohann                                 const T1& expected,
188961b362b15af34006e6a11974088a46d42b903418eJohann                                 const T2& actual) {
188971b362b15af34006e6a11974088a46d42b903418eJohann    return CmpHelperEQ(expected_expression, actual_expression, expected,
188981b362b15af34006e6a11974088a46d42b903418eJohann                       actual);
188991b362b15af34006e6a11974088a46d42b903418eJohann  }
189001b362b15af34006e6a11974088a46d42b903418eJohann
189011b362b15af34006e6a11974088a46d42b903418eJohann  // With this overloaded version, we allow anonymous enums to be used
189021b362b15af34006e6a11974088a46d42b903418eJohann  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
189031b362b15af34006e6a11974088a46d42b903418eJohann  // enums can be implicitly cast to BiggestInt.
189041b362b15af34006e6a11974088a46d42b903418eJohann  //
189051b362b15af34006e6a11974088a46d42b903418eJohann  // Even though its body looks the same as the above version, we
189061b362b15af34006e6a11974088a46d42b903418eJohann  // cannot merge the two, as it will make anonymous enums unhappy.
189071b362b15af34006e6a11974088a46d42b903418eJohann  static AssertionResult Compare(const char* expected_expression,
189081b362b15af34006e6a11974088a46d42b903418eJohann                                 const char* actual_expression,
189091b362b15af34006e6a11974088a46d42b903418eJohann                                 BiggestInt expected,
189101b362b15af34006e6a11974088a46d42b903418eJohann                                 BiggestInt actual) {
189111b362b15af34006e6a11974088a46d42b903418eJohann    return CmpHelperEQ(expected_expression, actual_expression, expected,
189121b362b15af34006e6a11974088a46d42b903418eJohann                       actual);
189131b362b15af34006e6a11974088a46d42b903418eJohann  }
189141b362b15af34006e6a11974088a46d42b903418eJohann};
189151b362b15af34006e6a11974088a46d42b903418eJohann
189161b362b15af34006e6a11974088a46d42b903418eJohann// This specialization is used when the first argument to ASSERT_EQ()
189171b362b15af34006e6a11974088a46d42b903418eJohann// is a null pointer literal, like NULL, false, or 0.
189181b362b15af34006e6a11974088a46d42b903418eJohanntemplate <>
189191b362b15af34006e6a11974088a46d42b903418eJohannclass EqHelper<true> {
189201b362b15af34006e6a11974088a46d42b903418eJohann public:
189211b362b15af34006e6a11974088a46d42b903418eJohann  // We define two overloaded versions of Compare().  The first
189221b362b15af34006e6a11974088a46d42b903418eJohann  // version will be picked when the second argument to ASSERT_EQ() is
189231b362b15af34006e6a11974088a46d42b903418eJohann  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
189241b362b15af34006e6a11974088a46d42b903418eJohann  // EXPECT_EQ(false, a_bool).
189251b362b15af34006e6a11974088a46d42b903418eJohann  template <typename T1, typename T2>
189261b362b15af34006e6a11974088a46d42b903418eJohann  static AssertionResult Compare(
189271b362b15af34006e6a11974088a46d42b903418eJohann      const char* expected_expression,
189281b362b15af34006e6a11974088a46d42b903418eJohann      const char* actual_expression,
189291b362b15af34006e6a11974088a46d42b903418eJohann      const T1& expected,
189301b362b15af34006e6a11974088a46d42b903418eJohann      const T2& actual,
189311b362b15af34006e6a11974088a46d42b903418eJohann      // The following line prevents this overload from being considered if T2
189321b362b15af34006e6a11974088a46d42b903418eJohann      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
189331b362b15af34006e6a11974088a46d42b903418eJohann      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
189341b362b15af34006e6a11974088a46d42b903418eJohann      // to match the Secret* in the other overload, which would otherwise make
189351b362b15af34006e6a11974088a46d42b903418eJohann      // this template match better.
189361b362b15af34006e6a11974088a46d42b903418eJohann      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
189371b362b15af34006e6a11974088a46d42b903418eJohann    return CmpHelperEQ(expected_expression, actual_expression, expected,
189381b362b15af34006e6a11974088a46d42b903418eJohann                       actual);
189391b362b15af34006e6a11974088a46d42b903418eJohann  }
189401b362b15af34006e6a11974088a46d42b903418eJohann
189411b362b15af34006e6a11974088a46d42b903418eJohann  // This version will be picked when the second argument to ASSERT_EQ() is a
189421b362b15af34006e6a11974088a46d42b903418eJohann  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
189431b362b15af34006e6a11974088a46d42b903418eJohann  template <typename T>
189441b362b15af34006e6a11974088a46d42b903418eJohann  static AssertionResult Compare(
189451b362b15af34006e6a11974088a46d42b903418eJohann      const char* expected_expression,
189461b362b15af34006e6a11974088a46d42b903418eJohann      const char* actual_expression,
189471b362b15af34006e6a11974088a46d42b903418eJohann      // We used to have a second template parameter instead of Secret*.  That
189481b362b15af34006e6a11974088a46d42b903418eJohann      // template parameter would deduce to 'long', making this a better match
189491b362b15af34006e6a11974088a46d42b903418eJohann      // than the first overload even without the first overload's EnableIf.
189501b362b15af34006e6a11974088a46d42b903418eJohann      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
189511b362b15af34006e6a11974088a46d42b903418eJohann      // non-pointer argument" (even a deduced integral argument), so the old
189521b362b15af34006e6a11974088a46d42b903418eJohann      // implementation caused warnings in user code.
189531b362b15af34006e6a11974088a46d42b903418eJohann      Secret* /* expected (NULL) */,
189541b362b15af34006e6a11974088a46d42b903418eJohann      T* actual) {
189551b362b15af34006e6a11974088a46d42b903418eJohann    // We already know that 'expected' is a null pointer.
189561b362b15af34006e6a11974088a46d42b903418eJohann    return CmpHelperEQ(expected_expression, actual_expression,
189571b362b15af34006e6a11974088a46d42b903418eJohann                       static_cast<T*>(NULL), actual);
189581b362b15af34006e6a11974088a46d42b903418eJohann  }
189591b362b15af34006e6a11974088a46d42b903418eJohann};
189601b362b15af34006e6a11974088a46d42b903418eJohann
189611b362b15af34006e6a11974088a46d42b903418eJohann// A macro for implementing the helper functions needed to implement
189621b362b15af34006e6a11974088a46d42b903418eJohann// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
189631b362b15af34006e6a11974088a46d42b903418eJohann// of similar code.
189641b362b15af34006e6a11974088a46d42b903418eJohann//
189651b362b15af34006e6a11974088a46d42b903418eJohann// For each templatized helper function, we also define an overloaded
189661b362b15af34006e6a11974088a46d42b903418eJohann// version for BiggestInt in order to reduce code bloat and allow
189671b362b15af34006e6a11974088a46d42b903418eJohann// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
189681b362b15af34006e6a11974088a46d42b903418eJohann// with gcc 4.
189691b362b15af34006e6a11974088a46d42b903418eJohann//
189701b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
189711b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
189721b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T1, typename T2>\
189731b362b15af34006e6a11974088a46d42b903418eJohannAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
189741b362b15af34006e6a11974088a46d42b903418eJohann                                   const T1& val1, const T2& val2) {\
189751b362b15af34006e6a11974088a46d42b903418eJohann  if (val1 op val2) {\
189761b362b15af34006e6a11974088a46d42b903418eJohann    return AssertionSuccess();\
189771b362b15af34006e6a11974088a46d42b903418eJohann  } else {\
189781b362b15af34006e6a11974088a46d42b903418eJohann    return AssertionFailure() \
189791b362b15af34006e6a11974088a46d42b903418eJohann        << "Expected: (" << expr1 << ") " #op " (" << expr2\
189801b362b15af34006e6a11974088a46d42b903418eJohann        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
189811b362b15af34006e6a11974088a46d42b903418eJohann        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
189821b362b15af34006e6a11974088a46d42b903418eJohann  }\
189831b362b15af34006e6a11974088a46d42b903418eJohann}\
189841b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelper##op_name(\
189851b362b15af34006e6a11974088a46d42b903418eJohann    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
189861b362b15af34006e6a11974088a46d42b903418eJohann
189871b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
189881b362b15af34006e6a11974088a46d42b903418eJohann
189891b362b15af34006e6a11974088a46d42b903418eJohann// Implements the helper function for {ASSERT|EXPECT}_NE
189901b362b15af34006e6a11974088a46d42b903418eJohannGTEST_IMPL_CMP_HELPER_(NE, !=);
189911b362b15af34006e6a11974088a46d42b903418eJohann// Implements the helper function for {ASSERT|EXPECT}_LE
189921b362b15af34006e6a11974088a46d42b903418eJohannGTEST_IMPL_CMP_HELPER_(LE, <=);
189931b362b15af34006e6a11974088a46d42b903418eJohann// Implements the helper function for {ASSERT|EXPECT}_LT
189945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(LT, <);
189951b362b15af34006e6a11974088a46d42b903418eJohann// Implements the helper function for {ASSERT|EXPECT}_GE
189961b362b15af34006e6a11974088a46d42b903418eJohannGTEST_IMPL_CMP_HELPER_(GE, >=);
189971b362b15af34006e6a11974088a46d42b903418eJohann// Implements the helper function for {ASSERT|EXPECT}_GT
189985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(GT, >);
189991b362b15af34006e6a11974088a46d42b903418eJohann
190001b362b15af34006e6a11974088a46d42b903418eJohann#undef GTEST_IMPL_CMP_HELPER_
190011b362b15af34006e6a11974088a46d42b903418eJohann
190021b362b15af34006e6a11974088a46d42b903418eJohann// The helper function for {ASSERT|EXPECT}_STREQ.
190031b362b15af34006e6a11974088a46d42b903418eJohann//
190041b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190051b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
190061b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* actual_expression,
190071b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* expected,
190081b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* actual);
190091b362b15af34006e6a11974088a46d42b903418eJohann
190101b362b15af34006e6a11974088a46d42b903418eJohann// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
190111b362b15af34006e6a11974088a46d42b903418eJohann//
190121b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190131b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
190141b362b15af34006e6a11974088a46d42b903418eJohann                                              const char* actual_expression,
190151b362b15af34006e6a11974088a46d42b903418eJohann                                              const char* expected,
190161b362b15af34006e6a11974088a46d42b903418eJohann                                              const char* actual);
190171b362b15af34006e6a11974088a46d42b903418eJohann
190181b362b15af34006e6a11974088a46d42b903418eJohann// The helper function for {ASSERT|EXPECT}_STRNE.
190191b362b15af34006e6a11974088a46d42b903418eJohann//
190201b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190211b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
190221b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* s2_expression,
190231b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* s1,
190241b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* s2);
190251b362b15af34006e6a11974088a46d42b903418eJohann
190261b362b15af34006e6a11974088a46d42b903418eJohann// The helper function for {ASSERT|EXPECT}_STRCASENE.
190271b362b15af34006e6a11974088a46d42b903418eJohann//
190281b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190291b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
190301b362b15af34006e6a11974088a46d42b903418eJohann                                              const char* s2_expression,
190311b362b15af34006e6a11974088a46d42b903418eJohann                                              const char* s1,
190321b362b15af34006e6a11974088a46d42b903418eJohann                                              const char* s2);
190331b362b15af34006e6a11974088a46d42b903418eJohann
190341b362b15af34006e6a11974088a46d42b903418eJohann
190351b362b15af34006e6a11974088a46d42b903418eJohann// Helper function for *_STREQ on wide strings.
190361b362b15af34006e6a11974088a46d42b903418eJohann//
190371b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190381b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
190391b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* actual_expression,
190401b362b15af34006e6a11974088a46d42b903418eJohann                                          const wchar_t* expected,
190411b362b15af34006e6a11974088a46d42b903418eJohann                                          const wchar_t* actual);
190421b362b15af34006e6a11974088a46d42b903418eJohann
190431b362b15af34006e6a11974088a46d42b903418eJohann// Helper function for *_STRNE on wide strings.
190441b362b15af34006e6a11974088a46d42b903418eJohann//
190451b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190461b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
190471b362b15af34006e6a11974088a46d42b903418eJohann                                          const char* s2_expression,
190481b362b15af34006e6a11974088a46d42b903418eJohann                                          const wchar_t* s1,
190491b362b15af34006e6a11974088a46d42b903418eJohann                                          const wchar_t* s2);
190501b362b15af34006e6a11974088a46d42b903418eJohann
190511b362b15af34006e6a11974088a46d42b903418eJohann}  // namespace internal
190521b362b15af34006e6a11974088a46d42b903418eJohann
190531b362b15af34006e6a11974088a46d42b903418eJohann// IsSubstring() and IsNotSubstring() are intended to be used as the
190541b362b15af34006e6a11974088a46d42b903418eJohann// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
190551b362b15af34006e6a11974088a46d42b903418eJohann// themselves.  They check whether needle is a substring of haystack
190561b362b15af34006e6a11974088a46d42b903418eJohann// (NULL is considered a substring of itself only), and return an
190571b362b15af34006e6a11974088a46d42b903418eJohann// appropriate error message when they fail.
190581b362b15af34006e6a11974088a46d42b903418eJohann//
190591b362b15af34006e6a11974088a46d42b903418eJohann// The {needle,haystack}_expr arguments are the stringified
190601b362b15af34006e6a11974088a46d42b903418eJohann// expressions that generated the two real arguments.
190611b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsSubstring(
190621b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190631b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle, const char* haystack);
190641b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsSubstring(
190651b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190661b362b15af34006e6a11974088a46d42b903418eJohann    const wchar_t* needle, const wchar_t* haystack);
190671b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsNotSubstring(
190681b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190691b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle, const char* haystack);
190701b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsNotSubstring(
190711b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190721b362b15af34006e6a11974088a46d42b903418eJohann    const wchar_t* needle, const wchar_t* haystack);
190731b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsSubstring(
190741b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190751b362b15af34006e6a11974088a46d42b903418eJohann    const ::std::string& needle, const ::std::string& haystack);
190761b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsNotSubstring(
190771b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190781b362b15af34006e6a11974088a46d42b903418eJohann    const ::std::string& needle, const ::std::string& haystack);
190791b362b15af34006e6a11974088a46d42b903418eJohann
190801b362b15af34006e6a11974088a46d42b903418eJohann#if GTEST_HAS_STD_WSTRING
190811b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsSubstring(
190821b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190831b362b15af34006e6a11974088a46d42b903418eJohann    const ::std::wstring& needle, const ::std::wstring& haystack);
190841b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult IsNotSubstring(
190851b362b15af34006e6a11974088a46d42b903418eJohann    const char* needle_expr, const char* haystack_expr,
190861b362b15af34006e6a11974088a46d42b903418eJohann    const ::std::wstring& needle, const ::std::wstring& haystack);
190871b362b15af34006e6a11974088a46d42b903418eJohann#endif  // GTEST_HAS_STD_WSTRING
190881b362b15af34006e6a11974088a46d42b903418eJohann
190891b362b15af34006e6a11974088a46d42b903418eJohannnamespace internal {
190901b362b15af34006e6a11974088a46d42b903418eJohann
190911b362b15af34006e6a11974088a46d42b903418eJohann// Helper template function for comparing floating-points.
190921b362b15af34006e6a11974088a46d42b903418eJohann//
190931b362b15af34006e6a11974088a46d42b903418eJohann// Template parameter:
190941b362b15af34006e6a11974088a46d42b903418eJohann//
190951b362b15af34006e6a11974088a46d42b903418eJohann//   RawType: the raw floating-point type (either float or double)
190961b362b15af34006e6a11974088a46d42b903418eJohann//
190971b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
190981b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename RawType>
190991b362b15af34006e6a11974088a46d42b903418eJohannAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
191001b362b15af34006e6a11974088a46d42b903418eJohann                                         const char* actual_expression,
191011b362b15af34006e6a11974088a46d42b903418eJohann                                         RawType expected,
191021b362b15af34006e6a11974088a46d42b903418eJohann                                         RawType actual) {
191031b362b15af34006e6a11974088a46d42b903418eJohann  const FloatingPoint<RawType> lhs(expected), rhs(actual);
191041b362b15af34006e6a11974088a46d42b903418eJohann
191051b362b15af34006e6a11974088a46d42b903418eJohann  if (lhs.AlmostEquals(rhs)) {
191061b362b15af34006e6a11974088a46d42b903418eJohann    return AssertionSuccess();
191071b362b15af34006e6a11974088a46d42b903418eJohann  }
191081b362b15af34006e6a11974088a46d42b903418eJohann
191091b362b15af34006e6a11974088a46d42b903418eJohann  ::std::stringstream expected_ss;
191101b362b15af34006e6a11974088a46d42b903418eJohann  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
191111b362b15af34006e6a11974088a46d42b903418eJohann              << expected;
191121b362b15af34006e6a11974088a46d42b903418eJohann
191131b362b15af34006e6a11974088a46d42b903418eJohann  ::std::stringstream actual_ss;
191141b362b15af34006e6a11974088a46d42b903418eJohann  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
191151b362b15af34006e6a11974088a46d42b903418eJohann            << actual;
191161b362b15af34006e6a11974088a46d42b903418eJohann
191171b362b15af34006e6a11974088a46d42b903418eJohann  return EqFailure(expected_expression,
191181b362b15af34006e6a11974088a46d42b903418eJohann                   actual_expression,
191191b362b15af34006e6a11974088a46d42b903418eJohann                   StringStreamToString(&expected_ss),
191201b362b15af34006e6a11974088a46d42b903418eJohann                   StringStreamToString(&actual_ss),
191211b362b15af34006e6a11974088a46d42b903418eJohann                   false);
191221b362b15af34006e6a11974088a46d42b903418eJohann}
191231b362b15af34006e6a11974088a46d42b903418eJohann
191241b362b15af34006e6a11974088a46d42b903418eJohann// Helper function for implementing ASSERT_NEAR.
191251b362b15af34006e6a11974088a46d42b903418eJohann//
191261b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
191271b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
191281b362b15af34006e6a11974088a46d42b903418eJohann                                                const char* expr2,
191291b362b15af34006e6a11974088a46d42b903418eJohann                                                const char* abs_error_expr,
191301b362b15af34006e6a11974088a46d42b903418eJohann                                                double val1,
191311b362b15af34006e6a11974088a46d42b903418eJohann                                                double val2,
191321b362b15af34006e6a11974088a46d42b903418eJohann                                                double abs_error);
191331b362b15af34006e6a11974088a46d42b903418eJohann
191341b362b15af34006e6a11974088a46d42b903418eJohann// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
191351b362b15af34006e6a11974088a46d42b903418eJohann// A class that enables one to stream messages to assertion macros
191361b362b15af34006e6a11974088a46d42b903418eJohannclass GTEST_API_ AssertHelper {
191371b362b15af34006e6a11974088a46d42b903418eJohann public:
191381b362b15af34006e6a11974088a46d42b903418eJohann  // Constructor.
191391b362b15af34006e6a11974088a46d42b903418eJohann  AssertHelper(TestPartResult::Type type,
191401b362b15af34006e6a11974088a46d42b903418eJohann               const char* file,
191411b362b15af34006e6a11974088a46d42b903418eJohann               int line,
191421b362b15af34006e6a11974088a46d42b903418eJohann               const char* message);
191431b362b15af34006e6a11974088a46d42b903418eJohann  ~AssertHelper();
191441b362b15af34006e6a11974088a46d42b903418eJohann
191451b362b15af34006e6a11974088a46d42b903418eJohann  // Message assignment is a semantic trick to enable assertion
191461b362b15af34006e6a11974088a46d42b903418eJohann  // streaming; see the GTEST_MESSAGE_ macro below.
191471b362b15af34006e6a11974088a46d42b903418eJohann  void operator=(const Message& message) const;
191481b362b15af34006e6a11974088a46d42b903418eJohann
191491b362b15af34006e6a11974088a46d42b903418eJohann private:
191501b362b15af34006e6a11974088a46d42b903418eJohann  // We put our data in a struct so that the size of the AssertHelper class can
191511b362b15af34006e6a11974088a46d42b903418eJohann  // be as small as possible.  This is important because gcc is incapable of
191521b362b15af34006e6a11974088a46d42b903418eJohann  // re-using stack space even for temporary variables, so every EXPECT_EQ
191531b362b15af34006e6a11974088a46d42b903418eJohann  // reserves stack space for another AssertHelper.
191541b362b15af34006e6a11974088a46d42b903418eJohann  struct AssertHelperData {
191551b362b15af34006e6a11974088a46d42b903418eJohann    AssertHelperData(TestPartResult::Type t,
191561b362b15af34006e6a11974088a46d42b903418eJohann                     const char* srcfile,
191571b362b15af34006e6a11974088a46d42b903418eJohann                     int line_num,
191581b362b15af34006e6a11974088a46d42b903418eJohann                     const char* msg)
191591b362b15af34006e6a11974088a46d42b903418eJohann        : type(t), file(srcfile), line(line_num), message(msg) { }
191601b362b15af34006e6a11974088a46d42b903418eJohann
191611b362b15af34006e6a11974088a46d42b903418eJohann    TestPartResult::Type const type;
191625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* const file;
191635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int const line;
191645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    std::string const message;
191651b362b15af34006e6a11974088a46d42b903418eJohann
191661b362b15af34006e6a11974088a46d42b903418eJohann   private:
191671b362b15af34006e6a11974088a46d42b903418eJohann    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
191681b362b15af34006e6a11974088a46d42b903418eJohann  };
191691b362b15af34006e6a11974088a46d42b903418eJohann
191701b362b15af34006e6a11974088a46d42b903418eJohann  AssertHelperData* const data_;
191711b362b15af34006e6a11974088a46d42b903418eJohann
191721b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
191731b362b15af34006e6a11974088a46d42b903418eJohann};
191741b362b15af34006e6a11974088a46d42b903418eJohann
191751b362b15af34006e6a11974088a46d42b903418eJohann}  // namespace internal
191761b362b15af34006e6a11974088a46d42b903418eJohann
191771b362b15af34006e6a11974088a46d42b903418eJohann#if GTEST_HAS_PARAM_TEST
191781b362b15af34006e6a11974088a46d42b903418eJohann// The pure interface class that all value-parameterized tests inherit from.
191791b362b15af34006e6a11974088a46d42b903418eJohann// A value-parameterized class must inherit from both ::testing::Test and
191801b362b15af34006e6a11974088a46d42b903418eJohann// ::testing::WithParamInterface. In most cases that just means inheriting
191811b362b15af34006e6a11974088a46d42b903418eJohann// from ::testing::TestWithParam, but more complicated test hierarchies
191821b362b15af34006e6a11974088a46d42b903418eJohann// may need to inherit from Test and WithParamInterface at different levels.
191831b362b15af34006e6a11974088a46d42b903418eJohann//
191841b362b15af34006e6a11974088a46d42b903418eJohann// This interface has support for accessing the test parameter value via
191851b362b15af34006e6a11974088a46d42b903418eJohann// the GetParam() method.
191861b362b15af34006e6a11974088a46d42b903418eJohann//
191871b362b15af34006e6a11974088a46d42b903418eJohann// Use it with one of the parameter generator defining functions, like Range(),
191881b362b15af34006e6a11974088a46d42b903418eJohann// Values(), ValuesIn(), Bool(), and Combine().
191891b362b15af34006e6a11974088a46d42b903418eJohann//
191901b362b15af34006e6a11974088a46d42b903418eJohann// class FooTest : public ::testing::TestWithParam<int> {
191911b362b15af34006e6a11974088a46d42b903418eJohann//  protected:
191921b362b15af34006e6a11974088a46d42b903418eJohann//   FooTest() {
191931b362b15af34006e6a11974088a46d42b903418eJohann//     // Can use GetParam() here.
191941b362b15af34006e6a11974088a46d42b903418eJohann//   }
191951b362b15af34006e6a11974088a46d42b903418eJohann//   virtual ~FooTest() {
191961b362b15af34006e6a11974088a46d42b903418eJohann//     // Can use GetParam() here.
191971b362b15af34006e6a11974088a46d42b903418eJohann//   }
191981b362b15af34006e6a11974088a46d42b903418eJohann//   virtual void SetUp() {
191991b362b15af34006e6a11974088a46d42b903418eJohann//     // Can use GetParam() here.
192001b362b15af34006e6a11974088a46d42b903418eJohann//   }
192011b362b15af34006e6a11974088a46d42b903418eJohann//   virtual void TearDown {
192021b362b15af34006e6a11974088a46d42b903418eJohann//     // Can use GetParam() here.
192031b362b15af34006e6a11974088a46d42b903418eJohann//   }
192041b362b15af34006e6a11974088a46d42b903418eJohann// };
192051b362b15af34006e6a11974088a46d42b903418eJohann// TEST_P(FooTest, DoesBar) {
192061b362b15af34006e6a11974088a46d42b903418eJohann//   // Can use GetParam() method here.
192071b362b15af34006e6a11974088a46d42b903418eJohann//   Foo foo;
192081b362b15af34006e6a11974088a46d42b903418eJohann//   ASSERT_TRUE(foo.DoesBar(GetParam()));
192091b362b15af34006e6a11974088a46d42b903418eJohann// }
192101b362b15af34006e6a11974088a46d42b903418eJohann// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
192111b362b15af34006e6a11974088a46d42b903418eJohann
192121b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T>
192131b362b15af34006e6a11974088a46d42b903418eJohannclass WithParamInterface {
192141b362b15af34006e6a11974088a46d42b903418eJohann public:
192151b362b15af34006e6a11974088a46d42b903418eJohann  typedef T ParamType;
192161b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~WithParamInterface() {}
192171b362b15af34006e6a11974088a46d42b903418eJohann
192181b362b15af34006e6a11974088a46d42b903418eJohann  // The current parameter value. Is also available in the test fixture's
192191b362b15af34006e6a11974088a46d42b903418eJohann  // constructor. This member function is non-static, even though it only
192201b362b15af34006e6a11974088a46d42b903418eJohann  // references static data, to reduce the opportunity for incorrect uses
192211b362b15af34006e6a11974088a46d42b903418eJohann  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
192221b362b15af34006e6a11974088a46d42b903418eJohann  // uses a fixture whose parameter type is int.
192235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ParamType& GetParam() const {
192245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_(parameter_ != NULL)
192255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "GetParam() can only be called inside a value-parameterized test "
192265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "-- did you intend to write TEST_P instead of TEST_F?";
192275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *parameter_;
192285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
192291b362b15af34006e6a11974088a46d42b903418eJohann
192301b362b15af34006e6a11974088a46d42b903418eJohann private:
192311b362b15af34006e6a11974088a46d42b903418eJohann  // Sets parameter value. The caller is responsible for making sure the value
192321b362b15af34006e6a11974088a46d42b903418eJohann  // remains alive and unchanged throughout the current test.
192331b362b15af34006e6a11974088a46d42b903418eJohann  static void SetParam(const ParamType* parameter) {
192341b362b15af34006e6a11974088a46d42b903418eJohann    parameter_ = parameter;
192351b362b15af34006e6a11974088a46d42b903418eJohann  }
192361b362b15af34006e6a11974088a46d42b903418eJohann
192371b362b15af34006e6a11974088a46d42b903418eJohann  // Static value used for accessing parameter during a test lifetime.
192381b362b15af34006e6a11974088a46d42b903418eJohann  static const ParamType* parameter_;
192391b362b15af34006e6a11974088a46d42b903418eJohann
192401b362b15af34006e6a11974088a46d42b903418eJohann  // TestClass must be a subclass of WithParamInterface<T> and Test.
192411b362b15af34006e6a11974088a46d42b903418eJohann  template <class TestClass> friend class internal::ParameterizedTestFactory;
192421b362b15af34006e6a11974088a46d42b903418eJohann};
192431b362b15af34006e6a11974088a46d42b903418eJohann
192441b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T>
192451b362b15af34006e6a11974088a46d42b903418eJohannconst T* WithParamInterface<T>::parameter_ = NULL;
192461b362b15af34006e6a11974088a46d42b903418eJohann
192471b362b15af34006e6a11974088a46d42b903418eJohann// Most value-parameterized classes can ignore the existence of
192481b362b15af34006e6a11974088a46d42b903418eJohann// WithParamInterface, and can just inherit from ::testing::TestWithParam.
192491b362b15af34006e6a11974088a46d42b903418eJohann
192501b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T>
192511b362b15af34006e6a11974088a46d42b903418eJohannclass TestWithParam : public Test, public WithParamInterface<T> {
192521b362b15af34006e6a11974088a46d42b903418eJohann};
192531b362b15af34006e6a11974088a46d42b903418eJohann
192541b362b15af34006e6a11974088a46d42b903418eJohann#endif  // GTEST_HAS_PARAM_TEST
192551b362b15af34006e6a11974088a46d42b903418eJohann
192561b362b15af34006e6a11974088a46d42b903418eJohann// Macros for indicating success/failure in test code.
192571b362b15af34006e6a11974088a46d42b903418eJohann
192581b362b15af34006e6a11974088a46d42b903418eJohann// ADD_FAILURE unconditionally adds a failure to the current test.
192591b362b15af34006e6a11974088a46d42b903418eJohann// SUCCEED generates a success - it doesn't automatically make the
192601b362b15af34006e6a11974088a46d42b903418eJohann// current test successful, as a test is only successful when it has
192611b362b15af34006e6a11974088a46d42b903418eJohann// no failure.
192621b362b15af34006e6a11974088a46d42b903418eJohann//
192631b362b15af34006e6a11974088a46d42b903418eJohann// EXPECT_* verifies that a certain condition is satisfied.  If not,
192641b362b15af34006e6a11974088a46d42b903418eJohann// it behaves like ADD_FAILURE.  In particular:
192651b362b15af34006e6a11974088a46d42b903418eJohann//
192661b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_TRUE  verifies that a Boolean condition is true.
192671b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_FALSE verifies that a Boolean condition is false.
192681b362b15af34006e6a11974088a46d42b903418eJohann//
192691b362b15af34006e6a11974088a46d42b903418eJohann// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
192701b362b15af34006e6a11974088a46d42b903418eJohann// that they will also abort the current function on failure.  People
192711b362b15af34006e6a11974088a46d42b903418eJohann// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
192721b362b15af34006e6a11974088a46d42b903418eJohann// writing data-driven tests often find themselves using ADD_FAILURE
192731b362b15af34006e6a11974088a46d42b903418eJohann// and EXPECT_* more.
192741b362b15af34006e6a11974088a46d42b903418eJohann
192751b362b15af34006e6a11974088a46d42b903418eJohann// Generates a nonfatal failure with a generic message.
192761b362b15af34006e6a11974088a46d42b903418eJohann#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
192771b362b15af34006e6a11974088a46d42b903418eJohann
192781b362b15af34006e6a11974088a46d42b903418eJohann// Generates a nonfatal failure at the given source file location with
192791b362b15af34006e6a11974088a46d42b903418eJohann// a generic message.
192801b362b15af34006e6a11974088a46d42b903418eJohann#define ADD_FAILURE_AT(file, line) \
192811b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_MESSAGE_AT_(file, line, "Failed", \
192821b362b15af34006e6a11974088a46d42b903418eJohann                    ::testing::TestPartResult::kNonFatalFailure)
192831b362b15af34006e6a11974088a46d42b903418eJohann
192841b362b15af34006e6a11974088a46d42b903418eJohann// Generates a fatal failure with a generic message.
192851b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
192861b362b15af34006e6a11974088a46d42b903418eJohann
192871b362b15af34006e6a11974088a46d42b903418eJohann// Define this macro to 1 to omit the definition of FAIL(), which is a
192881b362b15af34006e6a11974088a46d42b903418eJohann// generic name and clashes with some other libraries.
192891b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_FAIL
192901b362b15af34006e6a11974088a46d42b903418eJohann# define FAIL() GTEST_FAIL()
192911b362b15af34006e6a11974088a46d42b903418eJohann#endif
192921b362b15af34006e6a11974088a46d42b903418eJohann
192931b362b15af34006e6a11974088a46d42b903418eJohann// Generates a success with a generic message.
192941b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
192951b362b15af34006e6a11974088a46d42b903418eJohann
192961b362b15af34006e6a11974088a46d42b903418eJohann// Define this macro to 1 to omit the definition of SUCCEED(), which
192971b362b15af34006e6a11974088a46d42b903418eJohann// is a generic name and clashes with some other libraries.
192981b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_SUCCEED
192991b362b15af34006e6a11974088a46d42b903418eJohann# define SUCCEED() GTEST_SUCCEED()
193001b362b15af34006e6a11974088a46d42b903418eJohann#endif
193011b362b15af34006e6a11974088a46d42b903418eJohann
193021b362b15af34006e6a11974088a46d42b903418eJohann// Macros for testing exceptions.
193031b362b15af34006e6a11974088a46d42b903418eJohann//
193041b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
193051b362b15af34006e6a11974088a46d42b903418eJohann//         Tests that the statement throws the expected exception.
193061b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_NO_THROW(statement):
193071b362b15af34006e6a11974088a46d42b903418eJohann//         Tests that the statement doesn't throw any exception.
193081b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_ANY_THROW(statement):
193091b362b15af34006e6a11974088a46d42b903418eJohann//         Tests that the statement throws an exception.
193101b362b15af34006e6a11974088a46d42b903418eJohann
193111b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_THROW(statement, expected_exception) \
193121b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
193131b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_NO_THROW(statement) \
193141b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
193151b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_ANY_THROW(statement) \
193161b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
193171b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_THROW(statement, expected_exception) \
193181b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
193191b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_NO_THROW(statement) \
193201b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
193211b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_ANY_THROW(statement) \
193221b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
193231b362b15af34006e6a11974088a46d42b903418eJohann
193241b362b15af34006e6a11974088a46d42b903418eJohann// Boolean assertions. Condition can be either a Boolean expression or an
193251b362b15af34006e6a11974088a46d42b903418eJohann// AssertionResult. For more information on how to use AssertionResult with
193261b362b15af34006e6a11974088a46d42b903418eJohann// these macros see comments on that class.
193271b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_TRUE(condition) \
193281b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
193291b362b15af34006e6a11974088a46d42b903418eJohann                      GTEST_NONFATAL_FAILURE_)
193301b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_FALSE(condition) \
193311b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
193321b362b15af34006e6a11974088a46d42b903418eJohann                      GTEST_NONFATAL_FAILURE_)
193331b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_TRUE(condition) \
193341b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
193351b362b15af34006e6a11974088a46d42b903418eJohann                      GTEST_FATAL_FAILURE_)
193361b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_FALSE(condition) \
193371b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
193381b362b15af34006e6a11974088a46d42b903418eJohann                      GTEST_FATAL_FAILURE_)
193391b362b15af34006e6a11974088a46d42b903418eJohann
193401b362b15af34006e6a11974088a46d42b903418eJohann// Includes the auto-generated header that implements a family of
193411b362b15af34006e6a11974088a46d42b903418eJohann// generic predicate assertion macros.
193425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2006, Google Inc.
193435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
193445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
193465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
193475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
193485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
193505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
193515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
193525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
193535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
193545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
193555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
193565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
193575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
193585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
193615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
193635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
193645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
193655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
193665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
193675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
193685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
193695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
193705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
193715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
193725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
193735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements a family of generic predicate assertion macros.
193755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
193765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
193775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
193785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
193795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Makes sure this header is not included before gtest.h.
193805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
193815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
193825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
193835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
193845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This header implements a family of generic predicate assertion
193855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macros:
193865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_PRED_FORMAT1(pred_format, v1)
193885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
193895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ...
193905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// where pred_format is a function or functor that takes n (in the
193925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// case of ASSERT_PRED_FORMATn) values and their source expression
193935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// text, and returns a testing::AssertionResult.  See the definition
193945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of ASSERT_EQ in gtest.h for an example.
193955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If you don't care about formatting, you can use the more
193975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// restrictive version:
193985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
193995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_PRED1(pred, v1)
194005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ASSERT_PRED2(pred, v1, v2)
194015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   ...
194025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
194035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// where pred is an n-ary function or functor that returns bool,
194045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and the values v1, v2, ..., must support the << operator for
194055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// streaming to std::ostream.
194065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
194075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We also define the EXPECT_* variations.
194085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
194095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For now we only support predicates whose arity is at most 5.
194105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Please email googletestframework@googlegroups.com if you need
194115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// support for higher arities.
194125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_ASSERT_ is the basic statement to which all of the assertions
194145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in this file reduce.  Don't use this in your code.
194155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_ASSERT_(expression, on_failure) \
194175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
194185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (const ::testing::AssertionResult gtest_ar = (expression)) \
194195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ; \
194205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else \
194215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    on_failure(gtest_ar.failure_message())
194225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
194255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
194265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Pred,
194275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T1>
194285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertPred1Helper(const char* pred_text,
194295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e1,
194305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  Pred pred,
194315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T1& v1) {
194325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pred(v1)) return AssertionSuccess();
194335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << pred_text << "("
194355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e1 << ") evaluates to false, where"
194365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e1 << " evaluates to " << v1;
194375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
194385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
194405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't use this in your code.
194415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
194425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(pred_format(#v1, v1), \
194435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                on_failure)
194445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
194465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
194475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED1_(pred, v1, on_failure)\
194485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
194495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v1, \
194505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             pred, \
194515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v1), on_failure)
194525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Unary predicate assertion macros.
194545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED_FORMAT1(pred_format, v1) \
194555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
194565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED1(pred, v1) \
194575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
194585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED_FORMAT1(pred_format, v1) \
194595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
194605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED1(pred, v1) \
194615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
194625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
194665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
194675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Pred,
194685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T1,
194695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T2>
194705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertPred2Helper(const char* pred_text,
194715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e1,
194725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e2,
194735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  Pred pred,
194745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T1& v1,
194755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T2& v2) {
194765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pred(v1, v2)) return AssertionSuccess();
194775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << pred_text << "("
194795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e1 << ", "
194805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e2 << ") evaluates to false, where"
194815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e1 << " evaluates to " << v1
194825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e2 << " evaluates to " << v2;
194835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
194845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
194865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't use this in your code.
194875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
194885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
194895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                on_failure)
194905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
194915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
194925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
194935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED2_(pred, v1, v2, on_failure)\
194945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
194955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v1, \
194965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v2, \
194975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             pred, \
194985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v1, \
194995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v2), on_failure)
195005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Binary predicate assertion macros.
195025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
195035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
195045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED2(pred, v1, v2) \
195055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
195065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
195075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
195085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED2(pred, v1, v2) \
195095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
195105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
195145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
195155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Pred,
195165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T1,
195175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T2,
195185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T3>
195195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertPred3Helper(const char* pred_text,
195205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e1,
195215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e2,
195225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e3,
195235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  Pred pred,
195245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T1& v1,
195255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T2& v2,
195265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T3& v3) {
195275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pred(v1, v2, v3)) return AssertionSuccess();
195285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << pred_text << "("
195305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e1 << ", "
195315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e2 << ", "
195325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e3 << ") evaluates to false, where"
195335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e1 << " evaluates to " << v1
195345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e2 << " evaluates to " << v2
195355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e3 << " evaluates to " << v3;
195365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
195375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
195395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't use this in your code.
195405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
195415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
195425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                on_failure)
195435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
195455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
195465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
195475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
195485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v1, \
195495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v2, \
195505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v3, \
195515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             pred, \
195525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v1, \
195535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v2, \
195545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v3), on_failure)
195555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Ternary predicate assertion macros.
195575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
195585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
195595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED3(pred, v1, v2, v3) \
195605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
195615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
195625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
195635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED3(pred, v1, v2, v3) \
195645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
195655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
195695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
195705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Pred,
195715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T1,
195725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T2,
195735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T3,
195745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T4>
195755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertPred4Helper(const char* pred_text,
195765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e1,
195775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e2,
195785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e3,
195795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e4,
195805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  Pred pred,
195815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T1& v1,
195825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T2& v2,
195835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T3& v3,
195845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T4& v4) {
195855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
195865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << pred_text << "("
195885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e1 << ", "
195895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e2 << ", "
195905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e3 << ", "
195915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e4 << ") evaluates to false, where"
195925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e1 << " evaluates to " << v1
195935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e2 << " evaluates to " << v2
195945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e3 << " evaluates to " << v3
195955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e4 << " evaluates to " << v4;
195965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
195975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
195985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
195995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't use this in your code.
196005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
196015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
196025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                on_failure)
196035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
196055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
196065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
196075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
196085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v1, \
196095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v2, \
196105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v3, \
196115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v4, \
196125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             pred, \
196135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v1, \
196145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v2, \
196155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v3, \
196165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v4), on_failure)
196175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 4-ary predicate assertion macros.
196195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
196205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
196215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
196225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
196235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
196245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
196255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
196265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
196275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
196315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
196325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Pred,
196335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T1,
196345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T2,
196355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T3,
196365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T4,
196375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          typename T5>
196385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertPred5Helper(const char* pred_text,
196395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e1,
196405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e2,
196415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e3,
196425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e4,
196435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const char* e5,
196445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  Pred pred,
196455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T1& v1,
196465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T2& v2,
196475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T3& v3,
196485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T4& v4,
196495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  const T5& v5) {
196505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
196515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << pred_text << "("
196535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e1 << ", "
196545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e2 << ", "
196555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e3 << ", "
196565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e4 << ", "
196575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << e5 << ") evaluates to false, where"
196585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e1 << " evaluates to " << v1
196595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e2 << " evaluates to " << v2
196605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e3 << " evaluates to " << v3
196615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e4 << " evaluates to " << v4
196625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << "\n" << e5 << " evaluates to " << v5;
196635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
196645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
196665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Don't use this in your code.
196675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
196685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
196695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                on_failure)
196705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
196725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this in your code.
196735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
196745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
196755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v1, \
196765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v2, \
196775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v3, \
196785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v4, \
196795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             #v5, \
196805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             pred, \
196815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v1, \
196825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v2, \
196835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v3, \
196845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v4, \
196855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             v5), on_failure)
196865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 5-ary predicate assertion macros.
196885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
196895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
196905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
196915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
196925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
196935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
196945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
196955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
196965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
196995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
197001b362b15af34006e6a11974088a46d42b903418eJohann
197011b362b15af34006e6a11974088a46d42b903418eJohann// Macros for testing equalities and inequalities.
197021b362b15af34006e6a11974088a46d42b903418eJohann//
197031b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
197041b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
197051b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
197061b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
197071b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
197081b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
197091b362b15af34006e6a11974088a46d42b903418eJohann//
197101b362b15af34006e6a11974088a46d42b903418eJohann// When they are not, Google Test prints both the tested expressions and
197111b362b15af34006e6a11974088a46d42b903418eJohann// their actual values.  The values must be compatible built-in types,
197121b362b15af34006e6a11974088a46d42b903418eJohann// or you will get a compiler error.  By "compatible" we mean that the
197131b362b15af34006e6a11974088a46d42b903418eJohann// values can be compared by the respective operator.
197141b362b15af34006e6a11974088a46d42b903418eJohann//
197151b362b15af34006e6a11974088a46d42b903418eJohann// Note:
197161b362b15af34006e6a11974088a46d42b903418eJohann//
197171b362b15af34006e6a11974088a46d42b903418eJohann//   1. It is possible to make a user-defined type work with
197181b362b15af34006e6a11974088a46d42b903418eJohann//   {ASSERT|EXPECT}_??(), but that requires overloading the
197191b362b15af34006e6a11974088a46d42b903418eJohann//   comparison operators and is thus discouraged by the Google C++
197201b362b15af34006e6a11974088a46d42b903418eJohann//   Usage Guide.  Therefore, you are advised to use the
197211b362b15af34006e6a11974088a46d42b903418eJohann//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
197221b362b15af34006e6a11974088a46d42b903418eJohann//   equal.
197231b362b15af34006e6a11974088a46d42b903418eJohann//
197241b362b15af34006e6a11974088a46d42b903418eJohann//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
197251b362b15af34006e6a11974088a46d42b903418eJohann//   pointers (in particular, C strings).  Therefore, if you use it
197261b362b15af34006e6a11974088a46d42b903418eJohann//   with two C strings, you are testing how their locations in memory
197271b362b15af34006e6a11974088a46d42b903418eJohann//   are related, not how their content is related.  To compare two C
197281b362b15af34006e6a11974088a46d42b903418eJohann//   strings by content, use {ASSERT|EXPECT}_STR*().
197291b362b15af34006e6a11974088a46d42b903418eJohann//
197301b362b15af34006e6a11974088a46d42b903418eJohann//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
197311b362b15af34006e6a11974088a46d42b903418eJohann//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
197321b362b15af34006e6a11974088a46d42b903418eJohann//   what the actual value is when it fails, and similarly for the
197331b362b15af34006e6a11974088a46d42b903418eJohann//   other comparisons.
197341b362b15af34006e6a11974088a46d42b903418eJohann//
197351b362b15af34006e6a11974088a46d42b903418eJohann//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
197361b362b15af34006e6a11974088a46d42b903418eJohann//   evaluate their arguments, which is undefined.
197371b362b15af34006e6a11974088a46d42b903418eJohann//
197381b362b15af34006e6a11974088a46d42b903418eJohann//   5. These macros evaluate their arguments exactly once.
197391b362b15af34006e6a11974088a46d42b903418eJohann//
197401b362b15af34006e6a11974088a46d42b903418eJohann// Examples:
197411b362b15af34006e6a11974088a46d42b903418eJohann//
197421b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_NE(5, Foo());
197431b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_EQ(NULL, a_pointer);
197441b362b15af34006e6a11974088a46d42b903418eJohann//   ASSERT_LT(i, array_size);
197451b362b15af34006e6a11974088a46d42b903418eJohann//   ASSERT_GT(records.size(), 0) << "There is no record left.";
197461b362b15af34006e6a11974088a46d42b903418eJohann
197471b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_EQ(expected, actual) \
197481b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal:: \
197491b362b15af34006e6a11974088a46d42b903418eJohann                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
197501b362b15af34006e6a11974088a46d42b903418eJohann                      expected, actual)
197511b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_NE(expected, actual) \
197521b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
197531b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_LE(val1, val2) \
197541b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
197551b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_LT(val1, val2) \
197561b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
197571b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_GE(val1, val2) \
197581b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
197591b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_GT(val1, val2) \
197601b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
197611b362b15af34006e6a11974088a46d42b903418eJohann
197621b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_ASSERT_EQ(expected, actual) \
197631b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal:: \
197641b362b15af34006e6a11974088a46d42b903418eJohann                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
197651b362b15af34006e6a11974088a46d42b903418eJohann                      expected, actual)
197661b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_ASSERT_NE(val1, val2) \
197671b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
197681b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_ASSERT_LE(val1, val2) \
197691b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
197701b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_ASSERT_LT(val1, val2) \
197711b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
197721b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_ASSERT_GE(val1, val2) \
197731b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
197741b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_ASSERT_GT(val1, val2) \
197751b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
197761b362b15af34006e6a11974088a46d42b903418eJohann
197771b362b15af34006e6a11974088a46d42b903418eJohann// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
197781b362b15af34006e6a11974088a46d42b903418eJohann// ASSERT_XY(), which clashes with some users' own code.
197791b362b15af34006e6a11974088a46d42b903418eJohann
197801b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_ASSERT_EQ
197811b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
197821b362b15af34006e6a11974088a46d42b903418eJohann#endif
197831b362b15af34006e6a11974088a46d42b903418eJohann
197841b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_ASSERT_NE
197851b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
197861b362b15af34006e6a11974088a46d42b903418eJohann#endif
197871b362b15af34006e6a11974088a46d42b903418eJohann
197881b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_ASSERT_LE
197891b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
197901b362b15af34006e6a11974088a46d42b903418eJohann#endif
197911b362b15af34006e6a11974088a46d42b903418eJohann
197921b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_ASSERT_LT
197931b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
197941b362b15af34006e6a11974088a46d42b903418eJohann#endif
197951b362b15af34006e6a11974088a46d42b903418eJohann
197961b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_ASSERT_GE
197971b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
197981b362b15af34006e6a11974088a46d42b903418eJohann#endif
197991b362b15af34006e6a11974088a46d42b903418eJohann
198001b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_ASSERT_GT
198011b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
198021b362b15af34006e6a11974088a46d42b903418eJohann#endif
198031b362b15af34006e6a11974088a46d42b903418eJohann
198045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// C-string Comparisons.  All tests treat NULL and any non-NULL string
198051b362b15af34006e6a11974088a46d42b903418eJohann// as different.  Two NULLs are equal.
198061b362b15af34006e6a11974088a46d42b903418eJohann//
198071b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
198081b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
198091b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
198101b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
198111b362b15af34006e6a11974088a46d42b903418eJohann//
198121b362b15af34006e6a11974088a46d42b903418eJohann// For wide or narrow string objects, you can use the
198131b362b15af34006e6a11974088a46d42b903418eJohann// {ASSERT|EXPECT}_??() macros.
198141b362b15af34006e6a11974088a46d42b903418eJohann//
198151b362b15af34006e6a11974088a46d42b903418eJohann// Don't depend on the order in which the arguments are evaluated,
198161b362b15af34006e6a11974088a46d42b903418eJohann// which is undefined.
198171b362b15af34006e6a11974088a46d42b903418eJohann//
198181b362b15af34006e6a11974088a46d42b903418eJohann// These macros evaluate their arguments exactly once.
198191b362b15af34006e6a11974088a46d42b903418eJohann
198201b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_STREQ(expected, actual) \
198211b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
198221b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_STRNE(s1, s2) \
198231b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
198241b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_STRCASEEQ(expected, actual) \
198251b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
198261b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_STRCASENE(s1, s2)\
198271b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
198281b362b15af34006e6a11974088a46d42b903418eJohann
198291b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_STREQ(expected, actual) \
198301b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
198311b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_STRNE(s1, s2) \
198321b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
198331b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_STRCASEEQ(expected, actual) \
198341b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
198351b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_STRCASENE(s1, s2)\
198361b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
198371b362b15af34006e6a11974088a46d42b903418eJohann
198381b362b15af34006e6a11974088a46d42b903418eJohann// Macros for comparing floating-point numbers.
198391b362b15af34006e6a11974088a46d42b903418eJohann//
198401b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
198411b362b15af34006e6a11974088a46d42b903418eJohann//         Tests that two float values are almost equal.
198421b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
198431b362b15af34006e6a11974088a46d42b903418eJohann//         Tests that two double values are almost equal.
198441b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
198451b362b15af34006e6a11974088a46d42b903418eJohann//         Tests that v1 and v2 are within the given distance to each other.
198461b362b15af34006e6a11974088a46d42b903418eJohann//
198471b362b15af34006e6a11974088a46d42b903418eJohann// Google Test uses ULP-based comparison to automatically pick a default
198481b362b15af34006e6a11974088a46d42b903418eJohann// error bound that is appropriate for the operands.  See the
198491b362b15af34006e6a11974088a46d42b903418eJohann// FloatingPoint template class in gtest-internal.h if you are
198501b362b15af34006e6a11974088a46d42b903418eJohann// interested in the implementation details.
198511b362b15af34006e6a11974088a46d42b903418eJohann
198521b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_FLOAT_EQ(expected, actual)\
198531b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
198541b362b15af34006e6a11974088a46d42b903418eJohann                      expected, actual)
198551b362b15af34006e6a11974088a46d42b903418eJohann
198561b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_DOUBLE_EQ(expected, actual)\
198571b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
198581b362b15af34006e6a11974088a46d42b903418eJohann                      expected, actual)
198591b362b15af34006e6a11974088a46d42b903418eJohann
198601b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_FLOAT_EQ(expected, actual)\
198611b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
198621b362b15af34006e6a11974088a46d42b903418eJohann                      expected, actual)
198631b362b15af34006e6a11974088a46d42b903418eJohann
198641b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_DOUBLE_EQ(expected, actual)\
198651b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
198661b362b15af34006e6a11974088a46d42b903418eJohann                      expected, actual)
198671b362b15af34006e6a11974088a46d42b903418eJohann
198681b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_NEAR(val1, val2, abs_error)\
198691b362b15af34006e6a11974088a46d42b903418eJohann  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
198701b362b15af34006e6a11974088a46d42b903418eJohann                      val1, val2, abs_error)
198711b362b15af34006e6a11974088a46d42b903418eJohann
198721b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_NEAR(val1, val2, abs_error)\
198731b362b15af34006e6a11974088a46d42b903418eJohann  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
198741b362b15af34006e6a11974088a46d42b903418eJohann                      val1, val2, abs_error)
198751b362b15af34006e6a11974088a46d42b903418eJohann
198761b362b15af34006e6a11974088a46d42b903418eJohann// These predicate format functions work on floating-point values, and
198771b362b15af34006e6a11974088a46d42b903418eJohann// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
198781b362b15af34006e6a11974088a46d42b903418eJohann//
198791b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
198801b362b15af34006e6a11974088a46d42b903418eJohann
198811b362b15af34006e6a11974088a46d42b903418eJohann// Asserts that val1 is less than, or almost equal to, val2.  Fails
198821b362b15af34006e6a11974088a46d42b903418eJohann// otherwise.  In particular, it fails if either val1 or val2 is NaN.
198831b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
198841b362b15af34006e6a11974088a46d42b903418eJohann                                   float val1, float val2);
198851b362b15af34006e6a11974088a46d42b903418eJohannGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
198861b362b15af34006e6a11974088a46d42b903418eJohann                                    double val1, double val2);
198871b362b15af34006e6a11974088a46d42b903418eJohann
198881b362b15af34006e6a11974088a46d42b903418eJohann
198891b362b15af34006e6a11974088a46d42b903418eJohann#if GTEST_OS_WINDOWS
198901b362b15af34006e6a11974088a46d42b903418eJohann
198911b362b15af34006e6a11974088a46d42b903418eJohann// Macros that test for HRESULT failure and success, these are only useful
198921b362b15af34006e6a11974088a46d42b903418eJohann// on Windows, and rely on Windows SDK macros and APIs to compile.
198931b362b15af34006e6a11974088a46d42b903418eJohann//
198941b362b15af34006e6a11974088a46d42b903418eJohann//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
198951b362b15af34006e6a11974088a46d42b903418eJohann//
198961b362b15af34006e6a11974088a46d42b903418eJohann// When expr unexpectedly fails or succeeds, Google Test prints the
198971b362b15af34006e6a11974088a46d42b903418eJohann// expected result and the actual result with both a human-readable
198981b362b15af34006e6a11974088a46d42b903418eJohann// string representation of the error, if available, as well as the
198991b362b15af34006e6a11974088a46d42b903418eJohann// hex result code.
199001b362b15af34006e6a11974088a46d42b903418eJohann# define EXPECT_HRESULT_SUCCEEDED(expr) \
199011b362b15af34006e6a11974088a46d42b903418eJohann    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
199021b362b15af34006e6a11974088a46d42b903418eJohann
199031b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_HRESULT_SUCCEEDED(expr) \
199041b362b15af34006e6a11974088a46d42b903418eJohann    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
199051b362b15af34006e6a11974088a46d42b903418eJohann
199061b362b15af34006e6a11974088a46d42b903418eJohann# define EXPECT_HRESULT_FAILED(expr) \
199071b362b15af34006e6a11974088a46d42b903418eJohann    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
199081b362b15af34006e6a11974088a46d42b903418eJohann
199091b362b15af34006e6a11974088a46d42b903418eJohann# define ASSERT_HRESULT_FAILED(expr) \
199101b362b15af34006e6a11974088a46d42b903418eJohann    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
199111b362b15af34006e6a11974088a46d42b903418eJohann
199121b362b15af34006e6a11974088a46d42b903418eJohann#endif  // GTEST_OS_WINDOWS
199131b362b15af34006e6a11974088a46d42b903418eJohann
199141b362b15af34006e6a11974088a46d42b903418eJohann// Macros that execute statement and check that it doesn't generate new fatal
199151b362b15af34006e6a11974088a46d42b903418eJohann// failures in the current thread.
199161b362b15af34006e6a11974088a46d42b903418eJohann//
199171b362b15af34006e6a11974088a46d42b903418eJohann//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
199181b362b15af34006e6a11974088a46d42b903418eJohann//
199191b362b15af34006e6a11974088a46d42b903418eJohann// Examples:
199201b362b15af34006e6a11974088a46d42b903418eJohann//
199211b362b15af34006e6a11974088a46d42b903418eJohann//   EXPECT_NO_FATAL_FAILURE(Process());
199221b362b15af34006e6a11974088a46d42b903418eJohann//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
199231b362b15af34006e6a11974088a46d42b903418eJohann//
199241b362b15af34006e6a11974088a46d42b903418eJohann#define ASSERT_NO_FATAL_FAILURE(statement) \
199251b362b15af34006e6a11974088a46d42b903418eJohann    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
199261b362b15af34006e6a11974088a46d42b903418eJohann#define EXPECT_NO_FATAL_FAILURE(statement) \
199271b362b15af34006e6a11974088a46d42b903418eJohann    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
199281b362b15af34006e6a11974088a46d42b903418eJohann
199291b362b15af34006e6a11974088a46d42b903418eJohann// Causes a trace (including the source file path, the current line
199301b362b15af34006e6a11974088a46d42b903418eJohann// number, and the given message) to be included in every test failure
199311b362b15af34006e6a11974088a46d42b903418eJohann// message generated by code in the current scope.  The effect is
199321b362b15af34006e6a11974088a46d42b903418eJohann// undone when the control leaves the current scope.
199331b362b15af34006e6a11974088a46d42b903418eJohann//
199341b362b15af34006e6a11974088a46d42b903418eJohann// The message argument can be anything streamable to std::ostream.
199351b362b15af34006e6a11974088a46d42b903418eJohann//
199361b362b15af34006e6a11974088a46d42b903418eJohann// In the implementation, we include the current line number as part
199371b362b15af34006e6a11974088a46d42b903418eJohann// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
199381b362b15af34006e6a11974088a46d42b903418eJohann// to appear in the same block - as long as they are on different
199391b362b15af34006e6a11974088a46d42b903418eJohann// lines.
199401b362b15af34006e6a11974088a46d42b903418eJohann#define SCOPED_TRACE(message) \
199411b362b15af34006e6a11974088a46d42b903418eJohann  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
199421b362b15af34006e6a11974088a46d42b903418eJohann    __FILE__, __LINE__, ::testing::Message() << (message))
199431b362b15af34006e6a11974088a46d42b903418eJohann
199441b362b15af34006e6a11974088a46d42b903418eJohann// Compile-time assertion for type equality.
199451b362b15af34006e6a11974088a46d42b903418eJohann// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
199461b362b15af34006e6a11974088a46d42b903418eJohann// the same type.  The value it returns is not interesting.
199471b362b15af34006e6a11974088a46d42b903418eJohann//
199481b362b15af34006e6a11974088a46d42b903418eJohann// Instead of making StaticAssertTypeEq a class template, we make it a
199491b362b15af34006e6a11974088a46d42b903418eJohann// function template that invokes a helper class template.  This
199501b362b15af34006e6a11974088a46d42b903418eJohann// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
199511b362b15af34006e6a11974088a46d42b903418eJohann// defining objects of that type.
199521b362b15af34006e6a11974088a46d42b903418eJohann//
199531b362b15af34006e6a11974088a46d42b903418eJohann// CAVEAT:
199541b362b15af34006e6a11974088a46d42b903418eJohann//
199551b362b15af34006e6a11974088a46d42b903418eJohann// When used inside a method of a class template,
199561b362b15af34006e6a11974088a46d42b903418eJohann// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
199571b362b15af34006e6a11974088a46d42b903418eJohann// instantiated.  For example, given:
199581b362b15af34006e6a11974088a46d42b903418eJohann//
199591b362b15af34006e6a11974088a46d42b903418eJohann//   template <typename T> class Foo {
199601b362b15af34006e6a11974088a46d42b903418eJohann//    public:
199611b362b15af34006e6a11974088a46d42b903418eJohann//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
199621b362b15af34006e6a11974088a46d42b903418eJohann//   };
199631b362b15af34006e6a11974088a46d42b903418eJohann//
199641b362b15af34006e6a11974088a46d42b903418eJohann// the code:
199651b362b15af34006e6a11974088a46d42b903418eJohann//
199661b362b15af34006e6a11974088a46d42b903418eJohann//   void Test1() { Foo<bool> foo; }
199671b362b15af34006e6a11974088a46d42b903418eJohann//
199681b362b15af34006e6a11974088a46d42b903418eJohann// will NOT generate a compiler error, as Foo<bool>::Bar() is never
199691b362b15af34006e6a11974088a46d42b903418eJohann// actually instantiated.  Instead, you need:
199701b362b15af34006e6a11974088a46d42b903418eJohann//
199711b362b15af34006e6a11974088a46d42b903418eJohann//   void Test2() { Foo<bool> foo; foo.Bar(); }
199721b362b15af34006e6a11974088a46d42b903418eJohann//
199731b362b15af34006e6a11974088a46d42b903418eJohann// to cause a compiler error.
199741b362b15af34006e6a11974088a46d42b903418eJohanntemplate <typename T1, typename T2>
199751b362b15af34006e6a11974088a46d42b903418eJohannbool StaticAssertTypeEq() {
199761b362b15af34006e6a11974088a46d42b903418eJohann  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
199771b362b15af34006e6a11974088a46d42b903418eJohann  return true;
199781b362b15af34006e6a11974088a46d42b903418eJohann}
199791b362b15af34006e6a11974088a46d42b903418eJohann
199801b362b15af34006e6a11974088a46d42b903418eJohann// Defines a test.
199811b362b15af34006e6a11974088a46d42b903418eJohann//
199821b362b15af34006e6a11974088a46d42b903418eJohann// The first parameter is the name of the test case, and the second
199831b362b15af34006e6a11974088a46d42b903418eJohann// parameter is the name of the test within the test case.
199841b362b15af34006e6a11974088a46d42b903418eJohann//
199851b362b15af34006e6a11974088a46d42b903418eJohann// The convention is to end the test case name with "Test".  For
199861b362b15af34006e6a11974088a46d42b903418eJohann// example, a test case for the Foo class can be named FooTest.
199871b362b15af34006e6a11974088a46d42b903418eJohann//
199881b362b15af34006e6a11974088a46d42b903418eJohann// The user should put his test code between braces after using this
199891b362b15af34006e6a11974088a46d42b903418eJohann// macro.  Example:
199901b362b15af34006e6a11974088a46d42b903418eJohann//
199911b362b15af34006e6a11974088a46d42b903418eJohann//   TEST(FooTest, InitializesCorrectly) {
199921b362b15af34006e6a11974088a46d42b903418eJohann//     Foo foo;
199931b362b15af34006e6a11974088a46d42b903418eJohann//     EXPECT_TRUE(foo.StatusIsOK());
199941b362b15af34006e6a11974088a46d42b903418eJohann//   }
199951b362b15af34006e6a11974088a46d42b903418eJohann
199961b362b15af34006e6a11974088a46d42b903418eJohann// Note that we call GetTestTypeId() instead of GetTypeId<
199971b362b15af34006e6a11974088a46d42b903418eJohann// ::testing::Test>() here to get the type ID of testing::Test.  This
199981b362b15af34006e6a11974088a46d42b903418eJohann// is to work around a suspected linker bug when using Google Test as
199991b362b15af34006e6a11974088a46d42b903418eJohann// a framework on Mac OS X.  The bug causes GetTypeId<
200001b362b15af34006e6a11974088a46d42b903418eJohann// ::testing::Test>() to return different values depending on whether
200011b362b15af34006e6a11974088a46d42b903418eJohann// the call is from the Google Test framework itself or from user test
200021b362b15af34006e6a11974088a46d42b903418eJohann// code.  GetTestTypeId() is guaranteed to always return the same
200031b362b15af34006e6a11974088a46d42b903418eJohann// value, as it always calls GetTypeId<>() from the Google Test
200041b362b15af34006e6a11974088a46d42b903418eJohann// framework.
200051b362b15af34006e6a11974088a46d42b903418eJohann#define GTEST_TEST(test_case_name, test_name)\
200061b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_(test_case_name, test_name, \
200071b362b15af34006e6a11974088a46d42b903418eJohann              ::testing::Test, ::testing::internal::GetTestTypeId())
200081b362b15af34006e6a11974088a46d42b903418eJohann
200091b362b15af34006e6a11974088a46d42b903418eJohann// Define this macro to 1 to omit the definition of TEST(), which
200101b362b15af34006e6a11974088a46d42b903418eJohann// is a generic name and clashes with some other libraries.
200111b362b15af34006e6a11974088a46d42b903418eJohann#if !GTEST_DONT_DEFINE_TEST
200121b362b15af34006e6a11974088a46d42b903418eJohann# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
200131b362b15af34006e6a11974088a46d42b903418eJohann#endif
200141b362b15af34006e6a11974088a46d42b903418eJohann
200151b362b15af34006e6a11974088a46d42b903418eJohann// Defines a test that uses a test fixture.
200161b362b15af34006e6a11974088a46d42b903418eJohann//
200171b362b15af34006e6a11974088a46d42b903418eJohann// The first parameter is the name of the test fixture class, which
200181b362b15af34006e6a11974088a46d42b903418eJohann// also doubles as the test case name.  The second parameter is the
200191b362b15af34006e6a11974088a46d42b903418eJohann// name of the test within the test case.
200201b362b15af34006e6a11974088a46d42b903418eJohann//
200211b362b15af34006e6a11974088a46d42b903418eJohann// A test fixture class must be declared earlier.  The user should put
200221b362b15af34006e6a11974088a46d42b903418eJohann// his test code between braces after using this macro.  Example:
200231b362b15af34006e6a11974088a46d42b903418eJohann//
200241b362b15af34006e6a11974088a46d42b903418eJohann//   class FooTest : public testing::Test {
200251b362b15af34006e6a11974088a46d42b903418eJohann//    protected:
200261b362b15af34006e6a11974088a46d42b903418eJohann//     virtual void SetUp() { b_.AddElement(3); }
200271b362b15af34006e6a11974088a46d42b903418eJohann//
200281b362b15af34006e6a11974088a46d42b903418eJohann//     Foo a_;
200291b362b15af34006e6a11974088a46d42b903418eJohann//     Foo b_;
200301b362b15af34006e6a11974088a46d42b903418eJohann//   };
200311b362b15af34006e6a11974088a46d42b903418eJohann//
200321b362b15af34006e6a11974088a46d42b903418eJohann//   TEST_F(FooTest, InitializesCorrectly) {
200331b362b15af34006e6a11974088a46d42b903418eJohann//     EXPECT_TRUE(a_.StatusIsOK());
200341b362b15af34006e6a11974088a46d42b903418eJohann//   }
200351b362b15af34006e6a11974088a46d42b903418eJohann//
200361b362b15af34006e6a11974088a46d42b903418eJohann//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
200371b362b15af34006e6a11974088a46d42b903418eJohann//     EXPECT_EQ(0, a_.size());
200381b362b15af34006e6a11974088a46d42b903418eJohann//     EXPECT_EQ(1, b_.size());
200391b362b15af34006e6a11974088a46d42b903418eJohann//   }
200401b362b15af34006e6a11974088a46d42b903418eJohann
200411b362b15af34006e6a11974088a46d42b903418eJohann#define TEST_F(test_fixture, test_name)\
200421b362b15af34006e6a11974088a46d42b903418eJohann  GTEST_TEST_(test_fixture, test_name, test_fixture, \
200431b362b15af34006e6a11974088a46d42b903418eJohann              ::testing::internal::GetTypeId<test_fixture>())
200441b362b15af34006e6a11974088a46d42b903418eJohann
200455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
200465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
200475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Use this function in main() to run all tests.  It returns 0 if all
200481b362b15af34006e6a11974088a46d42b903418eJohann// tests are successful, or 1 otherwise.
200491b362b15af34006e6a11974088a46d42b903418eJohann//
200501b362b15af34006e6a11974088a46d42b903418eJohann// RUN_ALL_TESTS() should be invoked after the command line has been
200511b362b15af34006e6a11974088a46d42b903418eJohann// parsed by InitGoogleTest().
200525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
200535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This function was formerly a macro; thus, it is in the global
200545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// namespace and has an all-caps name.
200555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
200561b362b15af34006e6a11974088a46d42b903418eJohann
200575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int RUN_ALL_TESTS() {
200585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ::testing::UnitTest::GetInstance()->Run();
200595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
200601b362b15af34006e6a11974088a46d42b903418eJohann
200611b362b15af34006e6a11974088a46d42b903418eJohann#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
20062