Model loading and texturing
This commit is contained in:
		
							
								
								
									
										294
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-death-test.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-death-test.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,294 @@
 | 
			
		||||
// Copyright 2005, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This header file defines the public API for death tests.  It is
 | 
			
		||||
// #included by gtest.h so a user doesn't need to include this
 | 
			
		||||
// directly.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-death-test-internal.h"
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// This flag controls the style of death tests.  Valid values are "threadsafe",
 | 
			
		||||
// meaning that the death test child process will re-execute the test binary
 | 
			
		||||
// from the start, running only a single death test, or "fast",
 | 
			
		||||
// meaning that the child process will execute the test logic immediately
 | 
			
		||||
// after forking.
 | 
			
		||||
GTEST_DECLARE_string_(death_test_style);
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// Returns a Boolean value indicating whether the caller is currently
 | 
			
		||||
// executing in the context of the death test child process.  Tools such as
 | 
			
		||||
// Valgrind heap checkers may need this to modify their behavior in death
 | 
			
		||||
// tests.  IMPORTANT: This is an internal utility.  Using it may break the
 | 
			
		||||
// implementation of death tests.  User code MUST NOT use it.
 | 
			
		||||
GTEST_API_ bool InDeathTestChild();
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
// The following macros are useful for writing death tests.
 | 
			
		||||
 | 
			
		||||
// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
 | 
			
		||||
// executed:
 | 
			
		||||
//
 | 
			
		||||
//   1. It generates a warning if there is more than one active
 | 
			
		||||
//   thread.  This is because it's safe to fork() or clone() only
 | 
			
		||||
//   when there is a single thread.
 | 
			
		||||
//
 | 
			
		||||
//   2. The parent process clone()s a sub-process and runs the death
 | 
			
		||||
//   test in it; the sub-process exits with code 0 at the end of the
 | 
			
		||||
//   death test, if it hasn't exited already.
 | 
			
		||||
//
 | 
			
		||||
//   3. The parent process waits for the sub-process to terminate.
 | 
			
		||||
//
 | 
			
		||||
//   4. The parent process checks the exit code and error message of
 | 
			
		||||
//   the sub-process.
 | 
			
		||||
//
 | 
			
		||||
// Examples:
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
 | 
			
		||||
//   for (int i = 0; i < 5; i++) {
 | 
			
		||||
//     EXPECT_DEATH(server.ProcessRequest(i),
 | 
			
		||||
//                  "Invalid request .* in ProcessRequest()")
 | 
			
		||||
//                  << "Failed to die on request " << i;
 | 
			
		||||
//   }
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
 | 
			
		||||
//
 | 
			
		||||
//   bool KilledBySIGHUP(int exit_code) {
 | 
			
		||||
//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
 | 
			
		||||
//   }
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
 | 
			
		||||
//
 | 
			
		||||
// On the regular expressions used in death tests:
 | 
			
		||||
//
 | 
			
		||||
//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
 | 
			
		||||
//   which uses the POSIX extended regex syntax.
 | 
			
		||||
//
 | 
			
		||||
//   On other platforms (e.g. Windows), we only support a simple regex
 | 
			
		||||
//   syntax implemented as part of Google Test.  This limited
 | 
			
		||||
//   implementation should be enough most of the time when writing
 | 
			
		||||
//   death tests; though it lacks many features you can find in PCRE
 | 
			
		||||
//   or POSIX extended regex syntax.  For example, we don't support
 | 
			
		||||
//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
 | 
			
		||||
//   repetition count ("x{5,7}"), among others.
 | 
			
		||||
//
 | 
			
		||||
//   Below is the syntax that we do support.  We chose it to be a
 | 
			
		||||
//   subset of both PCRE and POSIX extended regex, so it's easy to
 | 
			
		||||
//   learn wherever you come from.  In the following: 'A' denotes a
 | 
			
		||||
//   literal character, period (.), or a single \\ escape sequence;
 | 
			
		||||
//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
 | 
			
		||||
//   natural numbers.
 | 
			
		||||
//
 | 
			
		||||
//     c     matches any literal character c
 | 
			
		||||
//     \\d   matches any decimal digit
 | 
			
		||||
//     \\D   matches any character that's not a decimal digit
 | 
			
		||||
//     \\f   matches \f
 | 
			
		||||
//     \\n   matches \n
 | 
			
		||||
//     \\r   matches \r
 | 
			
		||||
//     \\s   matches any ASCII whitespace, including \n
 | 
			
		||||
//     \\S   matches any character that's not a whitespace
 | 
			
		||||
//     \\t   matches \t
 | 
			
		||||
//     \\v   matches \v
 | 
			
		||||
//     \\w   matches any letter, _, or decimal digit
 | 
			
		||||
//     \\W   matches any character that \\w doesn't match
 | 
			
		||||
//     \\c   matches any literal character c, which must be a punctuation
 | 
			
		||||
//     .     matches any single character except \n
 | 
			
		||||
//     A?    matches 0 or 1 occurrences of A
 | 
			
		||||
//     A*    matches 0 or many occurrences of A
 | 
			
		||||
//     A+    matches 1 or many occurrences of A
 | 
			
		||||
//     ^     matches the beginning of a string (not that of each line)
 | 
			
		||||
//     $     matches the end of a string (not that of each line)
 | 
			
		||||
//     xy    matches x followed by y
 | 
			
		||||
//
 | 
			
		||||
//   If you accidentally use PCRE or POSIX extended regex features
 | 
			
		||||
//   not implemented by us, you will get a run-time failure.  In that
 | 
			
		||||
//   case, please try to rewrite your regular expression within the
 | 
			
		||||
//   above syntax.
 | 
			
		||||
//
 | 
			
		||||
//   This implementation is *not* meant to be as highly tuned or robust
 | 
			
		||||
//   as a compiled regex library, but should perform well enough for a
 | 
			
		||||
//   death test, which already incurs significant overhead by launching
 | 
			
		||||
//   a child process.
 | 
			
		||||
//
 | 
			
		||||
// Known caveats:
 | 
			
		||||
//
 | 
			
		||||
//   A "threadsafe" style death test obtains the path to the test
 | 
			
		||||
//   program from argv[0] and re-executes it in the sub-process.  For
 | 
			
		||||
//   simplicity, the current implementation doesn't search the PATH
 | 
			
		||||
//   when launching the sub-process.  This means that the user must
 | 
			
		||||
//   invoke the test program via a path that contains at least one
 | 
			
		||||
//   path separator (e.g. path/to/foo_test and
 | 
			
		||||
//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
 | 
			
		||||
//   is rarely a problem as people usually don't put the test binary
 | 
			
		||||
//   directory in PATH.
 | 
			
		||||
//
 | 
			
		||||
// TODO(wan@google.com): make thread-safe death tests search the PATH.
 | 
			
		||||
 | 
			
		||||
// Asserts that a given statement causes the program to exit, with an
 | 
			
		||||
// integer exit status that satisfies predicate, and emitting error output
 | 
			
		||||
// that matches regex.
 | 
			
		||||
# define ASSERT_EXIT(statement, predicate, regex) \
 | 
			
		||||
    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
// Like ASSERT_EXIT, but continues on to successive tests in the
 | 
			
		||||
// test case, if any:
 | 
			
		||||
# define EXPECT_EXIT(statement, predicate, regex) \
 | 
			
		||||
    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
// Asserts that a given statement causes the program to exit, either by
 | 
			
		||||
// explicitly exiting with a nonzero exit code or being killed by a
 | 
			
		||||
// signal, and emitting error output that matches regex.
 | 
			
		||||
# define ASSERT_DEATH(statement, regex) \
 | 
			
		||||
    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
 | 
			
		||||
 | 
			
		||||
// Like ASSERT_DEATH, but continues on to successive tests in the
 | 
			
		||||
// test case, if any:
 | 
			
		||||
# define EXPECT_DEATH(statement, regex) \
 | 
			
		||||
    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
 | 
			
		||||
 | 
			
		||||
// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
 | 
			
		||||
 | 
			
		||||
// Tests that an exit code describes a normal exit with a given exit code.
 | 
			
		||||
class GTEST_API_ ExitedWithCode {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit ExitedWithCode(int exit_code);
 | 
			
		||||
  bool operator()(int exit_status) const;
 | 
			
		||||
 private:
 | 
			
		||||
  // No implementation - assignment is unsupported.
 | 
			
		||||
  void operator=(const ExitedWithCode& other);
 | 
			
		||||
 | 
			
		||||
  const int exit_code_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
# if !GTEST_OS_WINDOWS
 | 
			
		||||
// Tests that an exit code describes an exit due to termination by a
 | 
			
		||||
// given signal.
 | 
			
		||||
class GTEST_API_ KilledBySignal {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit KilledBySignal(int signum);
 | 
			
		||||
  bool operator()(int exit_status) const;
 | 
			
		||||
 private:
 | 
			
		||||
  const int signum_;
 | 
			
		||||
};
 | 
			
		||||
# endif  // !GTEST_OS_WINDOWS
 | 
			
		||||
 | 
			
		||||
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
 | 
			
		||||
// The death testing framework causes this to have interesting semantics,
 | 
			
		||||
// since the sideeffects of the call are only visible in opt mode, and not
 | 
			
		||||
// in debug mode.
 | 
			
		||||
//
 | 
			
		||||
// In practice, this can be used to test functions that utilize the
 | 
			
		||||
// LOG(DFATAL) macro using the following style:
 | 
			
		||||
//
 | 
			
		||||
// int DieInDebugOr12(int* sideeffect) {
 | 
			
		||||
//   if (sideeffect) {
 | 
			
		||||
//     *sideeffect = 12;
 | 
			
		||||
//   }
 | 
			
		||||
//   LOG(DFATAL) << "death";
 | 
			
		||||
//   return 12;
 | 
			
		||||
// }
 | 
			
		||||
//
 | 
			
		||||
// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
 | 
			
		||||
//   int sideeffect = 0;
 | 
			
		||||
//   // Only asserts in dbg.
 | 
			
		||||
//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
 | 
			
		||||
//
 | 
			
		||||
// #ifdef NDEBUG
 | 
			
		||||
//   // opt-mode has sideeffect visible.
 | 
			
		||||
//   EXPECT_EQ(12, sideeffect);
 | 
			
		||||
// #else
 | 
			
		||||
//   // dbg-mode no visible sideeffect.
 | 
			
		||||
//   EXPECT_EQ(0, sideeffect);
 | 
			
		||||
// #endif
 | 
			
		||||
// }
 | 
			
		||||
//
 | 
			
		||||
// This will assert that DieInDebugReturn12InOpt() crashes in debug
 | 
			
		||||
// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
 | 
			
		||||
// appropriate fallback value (12 in this case) in opt mode. If you
 | 
			
		||||
// need to test that a function has appropriate side-effects in opt
 | 
			
		||||
// mode, include assertions against the side-effects.  A general
 | 
			
		||||
// pattern for this is:
 | 
			
		||||
//
 | 
			
		||||
// EXPECT_DEBUG_DEATH({
 | 
			
		||||
//   // Side-effects here will have an effect after this statement in
 | 
			
		||||
//   // opt mode, but none in debug mode.
 | 
			
		||||
//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
 | 
			
		||||
// }, "death");
 | 
			
		||||
//
 | 
			
		||||
# ifdef NDEBUG
 | 
			
		||||
 | 
			
		||||
#  define EXPECT_DEBUG_DEATH(statement, regex) \
 | 
			
		||||
  GTEST_EXECUTE_STATEMENT_(statement, regex)
 | 
			
		||||
 | 
			
		||||
#  define ASSERT_DEBUG_DEATH(statement, regex) \
 | 
			
		||||
  GTEST_EXECUTE_STATEMENT_(statement, regex)
 | 
			
		||||
 | 
			
		||||
# else
 | 
			
		||||
 | 
			
		||||
#  define EXPECT_DEBUG_DEATH(statement, regex) \
 | 
			
		||||
  EXPECT_DEATH(statement, regex)
 | 
			
		||||
 | 
			
		||||
#  define ASSERT_DEBUG_DEATH(statement, regex) \
 | 
			
		||||
  ASSERT_DEATH(statement, regex)
 | 
			
		||||
 | 
			
		||||
# endif  // NDEBUG for EXPECT_DEBUG_DEATH
 | 
			
		||||
#endif  // GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
 | 
			
		||||
// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
 | 
			
		||||
// death tests are supported; otherwise they just issue a warning.  This is
 | 
			
		||||
// useful when you are combining death test assertions with normal test
 | 
			
		||||
// assertions in one test.
 | 
			
		||||
#if GTEST_HAS_DEATH_TEST
 | 
			
		||||
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
 | 
			
		||||
    EXPECT_DEATH(statement, regex)
 | 
			
		||||
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
 | 
			
		||||
    ASSERT_DEATH(statement, regex)
 | 
			
		||||
#else
 | 
			
		||||
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
 | 
			
		||||
    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
 | 
			
		||||
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
 | 
			
		||||
    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
 | 
			
		||||
							
								
								
									
										250
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-message.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-message.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,250 @@
 | 
			
		||||
// Copyright 2005, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This header file defines the Message class.
 | 
			
		||||
//
 | 
			
		||||
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
 | 
			
		||||
// leave some internal implementation details in this header file.
 | 
			
		||||
// They are clearly marked by comments like this:
 | 
			
		||||
//
 | 
			
		||||
//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | 
			
		||||
//
 | 
			
		||||
// Such code is NOT meant to be used by a user directly, and is subject
 | 
			
		||||
// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
 | 
			
		||||
// program!
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
 | 
			
		||||
 | 
			
		||||
#include <limits>
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
 | 
			
		||||
// Ensures that there is at least one operator<< in the global namespace.
 | 
			
		||||
// See Message& operator<<(...) below for why.
 | 
			
		||||
void operator<<(const testing::internal::Secret&, int);
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// The Message class works like an ostream repeater.
 | 
			
		||||
//
 | 
			
		||||
// Typical usage:
 | 
			
		||||
//
 | 
			
		||||
//   1. You stream a bunch of values to a Message object.
 | 
			
		||||
//      It will remember the text in a stringstream.
 | 
			
		||||
//   2. Then you stream the Message object to an ostream.
 | 
			
		||||
//      This causes the text in the Message to be streamed
 | 
			
		||||
//      to the ostream.
 | 
			
		||||
//
 | 
			
		||||
// For example;
 | 
			
		||||
//
 | 
			
		||||
//   testing::Message foo;
 | 
			
		||||
//   foo << 1 << " != " << 2;
 | 
			
		||||
//   std::cout << foo;
 | 
			
		||||
//
 | 
			
		||||
// will print "1 != 2".
 | 
			
		||||
//
 | 
			
		||||
// Message is not intended to be inherited from.  In particular, its
 | 
			
		||||
// destructor is not virtual.
 | 
			
		||||
//
 | 
			
		||||
// Note that stringstream behaves differently in gcc and in MSVC.  You
 | 
			
		||||
// can stream a NULL char pointer to it in the former, but not in the
 | 
			
		||||
// latter (it causes an access violation if you do).  The Message
 | 
			
		||||
// class hides this difference by treating a NULL char pointer as
 | 
			
		||||
// "(null)".
 | 
			
		||||
class GTEST_API_ Message {
 | 
			
		||||
 private:
 | 
			
		||||
  // The type of basic IO manipulators (endl, ends, and flush) for
 | 
			
		||||
  // narrow streams.
 | 
			
		||||
  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // Constructs an empty Message.
 | 
			
		||||
  Message();
 | 
			
		||||
 | 
			
		||||
  // Copy constructor.
 | 
			
		||||
  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
 | 
			
		||||
    *ss_ << msg.GetString();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Constructs a Message from a C-string.
 | 
			
		||||
  explicit Message(const char* str) : ss_(new ::std::stringstream) {
 | 
			
		||||
    *ss_ << str;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_SYMBIAN
 | 
			
		||||
  // Streams a value (either a pointer or not) to this object.
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  inline Message& operator <<(const T& value) {
 | 
			
		||||
    StreamHelper(typename internal::is_pointer<T>::type(), value);
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
#else
 | 
			
		||||
  // Streams a non-pointer value to this object.
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  inline Message& operator <<(const T& val) {
 | 
			
		||||
    // Some libraries overload << for STL containers.  These
 | 
			
		||||
    // overloads are defined in the global namespace instead of ::std.
 | 
			
		||||
    //
 | 
			
		||||
    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
 | 
			
		||||
    // overloads are visible in either the std namespace or the global
 | 
			
		||||
    // namespace, but not other namespaces, including the testing
 | 
			
		||||
    // namespace which Google Test's Message class is in.
 | 
			
		||||
    //
 | 
			
		||||
    // To allow STL containers (and other types that has a << operator
 | 
			
		||||
    // defined in the global namespace) to be used in Google Test
 | 
			
		||||
    // assertions, testing::Message must access the custom << operator
 | 
			
		||||
    // from the global namespace.  With this using declaration,
 | 
			
		||||
    // overloads of << defined in the global namespace and those
 | 
			
		||||
    // visible via Koenig lookup are both exposed in this function.
 | 
			
		||||
    using ::operator <<;
 | 
			
		||||
    *ss_ << val;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Streams a pointer value to this object.
 | 
			
		||||
  //
 | 
			
		||||
  // This function is an overload of the previous one.  When you
 | 
			
		||||
  // stream a pointer to a Message, this definition will be used as it
 | 
			
		||||
  // is more specialized.  (The C++ Standard, section
 | 
			
		||||
  // [temp.func.order].)  If you stream a non-pointer, then the
 | 
			
		||||
  // previous definition will be used.
 | 
			
		||||
  //
 | 
			
		||||
  // The reason for this overload is that streaming a NULL pointer to
 | 
			
		||||
  // ostream is undefined behavior.  Depending on the compiler, you
 | 
			
		||||
  // may get "0", "(nil)", "(null)", or an access violation.  To
 | 
			
		||||
  // ensure consistent result across compilers, we always treat NULL
 | 
			
		||||
  // as "(null)".
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  inline Message& operator <<(T* const& pointer) {  // NOLINT
 | 
			
		||||
    if (pointer == NULL) {
 | 
			
		||||
      *ss_ << "(null)";
 | 
			
		||||
    } else {
 | 
			
		||||
      *ss_ << pointer;
 | 
			
		||||
    }
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
#endif  // GTEST_OS_SYMBIAN
 | 
			
		||||
 | 
			
		||||
  // Since the basic IO manipulators are overloaded for both narrow
 | 
			
		||||
  // and wide streams, we have to provide this specialized definition
 | 
			
		||||
  // of operator <<, even though its body is the same as the
 | 
			
		||||
  // templatized version above.  Without this definition, streaming
 | 
			
		||||
  // endl or other basic IO manipulators to Message will confuse the
 | 
			
		||||
  // compiler.
 | 
			
		||||
  Message& operator <<(BasicNarrowIoManip val) {
 | 
			
		||||
    *ss_ << val;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Instead of 1/0, we want to see true/false for bool values.
 | 
			
		||||
  Message& operator <<(bool b) {
 | 
			
		||||
    return *this << (b ? "true" : "false");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // These two overloads allow streaming a wide C string to a Message
 | 
			
		||||
  // using the UTF-8 encoding.
 | 
			
		||||
  Message& operator <<(const wchar_t* wide_c_str);
 | 
			
		||||
  Message& operator <<(wchar_t* wide_c_str);
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_WSTRING
 | 
			
		||||
  // Converts the given wide string to a narrow string using the UTF-8
 | 
			
		||||
  // encoding, and streams the result to this Message object.
 | 
			
		||||
  Message& operator <<(const ::std::wstring& wstr);
 | 
			
		||||
#endif  // GTEST_HAS_STD_WSTRING
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_GLOBAL_WSTRING
 | 
			
		||||
  // Converts the given wide string to a narrow string using the UTF-8
 | 
			
		||||
  // encoding, and streams the result to this Message object.
 | 
			
		||||
  Message& operator <<(const ::wstring& wstr);
 | 
			
		||||
#endif  // GTEST_HAS_GLOBAL_WSTRING
 | 
			
		||||
 | 
			
		||||
  // Gets the text streamed to this object so far as an std::string.
 | 
			
		||||
  // Each '\0' character in the buffer is replaced with "\\0".
 | 
			
		||||
  //
 | 
			
		||||
  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | 
			
		||||
  std::string GetString() const;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_SYMBIAN
 | 
			
		||||
  // These are needed as the Nokia Symbian Compiler cannot decide between
 | 
			
		||||
  // const T& and const T* in a function template. The Nokia compiler _can_
 | 
			
		||||
  // decide between class template specializations for T and T*, so a
 | 
			
		||||
  // tr1::type_traits-like is_pointer works, and we can overload on that.
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
 | 
			
		||||
    if (pointer == NULL) {
 | 
			
		||||
      *ss_ << "(null)";
 | 
			
		||||
    } else {
 | 
			
		||||
      *ss_ << pointer;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  inline void StreamHelper(internal::false_type /*is_pointer*/,
 | 
			
		||||
                           const T& value) {
 | 
			
		||||
    // See the comments in Message& operator <<(const T&) above for why
 | 
			
		||||
    // we need this using statement.
 | 
			
		||||
    using ::operator <<;
 | 
			
		||||
    *ss_ << value;
 | 
			
		||||
  }
 | 
			
		||||
#endif  // GTEST_OS_SYMBIAN
 | 
			
		||||
 | 
			
		||||
  // We'll hold the text streamed to this object here.
 | 
			
		||||
  const internal::scoped_ptr< ::std::stringstream> ss_;
 | 
			
		||||
 | 
			
		||||
  // We declare (but don't implement) this to prevent the compiler
 | 
			
		||||
  // from implementing the assignment operator.
 | 
			
		||||
  void operator=(const Message&);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Streams a Message to an ostream.
 | 
			
		||||
inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
 | 
			
		||||
  return os << sb.GetString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// Converts a streamable value to an std::string.  A NULL pointer is
 | 
			
		||||
// converted to "(null)".  When the input value is a ::string,
 | 
			
		||||
// ::std::string, ::wstring, or ::std::wstring object, each NUL
 | 
			
		||||
// character in it is replaced with "\\0".
 | 
			
		||||
template <typename T>
 | 
			
		||||
std::string StreamableToString(const T& streamable) {
 | 
			
		||||
  return (Message() << streamable).GetString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
 | 
			
		||||
							
								
								
									
										1444
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-param-test.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1444
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-param-test.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										510
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-param-test.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										510
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-param-test.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,510 @@
 | 
			
		||||
$$ -*- mode: c++; -*-
 | 
			
		||||
$var n = 50  $$ Maximum length of Values arguments we want to support.
 | 
			
		||||
$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
 | 
			
		||||
// Copyright 2008, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Authors: vladl@google.com (Vlad Losev)
 | 
			
		||||
//
 | 
			
		||||
// Macros and functions for implementing parameterized tests
 | 
			
		||||
// in Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
 | 
			
		||||
//
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Value-parameterized tests allow you to test your code with different
 | 
			
		||||
// parameters without writing multiple copies of the same test.
 | 
			
		||||
//
 | 
			
		||||
// Here is how you use value-parameterized tests:
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
 | 
			
		||||
// To write value-parameterized tests, first you should define a fixture
 | 
			
		||||
// class. It is usually derived from testing::TestWithParam<T> (see below for
 | 
			
		||||
// another inheritance scheme that's sometimes useful in more complicated
 | 
			
		||||
// class hierarchies), where the type of your parameter values.
 | 
			
		||||
// TestWithParam<T> is itself derived from testing::Test. T can be any
 | 
			
		||||
// copyable type. If it's a raw pointer, you are responsible for managing the
 | 
			
		||||
// lifespan of the pointed values.
 | 
			
		||||
 | 
			
		||||
class FooTest : public ::testing::TestWithParam<const char*> {
 | 
			
		||||
  // You can implement all the usual class fixture members here.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Then, use the TEST_P macro to define as many parameterized tests
 | 
			
		||||
// for this fixture as you want. The _P suffix is for "parameterized"
 | 
			
		||||
// or "pattern", whichever you prefer to think.
 | 
			
		||||
 | 
			
		||||
TEST_P(FooTest, DoesBlah) {
 | 
			
		||||
  // Inside a test, access the test parameter with the GetParam() method
 | 
			
		||||
  // of the TestWithParam<T> class:
 | 
			
		||||
  EXPECT_TRUE(foo.Blah(GetParam()));
 | 
			
		||||
  ...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(FooTest, HasBlahBlah) {
 | 
			
		||||
  ...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
 | 
			
		||||
// case with any set of parameters you want. Google Test defines a number
 | 
			
		||||
// of functions for generating test parameters. They return what we call
 | 
			
		||||
// (surprise!) parameter generators. Here is a  summary of them, which
 | 
			
		||||
// are all in the testing namespace:
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Range(begin, end [, step]) - Yields values {begin, begin+step,
 | 
			
		||||
//                               begin+step+step, ...}. The values do not
 | 
			
		||||
//                               include end. step defaults to 1.
 | 
			
		||||
//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
 | 
			
		||||
//  ValuesIn(container)        - Yields values from a C-style array, an STL
 | 
			
		||||
//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
 | 
			
		||||
//  Bool()                     - Yields sequence {false, true}.
 | 
			
		||||
//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
 | 
			
		||||
//                               for the math savvy) of the values generated
 | 
			
		||||
//                               by the N generators.
 | 
			
		||||
//
 | 
			
		||||
// For more details, see comments at the definitions of these functions below
 | 
			
		||||
// in this file.
 | 
			
		||||
//
 | 
			
		||||
// The following statement will instantiate tests from the FooTest test case
 | 
			
		||||
// each with parameter values "meeny", "miny", and "moe".
 | 
			
		||||
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(InstantiationName,
 | 
			
		||||
                        FooTest,
 | 
			
		||||
                        Values("meeny", "miny", "moe"));
 | 
			
		||||
 | 
			
		||||
// To distinguish different instances of the pattern, (yes, you
 | 
			
		||||
// can instantiate it more then once) the first argument to the
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
 | 
			
		||||
// actual test case name. Remember to pick unique prefixes for different
 | 
			
		||||
// instantiations. The tests from the instantiation above will have
 | 
			
		||||
// these names:
 | 
			
		||||
//
 | 
			
		||||
//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
 | 
			
		||||
//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
 | 
			
		||||
//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
 | 
			
		||||
//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
 | 
			
		||||
//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
 | 
			
		||||
//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
 | 
			
		||||
//
 | 
			
		||||
// You can use these names in --gtest_filter.
 | 
			
		||||
//
 | 
			
		||||
// This statement will instantiate all tests from FooTest again, each
 | 
			
		||||
// with parameter values "cat" and "dog":
 | 
			
		||||
 | 
			
		||||
const char* pets[] = {"cat", "dog"};
 | 
			
		||||
INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
 | 
			
		||||
 | 
			
		||||
// The tests from the instantiation above will have these names:
 | 
			
		||||
//
 | 
			
		||||
//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
 | 
			
		||||
//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
 | 
			
		||||
//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
 | 
			
		||||
//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
 | 
			
		||||
//
 | 
			
		||||
// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
 | 
			
		||||
// in the given test case, whether their definitions come before or
 | 
			
		||||
// AFTER the INSTANTIATE_TEST_CASE_P statement.
 | 
			
		||||
//
 | 
			
		||||
// Please also note that generator expressions (including parameters to the
 | 
			
		||||
// generators) are evaluated in InitGoogleTest(), after main() has started.
 | 
			
		||||
// This allows the user on one hand, to adjust generator parameters in order
 | 
			
		||||
// to dynamically determine a set of tests to run and on the other hand,
 | 
			
		||||
// give the user a chance to inspect the generated tests with Google Test
 | 
			
		||||
// reflection API before RUN_ALL_TESTS() is executed.
 | 
			
		||||
//
 | 
			
		||||
// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
 | 
			
		||||
// for more examples.
 | 
			
		||||
//
 | 
			
		||||
// In the future, we plan to publish the API for defining new parameter
 | 
			
		||||
// generators. But for now this interface remains part of the internal
 | 
			
		||||
// implementation and is subject to change.
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// A parameterized test fixture must be derived from testing::Test and from
 | 
			
		||||
// testing::WithParamInterface<T>, where T is the type of the parameter
 | 
			
		||||
// values. Inheriting from TestWithParam<T> satisfies that requirement because
 | 
			
		||||
// TestWithParam<T> inherits from both Test and WithParamInterface. In more
 | 
			
		||||
// complicated hierarchies, however, it is occasionally useful to inherit
 | 
			
		||||
// separately from Test and WithParamInterface. For example:
 | 
			
		||||
 | 
			
		||||
class BaseTest : public ::testing::Test {
 | 
			
		||||
  // You can inherit all the usual members for a non-parameterized test
 | 
			
		||||
  // fixture here.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
 | 
			
		||||
  // The usual test fixture members go here too.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(BaseTest, HasFoo) {
 | 
			
		||||
  // This is an ordinary non-parameterized test.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_P(DerivedTest, DoesBlah) {
 | 
			
		||||
  // GetParam works just the same here as if you inherit from TestWithParam.
 | 
			
		||||
  EXPECT_TRUE(foo.Blah(GetParam()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // 0
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
 | 
			
		||||
#if !GTEST_OS_SYMBIAN
 | 
			
		||||
# include <utility>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// scripts/fuse_gtest.py depends on gtest's own header being #included
 | 
			
		||||
// *unconditionally*.  Therefore these #includes cannot be moved
 | 
			
		||||
// inside #if GTEST_HAS_PARAM_TEST.
 | 
			
		||||
#include "gtest/internal/gtest-internal.h"
 | 
			
		||||
#include "gtest/internal/gtest-param-util.h"
 | 
			
		||||
#include "gtest/internal/gtest-param-util-generated.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// Functions producing parameter generators.
 | 
			
		||||
//
 | 
			
		||||
// Google Test uses these generators to produce parameters for value-
 | 
			
		||||
// parameterized tests. When a parameterized test case is instantiated
 | 
			
		||||
// with a particular generator, Google Test creates and runs tests
 | 
			
		||||
// for each element in the sequence produced by the generator.
 | 
			
		||||
//
 | 
			
		||||
// In the following sample, tests from test case FooTest are instantiated
 | 
			
		||||
// each three times with parameter values 3, 5, and 8:
 | 
			
		||||
//
 | 
			
		||||
// class FooTest : public TestWithParam<int> { ... };
 | 
			
		||||
//
 | 
			
		||||
// TEST_P(FooTest, TestThis) {
 | 
			
		||||
// }
 | 
			
		||||
// TEST_P(FooTest, TestThat) {
 | 
			
		||||
// }
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Range() returns generators providing sequences of values in a range.
 | 
			
		||||
//
 | 
			
		||||
// Synopsis:
 | 
			
		||||
// Range(start, end)
 | 
			
		||||
//   - returns a generator producing a sequence of values {start, start+1,
 | 
			
		||||
//     start+2, ..., }.
 | 
			
		||||
// Range(start, end, step)
 | 
			
		||||
//   - returns a generator producing a sequence of values {start, start+step,
 | 
			
		||||
//     start+step+step, ..., }.
 | 
			
		||||
// Notes:
 | 
			
		||||
//   * The generated sequences never include end. For example, Range(1, 5)
 | 
			
		||||
//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
 | 
			
		||||
//     returns a generator producing {1, 3, 5, 7}.
 | 
			
		||||
//   * start and end must have the same type. That type may be any integral or
 | 
			
		||||
//     floating-point type or a user defined type satisfying these conditions:
 | 
			
		||||
//     * It must be assignable (have operator=() defined).
 | 
			
		||||
//     * It must have operator+() (operator+(int-compatible type) for
 | 
			
		||||
//       two-operand version).
 | 
			
		||||
//     * It must have operator<() defined.
 | 
			
		||||
//     Elements in the resulting sequences will also have that type.
 | 
			
		||||
//   * Condition start < end must be satisfied in order for resulting sequences
 | 
			
		||||
//     to contain any elements.
 | 
			
		||||
//
 | 
			
		||||
template <typename T, typename IncrementT>
 | 
			
		||||
internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
 | 
			
		||||
  return internal::ParamGenerator<T>(
 | 
			
		||||
      new internal::RangeGenerator<T, IncrementT>(start, end, step));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
internal::ParamGenerator<T> Range(T start, T end) {
 | 
			
		||||
  return Range(start, end, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValuesIn() function allows generation of tests with parameters coming from
 | 
			
		||||
// a container.
 | 
			
		||||
//
 | 
			
		||||
// Synopsis:
 | 
			
		||||
// ValuesIn(const T (&array)[N])
 | 
			
		||||
//   - returns a generator producing sequences with elements from
 | 
			
		||||
//     a C-style array.
 | 
			
		||||
// ValuesIn(const Container& container)
 | 
			
		||||
//   - returns a generator producing sequences with elements from
 | 
			
		||||
//     an STL-style container.
 | 
			
		||||
// ValuesIn(Iterator begin, Iterator end)
 | 
			
		||||
//   - returns a generator producing sequences with elements from
 | 
			
		||||
//     a range [begin, end) defined by a pair of STL-style iterators. These
 | 
			
		||||
//     iterators can also be plain C pointers.
 | 
			
		||||
//
 | 
			
		||||
// Please note that ValuesIn copies the values from the containers
 | 
			
		||||
// passed in and keeps them to generate tests in RUN_ALL_TESTS().
 | 
			
		||||
//
 | 
			
		||||
// Examples:
 | 
			
		||||
//
 | 
			
		||||
// This instantiates tests from test case StringTest
 | 
			
		||||
// each with C-string values of "foo", "bar", and "baz":
 | 
			
		||||
//
 | 
			
		||||
// const char* strings[] = {"foo", "bar", "baz"};
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
 | 
			
		||||
//
 | 
			
		||||
// This instantiates tests from test case StlStringTest
 | 
			
		||||
// each with STL strings with values "a" and "b":
 | 
			
		||||
//
 | 
			
		||||
// ::std::vector< ::std::string> GetParameterStrings() {
 | 
			
		||||
//   ::std::vector< ::std::string> v;
 | 
			
		||||
//   v.push_back("a");
 | 
			
		||||
//   v.push_back("b");
 | 
			
		||||
//   return v;
 | 
			
		||||
// }
 | 
			
		||||
//
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(CharSequence,
 | 
			
		||||
//                         StlStringTest,
 | 
			
		||||
//                         ValuesIn(GetParameterStrings()));
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// This will also instantiate tests from CharTest
 | 
			
		||||
// each with parameter values 'a' and 'b':
 | 
			
		||||
//
 | 
			
		||||
// ::std::list<char> GetParameterChars() {
 | 
			
		||||
//   ::std::list<char> list;
 | 
			
		||||
//   list.push_back('a');
 | 
			
		||||
//   list.push_back('b');
 | 
			
		||||
//   return list;
 | 
			
		||||
// }
 | 
			
		||||
// ::std::list<char> l = GetParameterChars();
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(CharSequence2,
 | 
			
		||||
//                         CharTest,
 | 
			
		||||
//                         ValuesIn(l.begin(), l.end()));
 | 
			
		||||
//
 | 
			
		||||
template <typename ForwardIterator>
 | 
			
		||||
internal::ParamGenerator<
 | 
			
		||||
  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
 | 
			
		||||
ValuesIn(ForwardIterator begin, ForwardIterator end) {
 | 
			
		||||
  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
 | 
			
		||||
      ::value_type ParamType;
 | 
			
		||||
  return internal::ParamGenerator<ParamType>(
 | 
			
		||||
      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T, size_t N>
 | 
			
		||||
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
 | 
			
		||||
  return ValuesIn(array, array + N);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Container>
 | 
			
		||||
internal::ParamGenerator<typename Container::value_type> ValuesIn(
 | 
			
		||||
    const Container& container) {
 | 
			
		||||
  return ValuesIn(container.begin(), container.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Values() allows generating tests from explicitly specified list of
 | 
			
		||||
// parameters.
 | 
			
		||||
//
 | 
			
		||||
// Synopsis:
 | 
			
		||||
// Values(T v1, T v2, ..., T vN)
 | 
			
		||||
//   - returns a generator producing sequences with elements v1, v2, ..., vN.
 | 
			
		||||
//
 | 
			
		||||
// For example, this instantiates tests from test case BarTest each
 | 
			
		||||
// with values "one", "two", and "three":
 | 
			
		||||
//
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
 | 
			
		||||
//
 | 
			
		||||
// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
 | 
			
		||||
// The exact type of values will depend on the type of parameter in BazTest.
 | 
			
		||||
//
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
 | 
			
		||||
//
 | 
			
		||||
// Currently, Values() supports from 1 to $n parameters.
 | 
			
		||||
//
 | 
			
		||||
$range i 1..n
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
 | 
			
		||||
template <$for j, [[typename T$j]]>
 | 
			
		||||
internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {
 | 
			
		||||
  return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// Bool() allows generating tests with parameters in a set of (false, true).
 | 
			
		||||
//
 | 
			
		||||
// Synopsis:
 | 
			
		||||
// Bool()
 | 
			
		||||
//   - returns a generator producing sequences with elements {false, true}.
 | 
			
		||||
//
 | 
			
		||||
// It is useful when testing code that depends on Boolean flags. Combinations
 | 
			
		||||
// of multiple flags can be tested when several Bool()'s are combined using
 | 
			
		||||
// Combine() function.
 | 
			
		||||
//
 | 
			
		||||
// In the following example all tests in the test case FlagDependentTest
 | 
			
		||||
// will be instantiated twice with parameters false and true.
 | 
			
		||||
//
 | 
			
		||||
// class FlagDependentTest : public testing::TestWithParam<bool> {
 | 
			
		||||
//   virtual void SetUp() {
 | 
			
		||||
//     external_flag = GetParam();
 | 
			
		||||
//   }
 | 
			
		||||
// }
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
 | 
			
		||||
//
 | 
			
		||||
inline internal::ParamGenerator<bool> Bool() {
 | 
			
		||||
  return Values(false, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_COMBINE
 | 
			
		||||
// Combine() allows the user to combine two or more sequences to produce
 | 
			
		||||
// values of a Cartesian product of those sequences' elements.
 | 
			
		||||
//
 | 
			
		||||
// Synopsis:
 | 
			
		||||
// Combine(gen1, gen2, ..., genN)
 | 
			
		||||
//   - returns a generator producing sequences with elements coming from
 | 
			
		||||
//     the Cartesian product of elements from the sequences generated by
 | 
			
		||||
//     gen1, gen2, ..., genN. The sequence elements will have a type of
 | 
			
		||||
//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
 | 
			
		||||
//     of elements from sequences produces by gen1, gen2, ..., genN.
 | 
			
		||||
//
 | 
			
		||||
// Combine can have up to $maxtuple arguments. This number is currently limited
 | 
			
		||||
// by the maximum number of elements in the tuple implementation used by Google
 | 
			
		||||
// Test.
 | 
			
		||||
//
 | 
			
		||||
// Example:
 | 
			
		||||
//
 | 
			
		||||
// This will instantiate tests in test case AnimalTest each one with
 | 
			
		||||
// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
 | 
			
		||||
// tuple("dog", BLACK), and tuple("dog", WHITE):
 | 
			
		||||
//
 | 
			
		||||
// enum Color { BLACK, GRAY, WHITE };
 | 
			
		||||
// class AnimalTest
 | 
			
		||||
//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
 | 
			
		||||
//
 | 
			
		||||
// TEST_P(AnimalTest, AnimalLooksNice) {...}
 | 
			
		||||
//
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
 | 
			
		||||
//                         Combine(Values("cat", "dog"),
 | 
			
		||||
//                                 Values(BLACK, WHITE)));
 | 
			
		||||
//
 | 
			
		||||
// This will instantiate tests in FlagDependentTest with all variations of two
 | 
			
		||||
// Boolean flags:
 | 
			
		||||
//
 | 
			
		||||
// class FlagDependentTest
 | 
			
		||||
//     : public testing::TestWithParam<tuple<bool, bool> > {
 | 
			
		||||
//   virtual void SetUp() {
 | 
			
		||||
//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
 | 
			
		||||
//     tie(external_flag_1, external_flag_2) = GetParam();
 | 
			
		||||
//   }
 | 
			
		||||
// };
 | 
			
		||||
//
 | 
			
		||||
// TEST_P(FlagDependentTest, TestFeature1) {
 | 
			
		||||
//   // Test your code using external_flag_1 and external_flag_2 here.
 | 
			
		||||
// }
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
 | 
			
		||||
//                         Combine(Bool(), Bool()));
 | 
			
		||||
//
 | 
			
		||||
$range i 2..maxtuple
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
 | 
			
		||||
template <$for j, [[typename Generator$j]]>
 | 
			
		||||
internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(
 | 
			
		||||
    $for j, [[const Generator$j& g$j]]) {
 | 
			
		||||
  return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(
 | 
			
		||||
      $for j, [[g$j]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
# endif  // GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# define TEST_P(test_case_name, test_name) \
 | 
			
		||||
  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
 | 
			
		||||
      : public test_case_name { \
 | 
			
		||||
   public: \
 | 
			
		||||
    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
 | 
			
		||||
    virtual void TestBody(); \
 | 
			
		||||
   private: \
 | 
			
		||||
    static int AddToRegistry() { \
 | 
			
		||||
      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
 | 
			
		||||
          GetTestCasePatternHolder<test_case_name>(\
 | 
			
		||||
              #test_case_name, \
 | 
			
		||||
              ::testing::internal::CodeLocation(\
 | 
			
		||||
                  __FILE__, __LINE__))->AddTestPattern(\
 | 
			
		||||
                      #test_case_name, \
 | 
			
		||||
                      #test_name, \
 | 
			
		||||
                      new ::testing::internal::TestMetaFactory< \
 | 
			
		||||
                          GTEST_TEST_CLASS_NAME_(\
 | 
			
		||||
                              test_case_name, test_name)>()); \
 | 
			
		||||
      return 0; \
 | 
			
		||||
    } \
 | 
			
		||||
    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
 | 
			
		||||
    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
 | 
			
		||||
        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
 | 
			
		||||
  }; \
 | 
			
		||||
  int GTEST_TEST_CLASS_NAME_(test_case_name, \
 | 
			
		||||
                             test_name)::gtest_registering_dummy_ = \
 | 
			
		||||
      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
 | 
			
		||||
  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
 | 
			
		||||
 | 
			
		||||
// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user
 | 
			
		||||
// to specify a function or functor that generates custom test name suffixes
 | 
			
		||||
// based on the test parameters. The function should accept one argument of
 | 
			
		||||
// type testing::TestParamInfo<class ParamType>, and return std::string.
 | 
			
		||||
//
 | 
			
		||||
// testing::PrintToStringParamName is a builtin test suffix generator that
 | 
			
		||||
// returns the value of testing::PrintToString(GetParam()).
 | 
			
		||||
//
 | 
			
		||||
// Note: test names must be non-empty, unique, and may only contain ASCII
 | 
			
		||||
// alphanumeric characters or underscore. Because PrintToString adds quotes
 | 
			
		||||
// to std::string and C strings, it won't work for these types.
 | 
			
		||||
 | 
			
		||||
# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \
 | 
			
		||||
  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
 | 
			
		||||
      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
 | 
			
		||||
  ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \
 | 
			
		||||
      const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \
 | 
			
		||||
    return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \
 | 
			
		||||
        (__VA_ARGS__)(info); \
 | 
			
		||||
  } \
 | 
			
		||||
  int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \
 | 
			
		||||
      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
 | 
			
		||||
          GetTestCasePatternHolder<test_case_name>(\
 | 
			
		||||
              #test_case_name, \
 | 
			
		||||
              ::testing::internal::CodeLocation(\
 | 
			
		||||
                  __FILE__, __LINE__))->AddTestCaseInstantiation(\
 | 
			
		||||
                      #prefix, \
 | 
			
		||||
                      >est_##prefix##test_case_name##_EvalGenerator_, \
 | 
			
		||||
                      >est_##prefix##test_case_name##_EvalGenerateName_, \
 | 
			
		||||
                      __FILE__, __LINE__)
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
 | 
			
		||||
							
								
								
									
										993
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-printers.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										993
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-printers.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,993 @@
 | 
			
		||||
// Copyright 2007, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
// Google Test - The Google C++ Testing Framework
 | 
			
		||||
//
 | 
			
		||||
// This file implements a universal value printer that can print a
 | 
			
		||||
// value of any type T:
 | 
			
		||||
//
 | 
			
		||||
//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
 | 
			
		||||
//
 | 
			
		||||
// A user can teach this function how to print a class type T by
 | 
			
		||||
// defining either operator<<() or PrintTo() in the namespace that
 | 
			
		||||
// defines T.  More specifically, the FIRST defined function in the
 | 
			
		||||
// following list will be used (assuming T is defined in namespace
 | 
			
		||||
// foo):
 | 
			
		||||
//
 | 
			
		||||
//   1. foo::PrintTo(const T&, ostream*)
 | 
			
		||||
//   2. operator<<(ostream&, const T&) defined in either foo or the
 | 
			
		||||
//      global namespace.
 | 
			
		||||
//
 | 
			
		||||
// If none of the above is defined, it will print the debug string of
 | 
			
		||||
// the value if it is a protocol buffer, or print the raw bytes in the
 | 
			
		||||
// value otherwise.
 | 
			
		||||
//
 | 
			
		||||
// To aid debugging: when T is a reference type, the address of the
 | 
			
		||||
// value is also printed; when T is a (const) char pointer, both the
 | 
			
		||||
// pointer value and the NUL-terminated string it points to are
 | 
			
		||||
// printed.
 | 
			
		||||
//
 | 
			
		||||
// We also provide some convenient wrappers:
 | 
			
		||||
//
 | 
			
		||||
//   // Prints a value to a string.  For a (const or not) char
 | 
			
		||||
//   // pointer, the NUL-terminated string (but not the pointer) is
 | 
			
		||||
//   // printed.
 | 
			
		||||
//   std::string ::testing::PrintToString(const T& value);
 | 
			
		||||
//
 | 
			
		||||
//   // Prints a value tersely: for a reference type, the referenced
 | 
			
		||||
//   // value (but not the address) is printed; for a (const or not) char
 | 
			
		||||
//   // pointer, the NUL-terminated string (but not the pointer) is
 | 
			
		||||
//   // printed.
 | 
			
		||||
//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
 | 
			
		||||
//
 | 
			
		||||
//   // Prints value using the type inferred by the compiler.  The difference
 | 
			
		||||
//   // from UniversalTersePrint() is that this function prints both the
 | 
			
		||||
//   // pointer and the NUL-terminated string for a (const or not) char pointer.
 | 
			
		||||
//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
 | 
			
		||||
//
 | 
			
		||||
//   // Prints the fields of a tuple tersely to a string vector, one
 | 
			
		||||
//   // element for each field. Tuple support must be enabled in
 | 
			
		||||
//   // gtest-port.h.
 | 
			
		||||
//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
 | 
			
		||||
//       const Tuple& value);
 | 
			
		||||
//
 | 
			
		||||
// Known limitation:
 | 
			
		||||
//
 | 
			
		||||
// The print primitives print the elements of an STL-style container
 | 
			
		||||
// using the compiler-inferred type of *iter where iter is a
 | 
			
		||||
// const_iterator of the container.  When const_iterator is an input
 | 
			
		||||
// iterator but not a forward iterator, this inferred type may not
 | 
			
		||||
// match value_type, and the print output may be incorrect.  In
 | 
			
		||||
// practice, this is rarely a problem as for most containers
 | 
			
		||||
// const_iterator is a forward iterator.  We'll fix this if there's an
 | 
			
		||||
// actual need for it.  Note that this fix cannot rely on value_type
 | 
			
		||||
// being defined as many user-defined container types don't have
 | 
			
		||||
// value_type.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
 | 
			
		||||
 | 
			
		||||
#include <ostream>  // NOLINT
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
#include "gtest/internal/gtest-internal.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_TUPLE_
 | 
			
		||||
# include <tuple>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// Definitions in the 'internal' and 'internal2' name spaces are
 | 
			
		||||
// subject to change without notice.  DO NOT USE THEM IN USER CODE!
 | 
			
		||||
namespace internal2 {
 | 
			
		||||
 | 
			
		||||
// Prints the given number of bytes in the given object to the given
 | 
			
		||||
// ostream.
 | 
			
		||||
GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
 | 
			
		||||
                                     size_t count,
 | 
			
		||||
                                     ::std::ostream* os);
 | 
			
		||||
 | 
			
		||||
// For selecting which printer to use when a given type has neither <<
 | 
			
		||||
// nor PrintTo().
 | 
			
		||||
enum TypeKind {
 | 
			
		||||
  kProtobuf,              // a protobuf type
 | 
			
		||||
  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
 | 
			
		||||
                          // (e.g. a named or unnamed enum type)
 | 
			
		||||
  kOtherType              // anything else
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
 | 
			
		||||
// by the universal printer to print a value of type T when neither
 | 
			
		||||
// operator<< nor PrintTo() is defined for T, where kTypeKind is the
 | 
			
		||||
// "kind" of T as defined by enum TypeKind.
 | 
			
		||||
template <typename T, TypeKind kTypeKind>
 | 
			
		||||
class TypeWithoutFormatter {
 | 
			
		||||
 public:
 | 
			
		||||
  // This default version is called when kTypeKind is kOtherType.
 | 
			
		||||
  static void PrintValue(const T& value, ::std::ostream* os) {
 | 
			
		||||
    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
 | 
			
		||||
                         sizeof(value), os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// We print a protobuf using its ShortDebugString() when the string
 | 
			
		||||
// doesn't exceed this many characters; otherwise we print it using
 | 
			
		||||
// DebugString() for better readability.
 | 
			
		||||
const size_t kProtobufOneLinerMaxLength = 50;
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypeWithoutFormatter<T, kProtobuf> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void PrintValue(const T& value, ::std::ostream* os) {
 | 
			
		||||
    const ::testing::internal::string short_str = value.ShortDebugString();
 | 
			
		||||
    const ::testing::internal::string pretty_str =
 | 
			
		||||
        short_str.length() <= kProtobufOneLinerMaxLength ?
 | 
			
		||||
        short_str : ("\n" + value.DebugString());
 | 
			
		||||
    *os << ("<" + pretty_str + ">");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class TypeWithoutFormatter<T, kConvertibleToInteger> {
 | 
			
		||||
 public:
 | 
			
		||||
  // Since T has no << operator or PrintTo() but can be implicitly
 | 
			
		||||
  // converted to BiggestInt, we print it as a BiggestInt.
 | 
			
		||||
  //
 | 
			
		||||
  // Most likely T is an enum type (either named or unnamed), in which
 | 
			
		||||
  // case printing it as an integer is the desired behavior.  In case
 | 
			
		||||
  // T is not an enum, printing it as an integer is the best we can do
 | 
			
		||||
  // given that it has no user-defined printer.
 | 
			
		||||
  static void PrintValue(const T& value, ::std::ostream* os) {
 | 
			
		||||
    const internal::BiggestInt kBigInt = value;
 | 
			
		||||
    *os << kBigInt;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Prints the given value to the given ostream.  If the value is a
 | 
			
		||||
// protocol message, its debug string is printed; if it's an enum or
 | 
			
		||||
// of a type implicitly convertible to BiggestInt, it's printed as an
 | 
			
		||||
// integer; otherwise the bytes in the value are printed.  This is
 | 
			
		||||
// what UniversalPrinter<T>::Print() does when it knows nothing about
 | 
			
		||||
// type T and T has neither << operator nor PrintTo().
 | 
			
		||||
//
 | 
			
		||||
// A user can override this behavior for a class type Foo by defining
 | 
			
		||||
// a << operator in the namespace where Foo is defined.
 | 
			
		||||
//
 | 
			
		||||
// We put this operator in namespace 'internal2' instead of 'internal'
 | 
			
		||||
// to simplify the implementation, as much code in 'internal' needs to
 | 
			
		||||
// use << in STL, which would conflict with our own << were it defined
 | 
			
		||||
// in 'internal'.
 | 
			
		||||
//
 | 
			
		||||
// Note that this operator<< takes a generic std::basic_ostream<Char,
 | 
			
		||||
// CharTraits> type instead of the more restricted std::ostream.  If
 | 
			
		||||
// we define it to take an std::ostream instead, we'll get an
 | 
			
		||||
// "ambiguous overloads" compiler error when trying to print a type
 | 
			
		||||
// Foo that supports streaming to std::basic_ostream<Char,
 | 
			
		||||
// CharTraits>, as the compiler cannot tell whether
 | 
			
		||||
// operator<<(std::ostream&, const T&) or
 | 
			
		||||
// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
 | 
			
		||||
// specific.
 | 
			
		||||
template <typename Char, typename CharTraits, typename T>
 | 
			
		||||
::std::basic_ostream<Char, CharTraits>& operator<<(
 | 
			
		||||
    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
 | 
			
		||||
  TypeWithoutFormatter<T,
 | 
			
		||||
      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
 | 
			
		||||
       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
 | 
			
		||||
       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
 | 
			
		||||
  return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace internal2
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
 | 
			
		||||
// magic needed for implementing UniversalPrinter won't work.
 | 
			
		||||
namespace testing_internal {
 | 
			
		||||
 | 
			
		||||
// Used to print a value that is not an STL-style container when the
 | 
			
		||||
// user doesn't define PrintTo() for it.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
 | 
			
		||||
  // With the following statement, during unqualified name lookup,
 | 
			
		||||
  // testing::internal2::operator<< appears as if it was declared in
 | 
			
		||||
  // the nearest enclosing namespace that contains both
 | 
			
		||||
  // ::testing_internal and ::testing::internal2, i.e. the global
 | 
			
		||||
  // namespace.  For more details, refer to the C++ Standard section
 | 
			
		||||
  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
 | 
			
		||||
  // testing::internal2::operator<< in case T doesn't come with a <<
 | 
			
		||||
  // operator.
 | 
			
		||||
  //
 | 
			
		||||
  // We cannot write 'using ::testing::internal2::operator<<;', which
 | 
			
		||||
  // gcc 3.3 fails to compile due to a compiler bug.
 | 
			
		||||
  using namespace ::testing::internal2;  // NOLINT
 | 
			
		||||
 | 
			
		||||
  // Assuming T is defined in namespace foo, in the next statement,
 | 
			
		||||
  // the compiler will consider all of:
 | 
			
		||||
  //
 | 
			
		||||
  //   1. foo::operator<< (thanks to Koenig look-up),
 | 
			
		||||
  //   2. ::operator<< (as the current namespace is enclosed in ::),
 | 
			
		||||
  //   3. testing::internal2::operator<< (thanks to the using statement above).
 | 
			
		||||
  //
 | 
			
		||||
  // The operator<< whose type matches T best will be picked.
 | 
			
		||||
  //
 | 
			
		||||
  // We deliberately allow #2 to be a candidate, as sometimes it's
 | 
			
		||||
  // impossible to define #1 (e.g. when foo is ::std, defining
 | 
			
		||||
  // anything in it is undefined behavior unless you are a compiler
 | 
			
		||||
  // vendor.).
 | 
			
		||||
  *os << value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace testing_internal
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
 | 
			
		||||
// value of type ToPrint that is an operand of a comparison assertion
 | 
			
		||||
// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
 | 
			
		||||
// the comparison, and is used to help determine the best way to
 | 
			
		||||
// format the value.  In particular, when the value is a C string
 | 
			
		||||
// (char pointer) and the other operand is an STL string object, we
 | 
			
		||||
// want to format the C string as a string, since we know it is
 | 
			
		||||
// compared by value with the string object.  If the value is a char
 | 
			
		||||
// pointer but the other operand is not an STL string object, we don't
 | 
			
		||||
// know whether the pointer is supposed to point to a NUL-terminated
 | 
			
		||||
// string, and thus want to print it as a pointer to be safe.
 | 
			
		||||
//
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | 
			
		||||
 | 
			
		||||
// The default case.
 | 
			
		||||
template <typename ToPrint, typename OtherOperand>
 | 
			
		||||
class FormatForComparison {
 | 
			
		||||
 public:
 | 
			
		||||
  static ::std::string Format(const ToPrint& value) {
 | 
			
		||||
    return ::testing::PrintToString(value);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Array.
 | 
			
		||||
template <typename ToPrint, size_t N, typename OtherOperand>
 | 
			
		||||
class FormatForComparison<ToPrint[N], OtherOperand> {
 | 
			
		||||
 public:
 | 
			
		||||
  static ::std::string Format(const ToPrint* value) {
 | 
			
		||||
    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// By default, print C string as pointers to be safe, as we don't know
 | 
			
		||||
// whether they actually point to a NUL-terminated string.
 | 
			
		||||
 | 
			
		||||
#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
 | 
			
		||||
  template <typename OtherOperand>                                      \
 | 
			
		||||
  class FormatForComparison<CharType*, OtherOperand> {                  \
 | 
			
		||||
   public:                                                              \
 | 
			
		||||
    static ::std::string Format(CharType* value) {                      \
 | 
			
		||||
      return ::testing::PrintToString(static_cast<const void*>(value)); \
 | 
			
		||||
    }                                                                   \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
 | 
			
		||||
 | 
			
		||||
#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
 | 
			
		||||
 | 
			
		||||
// If a C string is compared with an STL string object, we know it's meant
 | 
			
		||||
// to point to a NUL-terminated string, and thus can print it as a string.
 | 
			
		||||
 | 
			
		||||
#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
 | 
			
		||||
  template <>                                                           \
 | 
			
		||||
  class FormatForComparison<CharType*, OtherStringType> {               \
 | 
			
		||||
   public:                                                              \
 | 
			
		||||
    static ::std::string Format(CharType* value) {                      \
 | 
			
		||||
      return ::testing::PrintToString(value);                           \
 | 
			
		||||
    }                                                                   \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_GLOBAL_STRING
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_GLOBAL_WSTRING
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_WSTRING
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
 | 
			
		||||
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
 | 
			
		||||
 | 
			
		||||
// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
 | 
			
		||||
// operand to be used in a failure message.  The type (but not value)
 | 
			
		||||
// of the other operand may affect the format.  This allows us to
 | 
			
		||||
// print a char* as a raw pointer when it is compared against another
 | 
			
		||||
// char* or void*, and print it as a C string when it is compared
 | 
			
		||||
// against an std::string object, for example.
 | 
			
		||||
//
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | 
			
		||||
template <typename T1, typename T2>
 | 
			
		||||
std::string FormatForComparisonFailureMessage(
 | 
			
		||||
    const T1& value, const T2& /* other_operand */) {
 | 
			
		||||
  return FormatForComparison<T1, T2>::Format(value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
 | 
			
		||||
// value to the given ostream.  The caller must ensure that
 | 
			
		||||
// 'ostream_ptr' is not NULL, or the behavior is undefined.
 | 
			
		||||
//
 | 
			
		||||
// We define UniversalPrinter as a class template (as opposed to a
 | 
			
		||||
// function template), as we need to partially specialize it for
 | 
			
		||||
// reference types, which cannot be done with function templates.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class UniversalPrinter;
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void UniversalPrint(const T& value, ::std::ostream* os);
 | 
			
		||||
 | 
			
		||||
// Used to print an STL-style container when the user doesn't define
 | 
			
		||||
// a PrintTo() for it.
 | 
			
		||||
template <typename C>
 | 
			
		||||
void DefaultPrintTo(IsContainer /* dummy */,
 | 
			
		||||
                    false_type /* is not a pointer */,
 | 
			
		||||
                    const C& container, ::std::ostream* os) {
 | 
			
		||||
  const size_t kMaxCount = 32;  // The maximum number of elements to print.
 | 
			
		||||
  *os << '{';
 | 
			
		||||
  size_t count = 0;
 | 
			
		||||
  for (typename C::const_iterator it = container.begin();
 | 
			
		||||
       it != container.end(); ++it, ++count) {
 | 
			
		||||
    if (count > 0) {
 | 
			
		||||
      *os << ',';
 | 
			
		||||
      if (count == kMaxCount) {  // Enough has been printed.
 | 
			
		||||
        *os << " ...";
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    *os << ' ';
 | 
			
		||||
    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
 | 
			
		||||
    // handle *it being a native array.
 | 
			
		||||
    internal::UniversalPrint(*it, os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (count > 0) {
 | 
			
		||||
    *os << ' ';
 | 
			
		||||
  }
 | 
			
		||||
  *os << '}';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Used to print a pointer that is neither a char pointer nor a member
 | 
			
		||||
// pointer, when the user doesn't define PrintTo() for it.  (A member
 | 
			
		||||
// variable pointer or member function pointer doesn't really point to
 | 
			
		||||
// a location in the address space.  Their representation is
 | 
			
		||||
// implementation-defined.  Therefore they will be printed as raw
 | 
			
		||||
// bytes.)
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DefaultPrintTo(IsNotContainer /* dummy */,
 | 
			
		||||
                    true_type /* is a pointer */,
 | 
			
		||||
                    T* p, ::std::ostream* os) {
 | 
			
		||||
  if (p == NULL) {
 | 
			
		||||
    *os << "NULL";
 | 
			
		||||
  } else {
 | 
			
		||||
    // C++ doesn't allow casting from a function pointer to any object
 | 
			
		||||
    // pointer.
 | 
			
		||||
    //
 | 
			
		||||
    // IsTrue() silences warnings: "Condition is always true",
 | 
			
		||||
    // "unreachable code".
 | 
			
		||||
    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
 | 
			
		||||
      // T is not a function type.  We just call << to print p,
 | 
			
		||||
      // relying on ADL to pick up user-defined << for their pointer
 | 
			
		||||
      // types, if any.
 | 
			
		||||
      *os << p;
 | 
			
		||||
    } else {
 | 
			
		||||
      // T is a function type, so '*os << p' doesn't do what we want
 | 
			
		||||
      // (it just prints p as bool).  We want to print p as a const
 | 
			
		||||
      // void*.  However, we cannot cast it to const void* directly,
 | 
			
		||||
      // even using reinterpret_cast, as earlier versions of gcc
 | 
			
		||||
      // (e.g. 3.4.5) cannot compile the cast when p is a function
 | 
			
		||||
      // pointer.  Casting to UInt64 first solves the problem.
 | 
			
		||||
      *os << reinterpret_cast<const void*>(
 | 
			
		||||
          reinterpret_cast<internal::UInt64>(p));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Used to print a non-container, non-pointer value when the user
 | 
			
		||||
// doesn't define PrintTo() for it.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void DefaultPrintTo(IsNotContainer /* dummy */,
 | 
			
		||||
                    false_type /* is not a pointer */,
 | 
			
		||||
                    const T& value, ::std::ostream* os) {
 | 
			
		||||
  ::testing_internal::DefaultPrintNonContainerTo(value, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints the given value using the << operator if it has one;
 | 
			
		||||
// otherwise prints the bytes in it.  This is what
 | 
			
		||||
// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
 | 
			
		||||
// or overloaded for type T.
 | 
			
		||||
//
 | 
			
		||||
// A user can override this behavior for a class type Foo by defining
 | 
			
		||||
// an overload of PrintTo() in the namespace where Foo is defined.  We
 | 
			
		||||
// give the user this option as sometimes defining a << operator for
 | 
			
		||||
// Foo is not desirable (e.g. the coding style may prevent doing it,
 | 
			
		||||
// or there is already a << operator but it doesn't do what the user
 | 
			
		||||
// wants).
 | 
			
		||||
template <typename T>
 | 
			
		||||
void PrintTo(const T& value, ::std::ostream* os) {
 | 
			
		||||
  // DefaultPrintTo() is overloaded.  The type of its first two
 | 
			
		||||
  // arguments determine which version will be picked.  If T is an
 | 
			
		||||
  // STL-style container, the version for container will be called; if
 | 
			
		||||
  // T is a pointer, the pointer version will be called; otherwise the
 | 
			
		||||
  // generic version will be called.
 | 
			
		||||
  //
 | 
			
		||||
  // Note that we check for container types here, prior to we check
 | 
			
		||||
  // for protocol message types in our operator<<.  The rationale is:
 | 
			
		||||
  //
 | 
			
		||||
  // For protocol messages, we want to give people a chance to
 | 
			
		||||
  // override Google Mock's format by defining a PrintTo() or
 | 
			
		||||
  // operator<<.  For STL containers, other formats can be
 | 
			
		||||
  // incompatible with Google Mock's format for the container
 | 
			
		||||
  // elements; therefore we check for container types here to ensure
 | 
			
		||||
  // that our format is used.
 | 
			
		||||
  //
 | 
			
		||||
  // The second argument of DefaultPrintTo() is needed to bypass a bug
 | 
			
		||||
  // in Symbian's C++ compiler that prevents it from picking the right
 | 
			
		||||
  // overload between:
 | 
			
		||||
  //
 | 
			
		||||
  //   PrintTo(const T& x, ...);
 | 
			
		||||
  //   PrintTo(T* x, ...);
 | 
			
		||||
  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The following list of PrintTo() overloads tells
 | 
			
		||||
// UniversalPrinter<T>::Print() how to print standard types (built-in
 | 
			
		||||
// types, strings, plain arrays, and pointers).
 | 
			
		||||
 | 
			
		||||
// Overloads for various char types.
 | 
			
		||||
GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
 | 
			
		||||
GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(char c, ::std::ostream* os) {
 | 
			
		||||
  // When printing a plain char, we always treat it as unsigned.  This
 | 
			
		||||
  // way, the output won't be affected by whether the compiler thinks
 | 
			
		||||
  // char is signed or not.
 | 
			
		||||
  PrintTo(static_cast<unsigned char>(c), os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overloads for other simple built-in types.
 | 
			
		||||
inline void PrintTo(bool x, ::std::ostream* os) {
 | 
			
		||||
  *os << (x ? "true" : "false");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overload for wchar_t type.
 | 
			
		||||
// Prints a wchar_t as a symbol if it is printable or as its internal
 | 
			
		||||
// code otherwise and also as its decimal code (except for L'\0').
 | 
			
		||||
// The L'\0' char is printed as "L'\\0'". The decimal code is printed
 | 
			
		||||
// as signed integer when wchar_t is implemented by the compiler
 | 
			
		||||
// as a signed type and is printed as an unsigned integer when wchar_t
 | 
			
		||||
// is implemented as an unsigned type.
 | 
			
		||||
GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
 | 
			
		||||
 | 
			
		||||
// Overloads for C strings.
 | 
			
		||||
GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(char* s, ::std::ostream* os) {
 | 
			
		||||
  PrintTo(ImplicitCast_<const char*>(s), os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// signed/unsigned char is often used for representing binary data, so
 | 
			
		||||
// we print pointers to it as void* to be safe.
 | 
			
		||||
inline void PrintTo(const signed char* s, ::std::ostream* os) {
 | 
			
		||||
  PrintTo(ImplicitCast_<const void*>(s), os);
 | 
			
		||||
}
 | 
			
		||||
inline void PrintTo(signed char* s, ::std::ostream* os) {
 | 
			
		||||
  PrintTo(ImplicitCast_<const void*>(s), os);
 | 
			
		||||
}
 | 
			
		||||
inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
 | 
			
		||||
  PrintTo(ImplicitCast_<const void*>(s), os);
 | 
			
		||||
}
 | 
			
		||||
inline void PrintTo(unsigned char* s, ::std::ostream* os) {
 | 
			
		||||
  PrintTo(ImplicitCast_<const void*>(s), os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MSVC can be configured to define wchar_t as a typedef of unsigned
 | 
			
		||||
// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
 | 
			
		||||
// type.  When wchar_t is a typedef, defining an overload for const
 | 
			
		||||
// wchar_t* would cause unsigned short* be printed as a wide string,
 | 
			
		||||
// possibly causing invalid memory accesses.
 | 
			
		||||
#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
 | 
			
		||||
// Overloads for wide C strings
 | 
			
		||||
GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(wchar_t* s, ::std::ostream* os) {
 | 
			
		||||
  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Overload for C arrays.  Multi-dimensional arrays are printed
 | 
			
		||||
// properly.
 | 
			
		||||
 | 
			
		||||
// Prints the given number of elements in an array, without printing
 | 
			
		||||
// the curly braces.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
 | 
			
		||||
  UniversalPrint(a[0], os);
 | 
			
		||||
  for (size_t i = 1; i != count; i++) {
 | 
			
		||||
    *os << ", ";
 | 
			
		||||
    UniversalPrint(a[i], os);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overloads for ::string and ::std::string.
 | 
			
		||||
#if GTEST_HAS_GLOBAL_STRING
 | 
			
		||||
GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(const ::string& s, ::std::ostream* os) {
 | 
			
		||||
  PrintStringTo(s, os);
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_HAS_GLOBAL_STRING
 | 
			
		||||
 | 
			
		||||
GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
 | 
			
		||||
  PrintStringTo(s, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overloads for ::wstring and ::std::wstring.
 | 
			
		||||
#if GTEST_HAS_GLOBAL_WSTRING
 | 
			
		||||
GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
 | 
			
		||||
  PrintWideStringTo(s, os);
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_HAS_GLOBAL_WSTRING
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_WSTRING
 | 
			
		||||
GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
 | 
			
		||||
inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
 | 
			
		||||
  PrintWideStringTo(s, os);
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_HAS_STD_WSTRING
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
 | 
			
		||||
// Helper function for printing a tuple.  T must be instantiated with
 | 
			
		||||
// a tuple type.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void PrintTupleTo(const T& t, ::std::ostream* os);
 | 
			
		||||
#endif  // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TR1_TUPLE
 | 
			
		||||
// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
 | 
			
		||||
// which are packed as tuples.
 | 
			
		||||
 | 
			
		||||
// Overloaded PrintTo() for tuples of various arities.  We support
 | 
			
		||||
// tuples of up-to 10 fields.  The following implementation works
 | 
			
		||||
// regardless of whether tr1::tuple is implemented using the
 | 
			
		||||
// non-standard variadic template feature or not.
 | 
			
		||||
 | 
			
		||||
inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
 | 
			
		||||
             ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
          typename T6>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
 | 
			
		||||
             ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
          typename T6, typename T7>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
 | 
			
		||||
             ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
          typename T6, typename T7, typename T8>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
 | 
			
		||||
             ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
          typename T6, typename T7, typename T8, typename T9>
 | 
			
		||||
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
 | 
			
		||||
             ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
          typename T6, typename T7, typename T8, typename T9, typename T10>
 | 
			
		||||
void PrintTo(
 | 
			
		||||
    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
 | 
			
		||||
    ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_HAS_TR1_TUPLE
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_TUPLE_
 | 
			
		||||
template <typename... Types>
 | 
			
		||||
void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {
 | 
			
		||||
  PrintTupleTo(t, os);
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_HAS_STD_TUPLE_
 | 
			
		||||
 | 
			
		||||
// Overload for std::pair.
 | 
			
		||||
template <typename T1, typename T2>
 | 
			
		||||
void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
 | 
			
		||||
  *os << '(';
 | 
			
		||||
  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
 | 
			
		||||
  // a reference type.  The same for printing value.second.
 | 
			
		||||
  UniversalPrinter<T1>::Print(value.first, os);
 | 
			
		||||
  *os << ", ";
 | 
			
		||||
  UniversalPrinter<T2>::Print(value.second, os);
 | 
			
		||||
  *os << ')';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements printing a non-reference type T by letting the compiler
 | 
			
		||||
// pick the right overload of PrintTo() for T.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class UniversalPrinter {
 | 
			
		||||
 public:
 | 
			
		||||
  // MSVC warns about adding const to a function type, so we want to
 | 
			
		||||
  // disable the warning.
 | 
			
		||||
  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
 | 
			
		||||
 | 
			
		||||
  // Note: we deliberately don't call this PrintTo(), as that name
 | 
			
		||||
  // conflicts with ::testing::internal::PrintTo in the body of the
 | 
			
		||||
  // function.
 | 
			
		||||
  static void Print(const T& value, ::std::ostream* os) {
 | 
			
		||||
    // By default, ::testing::internal::PrintTo() is used for printing
 | 
			
		||||
    // the value.
 | 
			
		||||
    //
 | 
			
		||||
    // Thanks to Koenig look-up, if T is a class and has its own
 | 
			
		||||
    // PrintTo() function defined in its namespace, that function will
 | 
			
		||||
    // be visible here.  Since it is more specific than the generic ones
 | 
			
		||||
    // in ::testing::internal, it will be picked by the compiler in the
 | 
			
		||||
    // following statement - exactly what we want.
 | 
			
		||||
    PrintTo(value, os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  GTEST_DISABLE_MSC_WARNINGS_POP_()
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// UniversalPrintArray(begin, len, os) prints an array of 'len'
 | 
			
		||||
// elements, starting at address 'begin'.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
 | 
			
		||||
  if (len == 0) {
 | 
			
		||||
    *os << "{}";
 | 
			
		||||
  } else {
 | 
			
		||||
    *os << "{ ";
 | 
			
		||||
    const size_t kThreshold = 18;
 | 
			
		||||
    const size_t kChunkSize = 8;
 | 
			
		||||
    // If the array has more than kThreshold elements, we'll have to
 | 
			
		||||
    // omit some details by printing only the first and the last
 | 
			
		||||
    // kChunkSize elements.
 | 
			
		||||
    // TODO(wan@google.com): let the user control the threshold using a flag.
 | 
			
		||||
    if (len <= kThreshold) {
 | 
			
		||||
      PrintRawArrayTo(begin, len, os);
 | 
			
		||||
    } else {
 | 
			
		||||
      PrintRawArrayTo(begin, kChunkSize, os);
 | 
			
		||||
      *os << ", ..., ";
 | 
			
		||||
      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
 | 
			
		||||
    }
 | 
			
		||||
    *os << " }";
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// This overload prints a (const) char array compactly.
 | 
			
		||||
GTEST_API_ void UniversalPrintArray(
 | 
			
		||||
    const char* begin, size_t len, ::std::ostream* os);
 | 
			
		||||
 | 
			
		||||
// This overload prints a (const) wchar_t array compactly.
 | 
			
		||||
GTEST_API_ void UniversalPrintArray(
 | 
			
		||||
    const wchar_t* begin, size_t len, ::std::ostream* os);
 | 
			
		||||
 | 
			
		||||
// Implements printing an array type T[N].
 | 
			
		||||
template <typename T, size_t N>
 | 
			
		||||
class UniversalPrinter<T[N]> {
 | 
			
		||||
 public:
 | 
			
		||||
  // Prints the given array, omitting some elements when there are too
 | 
			
		||||
  // many.
 | 
			
		||||
  static void Print(const T (&a)[N], ::std::ostream* os) {
 | 
			
		||||
    UniversalPrintArray(a, N, os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Implements printing a reference type T&.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class UniversalPrinter<T&> {
 | 
			
		||||
 public:
 | 
			
		||||
  // MSVC warns about adding const to a function type, so we want to
 | 
			
		||||
  // disable the warning.
 | 
			
		||||
  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180)
 | 
			
		||||
 | 
			
		||||
  static void Print(const T& value, ::std::ostream* os) {
 | 
			
		||||
    // Prints the address of the value.  We use reinterpret_cast here
 | 
			
		||||
    // as static_cast doesn't compile when T is a function type.
 | 
			
		||||
    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
 | 
			
		||||
 | 
			
		||||
    // Then prints the value itself.
 | 
			
		||||
    UniversalPrint(value, os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  GTEST_DISABLE_MSC_WARNINGS_POP_()
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Prints a value tersely: for a reference type, the referenced value
 | 
			
		||||
// (but not the address) is printed; for a (const) char pointer, the
 | 
			
		||||
// NUL-terminated string (but not the pointer) is printed.
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class UniversalTersePrinter {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(const T& value, ::std::ostream* os) {
 | 
			
		||||
    UniversalPrint(value, os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
template <typename T>
 | 
			
		||||
class UniversalTersePrinter<T&> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(const T& value, ::std::ostream* os) {
 | 
			
		||||
    UniversalPrint(value, os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
template <typename T, size_t N>
 | 
			
		||||
class UniversalTersePrinter<T[N]> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(const T (&value)[N], ::std::ostream* os) {
 | 
			
		||||
    UniversalPrinter<T[N]>::Print(value, os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
template <>
 | 
			
		||||
class UniversalTersePrinter<const char*> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(const char* str, ::std::ostream* os) {
 | 
			
		||||
    if (str == NULL) {
 | 
			
		||||
      *os << "NULL";
 | 
			
		||||
    } else {
 | 
			
		||||
      UniversalPrint(string(str), os);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
template <>
 | 
			
		||||
class UniversalTersePrinter<char*> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(char* str, ::std::ostream* os) {
 | 
			
		||||
    UniversalTersePrinter<const char*>::Print(str, os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_WSTRING
 | 
			
		||||
template <>
 | 
			
		||||
class UniversalTersePrinter<const wchar_t*> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(const wchar_t* str, ::std::ostream* os) {
 | 
			
		||||
    if (str == NULL) {
 | 
			
		||||
      *os << "NULL";
 | 
			
		||||
    } else {
 | 
			
		||||
      UniversalPrint(::std::wstring(str), os);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
class UniversalTersePrinter<wchar_t*> {
 | 
			
		||||
 public:
 | 
			
		||||
  static void Print(wchar_t* str, ::std::ostream* os) {
 | 
			
		||||
    UniversalTersePrinter<const wchar_t*>::Print(str, os);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
void UniversalTersePrint(const T& value, ::std::ostream* os) {
 | 
			
		||||
  UniversalTersePrinter<T>::Print(value, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints a value using the type inferred by the compiler.  The
 | 
			
		||||
// difference between this and UniversalTersePrint() is that for a
 | 
			
		||||
// (const) char pointer, this prints both the pointer and the
 | 
			
		||||
// NUL-terminated string.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void UniversalPrint(const T& value, ::std::ostream* os) {
 | 
			
		||||
  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
 | 
			
		||||
  // UniversalPrinter with T directly.
 | 
			
		||||
  typedef T T1;
 | 
			
		||||
  UniversalPrinter<T1>::Print(value, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef ::std::vector<string> Strings;
 | 
			
		||||
 | 
			
		||||
// TuplePolicy<TupleT> must provide:
 | 
			
		||||
// - tuple_size
 | 
			
		||||
//     size of tuple TupleT.
 | 
			
		||||
// - get<size_t I>(const TupleT& t)
 | 
			
		||||
//     static function extracting element I of tuple TupleT.
 | 
			
		||||
// - tuple_element<size_t I>::type
 | 
			
		||||
//     type of element I of tuple TupleT.
 | 
			
		||||
template <typename TupleT>
 | 
			
		||||
struct TuplePolicy;
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TR1_TUPLE
 | 
			
		||||
template <typename TupleT>
 | 
			
		||||
struct TuplePolicy {
 | 
			
		||||
  typedef TupleT Tuple;
 | 
			
		||||
  static const size_t tuple_size = ::std::tr1::tuple_size<Tuple>::value;
 | 
			
		||||
 | 
			
		||||
  template <size_t I>
 | 
			
		||||
  struct tuple_element : ::std::tr1::tuple_element<I, Tuple> {};
 | 
			
		||||
 | 
			
		||||
  template <size_t I>
 | 
			
		||||
  static typename AddReference<
 | 
			
		||||
      const typename ::std::tr1::tuple_element<I, Tuple>::type>::type get(
 | 
			
		||||
      const Tuple& tuple) {
 | 
			
		||||
    return ::std::tr1::get<I>(tuple);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
template <typename TupleT>
 | 
			
		||||
const size_t TuplePolicy<TupleT>::tuple_size;
 | 
			
		||||
#endif  // GTEST_HAS_TR1_TUPLE
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_STD_TUPLE_
 | 
			
		||||
template <typename... Types>
 | 
			
		||||
struct TuplePolicy< ::std::tuple<Types...> > {
 | 
			
		||||
  typedef ::std::tuple<Types...> Tuple;
 | 
			
		||||
  static const size_t tuple_size = ::std::tuple_size<Tuple>::value;
 | 
			
		||||
 | 
			
		||||
  template <size_t I>
 | 
			
		||||
  struct tuple_element : ::std::tuple_element<I, Tuple> {};
 | 
			
		||||
 | 
			
		||||
  template <size_t I>
 | 
			
		||||
  static const typename ::std::tuple_element<I, Tuple>::type& get(
 | 
			
		||||
      const Tuple& tuple) {
 | 
			
		||||
    return ::std::get<I>(tuple);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
template <typename... Types>
 | 
			
		||||
const size_t TuplePolicy< ::std::tuple<Types...> >::tuple_size;
 | 
			
		||||
#endif  // GTEST_HAS_STD_TUPLE_
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
 | 
			
		||||
// This helper template allows PrintTo() for tuples and
 | 
			
		||||
// UniversalTersePrintTupleFieldsToStrings() to be defined by
 | 
			
		||||
// induction on the number of tuple fields.  The idea is that
 | 
			
		||||
// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
 | 
			
		||||
// fields in tuple t, and can be defined in terms of
 | 
			
		||||
// TuplePrefixPrinter<N - 1>.
 | 
			
		||||
//
 | 
			
		||||
// The inductive case.
 | 
			
		||||
template <size_t N>
 | 
			
		||||
struct TuplePrefixPrinter {
 | 
			
		||||
  // Prints the first N fields of a tuple.
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
 | 
			
		||||
    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
 | 
			
		||||
    GTEST_INTENTIONAL_CONST_COND_PUSH_()
 | 
			
		||||
    if (N > 1) {
 | 
			
		||||
    GTEST_INTENTIONAL_CONST_COND_POP_()
 | 
			
		||||
      *os << ", ";
 | 
			
		||||
    }
 | 
			
		||||
    UniversalPrinter<
 | 
			
		||||
        typename TuplePolicy<Tuple>::template tuple_element<N - 1>::type>
 | 
			
		||||
        ::Print(TuplePolicy<Tuple>::template get<N - 1>(t), os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Tersely prints the first N fields of a tuple to a string vector,
 | 
			
		||||
  // one element for each field.
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
 | 
			
		||||
    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
 | 
			
		||||
    ::std::stringstream ss;
 | 
			
		||||
    UniversalTersePrint(TuplePolicy<Tuple>::template get<N - 1>(t), &ss);
 | 
			
		||||
    strings->push_back(ss.str());
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Base case.
 | 
			
		||||
template <>
 | 
			
		||||
struct TuplePrefixPrinter<0> {
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
 | 
			
		||||
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Helper function for printing a tuple.
 | 
			
		||||
// Tuple must be either std::tr1::tuple or std::tuple type.
 | 
			
		||||
template <typename Tuple>
 | 
			
		||||
void PrintTupleTo(const Tuple& t, ::std::ostream* os) {
 | 
			
		||||
  *os << "(";
 | 
			
		||||
  TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::PrintPrefixTo(t, os);
 | 
			
		||||
  *os << ")";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints the fields of a tuple tersely to a string vector, one
 | 
			
		||||
// element for each field.  See the comment before
 | 
			
		||||
// UniversalTersePrint() for how we define "tersely".
 | 
			
		||||
template <typename Tuple>
 | 
			
		||||
Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
 | 
			
		||||
  Strings result;
 | 
			
		||||
  TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::
 | 
			
		||||
      TersePrintPrefixToStrings(value, &result);
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
#endif  // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
::std::string PrintToString(const T& value) {
 | 
			
		||||
  ::std::stringstream ss;
 | 
			
		||||
  internal::UniversalTersePrinter<T>::Print(value, &ss);
 | 
			
		||||
  return ss.str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
// Include any custom printer added by the local installation.
 | 
			
		||||
// We must include this header at the end to make sure it can use the
 | 
			
		||||
// declarations from this file.
 | 
			
		||||
#include "gtest/internal/custom/gtest-printers.h"
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
 | 
			
		||||
							
								
								
									
										232
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-spi.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-spi.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,232 @@
 | 
			
		||||
// Copyright 2007, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
//
 | 
			
		||||
// Utilities for testing Google Test itself and code that uses Google Test
 | 
			
		||||
// (e.g. frameworks built on top of Google Test).
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// This helper class can be used to mock out Google Test failure reporting
 | 
			
		||||
// so that we can test Google Test or code that builds on Google Test.
 | 
			
		||||
//
 | 
			
		||||
// An object of this class appends a TestPartResult object to the
 | 
			
		||||
// TestPartResultArray object given in the constructor whenever a Google Test
 | 
			
		||||
// failure is reported. It can either intercept only failures that are
 | 
			
		||||
// generated in the same thread that created this object or it can intercept
 | 
			
		||||
// all generated failures. The scope of this mock object can be controlled with
 | 
			
		||||
// the second argument to the two arguments constructor.
 | 
			
		||||
class GTEST_API_ ScopedFakeTestPartResultReporter
 | 
			
		||||
    : public TestPartResultReporterInterface {
 | 
			
		||||
 public:
 | 
			
		||||
  // The two possible mocking modes of this object.
 | 
			
		||||
  enum InterceptMode {
 | 
			
		||||
    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
 | 
			
		||||
    INTERCEPT_ALL_THREADS           // Intercepts all failures.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // The c'tor sets this object as the test part result reporter used
 | 
			
		||||
  // by Google Test.  The 'result' parameter specifies where to report the
 | 
			
		||||
  // results. This reporter will only catch failures generated in the current
 | 
			
		||||
  // thread. DEPRECATED
 | 
			
		||||
  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
 | 
			
		||||
 | 
			
		||||
  // Same as above, but you can choose the interception scope of this object.
 | 
			
		||||
  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
 | 
			
		||||
                                   TestPartResultArray* result);
 | 
			
		||||
 | 
			
		||||
  // The d'tor restores the previous test part result reporter.
 | 
			
		||||
  virtual ~ScopedFakeTestPartResultReporter();
 | 
			
		||||
 | 
			
		||||
  // Appends the TestPartResult object to the TestPartResultArray
 | 
			
		||||
  // received in the constructor.
 | 
			
		||||
  //
 | 
			
		||||
  // This method is from the TestPartResultReporterInterface
 | 
			
		||||
  // interface.
 | 
			
		||||
  virtual void ReportTestPartResult(const TestPartResult& result);
 | 
			
		||||
 private:
 | 
			
		||||
  void Init();
 | 
			
		||||
 | 
			
		||||
  const InterceptMode intercept_mode_;
 | 
			
		||||
  TestPartResultReporterInterface* old_reporter_;
 | 
			
		||||
  TestPartResultArray* const result_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// A helper class for implementing EXPECT_FATAL_FAILURE() and
 | 
			
		||||
// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
 | 
			
		||||
// TestPartResultArray contains exactly one failure that has the given
 | 
			
		||||
// type and contains the given substring.  If that's not the case, a
 | 
			
		||||
// non-fatal failure will be generated.
 | 
			
		||||
class GTEST_API_ SingleFailureChecker {
 | 
			
		||||
 public:
 | 
			
		||||
  // The constructor remembers the arguments.
 | 
			
		||||
  SingleFailureChecker(const TestPartResultArray* results,
 | 
			
		||||
                       TestPartResult::Type type,
 | 
			
		||||
                       const string& substr);
 | 
			
		||||
  ~SingleFailureChecker();
 | 
			
		||||
 private:
 | 
			
		||||
  const TestPartResultArray* const results_;
 | 
			
		||||
  const TestPartResult::Type type_;
 | 
			
		||||
  const string substr_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
// A set of macros for testing Google Test assertions or code that's expected
 | 
			
		||||
// to generate Google Test fatal failures.  It verifies that the given
 | 
			
		||||
// statement will cause exactly one fatal Google Test failure with 'substr'
 | 
			
		||||
// being part of the failure message.
 | 
			
		||||
//
 | 
			
		||||
// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
 | 
			
		||||
// affects and considers failures generated in the current thread and
 | 
			
		||||
// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
 | 
			
		||||
//
 | 
			
		||||
// The verification of the assertion is done correctly even when the statement
 | 
			
		||||
// throws an exception or aborts the current function.
 | 
			
		||||
//
 | 
			
		||||
// Known restrictions:
 | 
			
		||||
//   - 'statement' cannot reference local non-static variables or
 | 
			
		||||
//     non-static members of the current object.
 | 
			
		||||
//   - 'statement' cannot return a value.
 | 
			
		||||
//   - You cannot stream a failure message to this macro.
 | 
			
		||||
//
 | 
			
		||||
// Note that even though the implementations of the following two
 | 
			
		||||
// macros are much alike, we cannot refactor them to use a common
 | 
			
		||||
// helper macro, due to some peculiarity in how the preprocessor
 | 
			
		||||
// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
 | 
			
		||||
// gtest_unittest.cc will fail to compile if we do that.
 | 
			
		||||
#define EXPECT_FATAL_FAILURE(statement, substr) \
 | 
			
		||||
  do { \
 | 
			
		||||
    class GTestExpectFatalFailureHelper {\
 | 
			
		||||
     public:\
 | 
			
		||||
      static void Execute() { statement; }\
 | 
			
		||||
    };\
 | 
			
		||||
    ::testing::TestPartResultArray gtest_failures;\
 | 
			
		||||
    ::testing::internal::SingleFailureChecker gtest_checker(\
 | 
			
		||||
        >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
 | 
			
		||||
    {\
 | 
			
		||||
      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
 | 
			
		||||
          ::testing::ScopedFakeTestPartResultReporter:: \
 | 
			
		||||
          INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
 | 
			
		||||
      GTestExpectFatalFailureHelper::Execute();\
 | 
			
		||||
    }\
 | 
			
		||||
  } while (::testing::internal::AlwaysFalse())
 | 
			
		||||
 | 
			
		||||
#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
 | 
			
		||||
  do { \
 | 
			
		||||
    class GTestExpectFatalFailureHelper {\
 | 
			
		||||
     public:\
 | 
			
		||||
      static void Execute() { statement; }\
 | 
			
		||||
    };\
 | 
			
		||||
    ::testing::TestPartResultArray gtest_failures;\
 | 
			
		||||
    ::testing::internal::SingleFailureChecker gtest_checker(\
 | 
			
		||||
        >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
 | 
			
		||||
    {\
 | 
			
		||||
      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
 | 
			
		||||
          ::testing::ScopedFakeTestPartResultReporter:: \
 | 
			
		||||
          INTERCEPT_ALL_THREADS, >est_failures);\
 | 
			
		||||
      GTestExpectFatalFailureHelper::Execute();\
 | 
			
		||||
    }\
 | 
			
		||||
  } while (::testing::internal::AlwaysFalse())
 | 
			
		||||
 | 
			
		||||
// A macro for testing Google Test assertions or code that's expected to
 | 
			
		||||
// generate Google Test non-fatal failures.  It asserts that the given
 | 
			
		||||
// statement will cause exactly one non-fatal Google Test failure with 'substr'
 | 
			
		||||
// being part of the failure message.
 | 
			
		||||
//
 | 
			
		||||
// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
 | 
			
		||||
// affects and considers failures generated in the current thread and
 | 
			
		||||
// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
 | 
			
		||||
//
 | 
			
		||||
// 'statement' is allowed to reference local variables and members of
 | 
			
		||||
// the current object.
 | 
			
		||||
//
 | 
			
		||||
// The verification of the assertion is done correctly even when the statement
 | 
			
		||||
// throws an exception or aborts the current function.
 | 
			
		||||
//
 | 
			
		||||
// Known restrictions:
 | 
			
		||||
//   - You cannot stream a failure message to this macro.
 | 
			
		||||
//
 | 
			
		||||
// Note that even though the implementations of the following two
 | 
			
		||||
// macros are much alike, we cannot refactor them to use a common
 | 
			
		||||
// helper macro, due to some peculiarity in how the preprocessor
 | 
			
		||||
// works.  If we do that, the code won't compile when the user gives
 | 
			
		||||
// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
 | 
			
		||||
// expands to code containing an unprotected comma.  The
 | 
			
		||||
// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
 | 
			
		||||
// catches that.
 | 
			
		||||
//
 | 
			
		||||
// For the same reason, we have to write
 | 
			
		||||
//   if (::testing::internal::AlwaysTrue()) { statement; }
 | 
			
		||||
// instead of
 | 
			
		||||
//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
 | 
			
		||||
// to avoid an MSVC warning on unreachable code.
 | 
			
		||||
#define EXPECT_NONFATAL_FAILURE(statement, substr) \
 | 
			
		||||
  do {\
 | 
			
		||||
    ::testing::TestPartResultArray gtest_failures;\
 | 
			
		||||
    ::testing::internal::SingleFailureChecker gtest_checker(\
 | 
			
		||||
        >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
 | 
			
		||||
        (substr));\
 | 
			
		||||
    {\
 | 
			
		||||
      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
 | 
			
		||||
          ::testing::ScopedFakeTestPartResultReporter:: \
 | 
			
		||||
          INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
 | 
			
		||||
      if (::testing::internal::AlwaysTrue()) { statement; }\
 | 
			
		||||
    }\
 | 
			
		||||
  } while (::testing::internal::AlwaysFalse())
 | 
			
		||||
 | 
			
		||||
#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
 | 
			
		||||
  do {\
 | 
			
		||||
    ::testing::TestPartResultArray gtest_failures;\
 | 
			
		||||
    ::testing::internal::SingleFailureChecker gtest_checker(\
 | 
			
		||||
        >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
 | 
			
		||||
        (substr));\
 | 
			
		||||
    {\
 | 
			
		||||
      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
 | 
			
		||||
          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
 | 
			
		||||
          >est_failures);\
 | 
			
		||||
      if (::testing::internal::AlwaysTrue()) { statement; }\
 | 
			
		||||
    }\
 | 
			
		||||
  } while (::testing::internal::AlwaysFalse())
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
 | 
			
		||||
							
								
								
									
										179
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-test-part.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-test-part.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,179 @@
 | 
			
		||||
// Copyright 2008, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: mheule@google.com (Markus Heule)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
 | 
			
		||||
 | 
			
		||||
#include <iosfwd>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include "gtest/internal/gtest-internal.h"
 | 
			
		||||
#include "gtest/internal/gtest-string.h"
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// A copyable object representing the result of a test part (i.e. an
 | 
			
		||||
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
 | 
			
		||||
//
 | 
			
		||||
// Don't inherit from TestPartResult as its destructor is not virtual.
 | 
			
		||||
class GTEST_API_ TestPartResult {
 | 
			
		||||
 public:
 | 
			
		||||
  // The possible outcomes of a test part (i.e. an assertion or an
 | 
			
		||||
  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
 | 
			
		||||
  enum Type {
 | 
			
		||||
    kSuccess,          // Succeeded.
 | 
			
		||||
    kNonFatalFailure,  // Failed but the test can continue.
 | 
			
		||||
    kFatalFailure      // Failed and the test should be terminated.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // C'tor.  TestPartResult does NOT have a default constructor.
 | 
			
		||||
  // Always use this constructor (with parameters) to create a
 | 
			
		||||
  // TestPartResult object.
 | 
			
		||||
  TestPartResult(Type a_type,
 | 
			
		||||
                 const char* a_file_name,
 | 
			
		||||
                 int a_line_number,
 | 
			
		||||
                 const char* a_message)
 | 
			
		||||
      : type_(a_type),
 | 
			
		||||
        file_name_(a_file_name == NULL ? "" : a_file_name),
 | 
			
		||||
        line_number_(a_line_number),
 | 
			
		||||
        summary_(ExtractSummary(a_message)),
 | 
			
		||||
        message_(a_message) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Gets the outcome of the test part.
 | 
			
		||||
  Type type() const { return type_; }
 | 
			
		||||
 | 
			
		||||
  // Gets the name of the source file where the test part took place, or
 | 
			
		||||
  // NULL if it's unknown.
 | 
			
		||||
  const char* file_name() const {
 | 
			
		||||
    return file_name_.empty() ? NULL : file_name_.c_str();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Gets the line in the source file where the test part took place,
 | 
			
		||||
  // or -1 if it's unknown.
 | 
			
		||||
  int line_number() const { return line_number_; }
 | 
			
		||||
 | 
			
		||||
  // Gets the summary of the failure message.
 | 
			
		||||
  const char* summary() const { return summary_.c_str(); }
 | 
			
		||||
 | 
			
		||||
  // Gets the message associated with the test part.
 | 
			
		||||
  const char* message() const { return message_.c_str(); }
 | 
			
		||||
 | 
			
		||||
  // Returns true iff the test part passed.
 | 
			
		||||
  bool passed() const { return type_ == kSuccess; }
 | 
			
		||||
 | 
			
		||||
  // Returns true iff the test part failed.
 | 
			
		||||
  bool failed() const { return type_ != kSuccess; }
 | 
			
		||||
 | 
			
		||||
  // Returns true iff the test part non-fatally failed.
 | 
			
		||||
  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
 | 
			
		||||
 | 
			
		||||
  // Returns true iff the test part fatally failed.
 | 
			
		||||
  bool fatally_failed() const { return type_ == kFatalFailure; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  Type type_;
 | 
			
		||||
 | 
			
		||||
  // Gets the summary of the failure message by omitting the stack
 | 
			
		||||
  // trace in it.
 | 
			
		||||
  static std::string ExtractSummary(const char* message);
 | 
			
		||||
 | 
			
		||||
  // The name of the source file where the test part took place, or
 | 
			
		||||
  // "" if the source file is unknown.
 | 
			
		||||
  std::string file_name_;
 | 
			
		||||
  // The line in the source file where the test part took place, or -1
 | 
			
		||||
  // if the line number is unknown.
 | 
			
		||||
  int line_number_;
 | 
			
		||||
  std::string summary_;  // The test failure summary.
 | 
			
		||||
  std::string message_;  // The test failure message.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Prints a TestPartResult object.
 | 
			
		||||
std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
 | 
			
		||||
 | 
			
		||||
// An array of TestPartResult objects.
 | 
			
		||||
//
 | 
			
		||||
// Don't inherit from TestPartResultArray as its destructor is not
 | 
			
		||||
// virtual.
 | 
			
		||||
class GTEST_API_ TestPartResultArray {
 | 
			
		||||
 public:
 | 
			
		||||
  TestPartResultArray() {}
 | 
			
		||||
 | 
			
		||||
  // Appends the given TestPartResult to the array.
 | 
			
		||||
  void Append(const TestPartResult& result);
 | 
			
		||||
 | 
			
		||||
  // Returns the TestPartResult at the given index (0-based).
 | 
			
		||||
  const TestPartResult& GetTestPartResult(int index) const;
 | 
			
		||||
 | 
			
		||||
  // Returns the number of TestPartResult objects in the array.
 | 
			
		||||
  int size() const;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::vector<TestPartResult> array_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// This interface knows how to report a test part result.
 | 
			
		||||
class TestPartResultReporterInterface {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~TestPartResultReporterInterface() {}
 | 
			
		||||
 | 
			
		||||
  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
 | 
			
		||||
// statement generates new fatal failures. To do so it registers itself as the
 | 
			
		||||
// current test part result reporter. Besides checking if fatal failures were
 | 
			
		||||
// reported, it only delegates the reporting to the former result reporter.
 | 
			
		||||
// The original result reporter is restored in the destructor.
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 | 
			
		||||
class GTEST_API_ HasNewFatalFailureHelper
 | 
			
		||||
    : public TestPartResultReporterInterface {
 | 
			
		||||
 public:
 | 
			
		||||
  HasNewFatalFailureHelper();
 | 
			
		||||
  virtual ~HasNewFatalFailureHelper();
 | 
			
		||||
  virtual void ReportTestPartResult(const TestPartResult& result);
 | 
			
		||||
  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
 | 
			
		||||
 private:
 | 
			
		||||
  bool has_new_fatal_failure_;
 | 
			
		||||
  TestPartResultReporterInterface* original_reporter_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
 | 
			
		||||
							
								
								
									
										263
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-typed-test.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest-typed-test.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,263 @@
 | 
			
		||||
// Copyright 2008 Google Inc.
 | 
			
		||||
// All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
 | 
			
		||||
 | 
			
		||||
// This header implements typed tests and type-parameterized tests.
 | 
			
		||||
 | 
			
		||||
// Typed (aka type-driven) tests repeat the same test for types in a
 | 
			
		||||
// list.  You must know which types you want to test with when writing
 | 
			
		||||
// typed tests. Here's how you do it:
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
 | 
			
		||||
// First, define a fixture class template.  It should be parameterized
 | 
			
		||||
// by a type.  Remember to derive it from testing::Test.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class FooTest : public testing::Test {
 | 
			
		||||
 public:
 | 
			
		||||
  ...
 | 
			
		||||
  typedef std::list<T> List;
 | 
			
		||||
  static T shared_;
 | 
			
		||||
  T value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Next, associate a list of types with the test case, which will be
 | 
			
		||||
// repeated for each type in the list.  The typedef is necessary for
 | 
			
		||||
// the macro to parse correctly.
 | 
			
		||||
typedef testing::Types<char, int, unsigned int> MyTypes;
 | 
			
		||||
TYPED_TEST_CASE(FooTest, MyTypes);
 | 
			
		||||
 | 
			
		||||
// If the type list contains only one type, you can write that type
 | 
			
		||||
// directly without Types<...>:
 | 
			
		||||
//   TYPED_TEST_CASE(FooTest, int);
 | 
			
		||||
 | 
			
		||||
// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
 | 
			
		||||
// tests for this test case as you want.
 | 
			
		||||
TYPED_TEST(FooTest, DoesBlah) {
 | 
			
		||||
  // Inside a test, refer to TypeParam to get the type parameter.
 | 
			
		||||
  // Since we are inside a derived class template, C++ requires use to
 | 
			
		||||
  // visit the members of FooTest via 'this'.
 | 
			
		||||
  TypeParam n = this->value_;
 | 
			
		||||
 | 
			
		||||
  // To visit static members of the fixture, add the TestFixture::
 | 
			
		||||
  // prefix.
 | 
			
		||||
  n += TestFixture::shared_;
 | 
			
		||||
 | 
			
		||||
  // To refer to typedefs in the fixture, add the "typename
 | 
			
		||||
  // TestFixture::" prefix.
 | 
			
		||||
  typename TestFixture::List values;
 | 
			
		||||
  values.push_back(n);
 | 
			
		||||
  ...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST(FooTest, HasPropertyA) { ... }
 | 
			
		||||
 | 
			
		||||
#endif  // 0
 | 
			
		||||
 | 
			
		||||
// Type-parameterized tests are abstract test patterns parameterized
 | 
			
		||||
// by a type.  Compared with typed tests, type-parameterized tests
 | 
			
		||||
// allow you to define the test pattern without knowing what the type
 | 
			
		||||
// parameters are.  The defined pattern can be instantiated with
 | 
			
		||||
// different types any number of times, in any number of translation
 | 
			
		||||
// units.
 | 
			
		||||
//
 | 
			
		||||
// If you are designing an interface or concept, you can define a
 | 
			
		||||
// suite of type-parameterized tests to verify properties that any
 | 
			
		||||
// valid implementation of the interface/concept should have.  Then,
 | 
			
		||||
// each implementation can easily instantiate the test suite to verify
 | 
			
		||||
// that it conforms to the requirements, without having to write
 | 
			
		||||
// similar tests repeatedly.  Here's an example:
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
 | 
			
		||||
// First, define a fixture class template.  It should be parameterized
 | 
			
		||||
// by a type.  Remember to derive it from testing::Test.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class FooTest : public testing::Test {
 | 
			
		||||
  ...
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Next, declare that you will define a type-parameterized test case
 | 
			
		||||
// (the _P suffix is for "parameterized" or "pattern", whichever you
 | 
			
		||||
// prefer):
 | 
			
		||||
TYPED_TEST_CASE_P(FooTest);
 | 
			
		||||
 | 
			
		||||
// Then, use TYPED_TEST_P() to define as many type-parameterized tests
 | 
			
		||||
// for this type-parameterized test case as you want.
 | 
			
		||||
TYPED_TEST_P(FooTest, DoesBlah) {
 | 
			
		||||
  // Inside a test, refer to TypeParam to get the type parameter.
 | 
			
		||||
  TypeParam n = 0;
 | 
			
		||||
  ...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TYPED_TEST_P(FooTest, HasPropertyA) { ... }
 | 
			
		||||
 | 
			
		||||
// Now the tricky part: you need to register all test patterns before
 | 
			
		||||
// you can instantiate them.  The first argument of the macro is the
 | 
			
		||||
// test case name; the rest are the names of the tests in this test
 | 
			
		||||
// case.
 | 
			
		||||
REGISTER_TYPED_TEST_CASE_P(FooTest,
 | 
			
		||||
                           DoesBlah, HasPropertyA);
 | 
			
		||||
 | 
			
		||||
// Finally, you are free to instantiate the pattern with the types you
 | 
			
		||||
// want.  If you put the above code in a header file, you can #include
 | 
			
		||||
// it in multiple C++ source files and instantiate it multiple times.
 | 
			
		||||
//
 | 
			
		||||
// To distinguish different instances of the pattern, the first
 | 
			
		||||
// argument to the INSTANTIATE_* macro is a prefix that will be added
 | 
			
		||||
// to the actual test case name.  Remember to pick unique prefixes for
 | 
			
		||||
// different instances.
 | 
			
		||||
typedef testing::Types<char, int, unsigned int> MyTypes;
 | 
			
		||||
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
 | 
			
		||||
 | 
			
		||||
// If the type list contains only one type, you can write that type
 | 
			
		||||
// directly without Types<...>:
 | 
			
		||||
//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
 | 
			
		||||
 | 
			
		||||
#endif  // 0
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
#include "gtest/internal/gtest-type-util.h"
 | 
			
		||||
 | 
			
		||||
// Implements typed tests.
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Expands to the name of the typedef for the type parameters of the
 | 
			
		||||
// given test case.
 | 
			
		||||
# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
 | 
			
		||||
 | 
			
		||||
// The 'Types' template argument below must have spaces around it
 | 
			
		||||
// since some compilers may choke on '>>' when passing a template
 | 
			
		||||
// instance (e.g. Types<int>)
 | 
			
		||||
# define TYPED_TEST_CASE(CaseName, Types) \
 | 
			
		||||
  typedef ::testing::internal::TypeList< Types >::type \
 | 
			
		||||
      GTEST_TYPE_PARAMS_(CaseName)
 | 
			
		||||
 | 
			
		||||
# define TYPED_TEST(CaseName, TestName) \
 | 
			
		||||
  template <typename gtest_TypeParam_> \
 | 
			
		||||
  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
 | 
			
		||||
      : public CaseName<gtest_TypeParam_> { \
 | 
			
		||||
   private: \
 | 
			
		||||
    typedef CaseName<gtest_TypeParam_> TestFixture; \
 | 
			
		||||
    typedef gtest_TypeParam_ TypeParam; \
 | 
			
		||||
    virtual void TestBody(); \
 | 
			
		||||
  }; \
 | 
			
		||||
  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
 | 
			
		||||
      ::testing::internal::TypeParameterizedTest< \
 | 
			
		||||
          CaseName, \
 | 
			
		||||
          ::testing::internal::TemplateSel< \
 | 
			
		||||
              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
 | 
			
		||||
          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
 | 
			
		||||
              "", ::testing::internal::CodeLocation(__FILE__, __LINE__), \
 | 
			
		||||
              #CaseName, #TestName, 0); \
 | 
			
		||||
  template <typename gtest_TypeParam_> \
 | 
			
		||||
  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST
 | 
			
		||||
 | 
			
		||||
// Implements type-parameterized tests.
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Expands to the namespace name that the type-parameterized tests for
 | 
			
		||||
// the given type-parameterized test case are defined in.  The exact
 | 
			
		||||
// name of the namespace is subject to change without notice.
 | 
			
		||||
# define GTEST_CASE_NAMESPACE_(TestCaseName) \
 | 
			
		||||
  gtest_case_##TestCaseName##_
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Expands to the name of the variable used to remember the names of
 | 
			
		||||
// the defined tests in the given test case.
 | 
			
		||||
# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
 | 
			
		||||
  gtest_typed_test_case_p_state_##TestCaseName##_
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
 | 
			
		||||
//
 | 
			
		||||
// Expands to the name of the variable used to remember the names of
 | 
			
		||||
// the registered tests in the given test case.
 | 
			
		||||
# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
 | 
			
		||||
  gtest_registered_test_names_##TestCaseName##_
 | 
			
		||||
 | 
			
		||||
// The variables defined in the type-parameterized test macros are
 | 
			
		||||
// static as typically these macros are used in a .h file that can be
 | 
			
		||||
// #included in multiple translation units linked together.
 | 
			
		||||
# define TYPED_TEST_CASE_P(CaseName) \
 | 
			
		||||
  static ::testing::internal::TypedTestCasePState \
 | 
			
		||||
      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
 | 
			
		||||
 | 
			
		||||
# define TYPED_TEST_P(CaseName, TestName) \
 | 
			
		||||
  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
 | 
			
		||||
  template <typename gtest_TypeParam_> \
 | 
			
		||||
  class TestName : public CaseName<gtest_TypeParam_> { \
 | 
			
		||||
   private: \
 | 
			
		||||
    typedef CaseName<gtest_TypeParam_> TestFixture; \
 | 
			
		||||
    typedef gtest_TypeParam_ TypeParam; \
 | 
			
		||||
    virtual void TestBody(); \
 | 
			
		||||
  }; \
 | 
			
		||||
  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
 | 
			
		||||
      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
 | 
			
		||||
          __FILE__, __LINE__, #CaseName, #TestName); \
 | 
			
		||||
  } \
 | 
			
		||||
  template <typename gtest_TypeParam_> \
 | 
			
		||||
  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
 | 
			
		||||
 | 
			
		||||
# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
 | 
			
		||||
  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
 | 
			
		||||
  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
 | 
			
		||||
  } \
 | 
			
		||||
  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
 | 
			
		||||
      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
 | 
			
		||||
          __FILE__, __LINE__, #__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
// The 'Types' template argument below must have spaces around it
 | 
			
		||||
// since some compilers may choke on '>>' when passing a template
 | 
			
		||||
// instance (e.g. Types<int>)
 | 
			
		||||
# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
 | 
			
		||||
  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
 | 
			
		||||
      ::testing::internal::TypeParameterizedTestCase<CaseName, \
 | 
			
		||||
          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
 | 
			
		||||
          ::testing::internal::TypeList< Types >::type>::Register(\
 | 
			
		||||
              #Prefix, \
 | 
			
		||||
              ::testing::internal::CodeLocation(__FILE__, __LINE__), \
 | 
			
		||||
              >EST_TYPED_TEST_CASE_P_STATE_(CaseName), \
 | 
			
		||||
              #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
 | 
			
		||||
							
								
								
									
										2236
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2236
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										358
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest_pred_impl.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest_pred_impl.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,358 @@
 | 
			
		||||
// Copyright 2006, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
 | 
			
		||||
// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
 | 
			
		||||
//
 | 
			
		||||
// Implements a family of generic predicate assertion macros.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | 
			
		||||
 | 
			
		||||
// Makes sure this header is not included before gtest.h.
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
 | 
			
		||||
# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
 | 
			
		||||
 | 
			
		||||
// This header implements a family of generic predicate assertion
 | 
			
		||||
// macros:
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_PRED_FORMAT1(pred_format, v1)
 | 
			
		||||
//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
 | 
			
		||||
//   ...
 | 
			
		||||
//
 | 
			
		||||
// where pred_format is a function or functor that takes n (in the
 | 
			
		||||
// case of ASSERT_PRED_FORMATn) values and their source expression
 | 
			
		||||
// text, and returns a testing::AssertionResult.  See the definition
 | 
			
		||||
// of ASSERT_EQ in gtest.h for an example.
 | 
			
		||||
//
 | 
			
		||||
// If you don't care about formatting, you can use the more
 | 
			
		||||
// restrictive version:
 | 
			
		||||
//
 | 
			
		||||
//   ASSERT_PRED1(pred, v1)
 | 
			
		||||
//   ASSERT_PRED2(pred, v1, v2)
 | 
			
		||||
//   ...
 | 
			
		||||
//
 | 
			
		||||
// where pred is an n-ary function or functor that returns bool,
 | 
			
		||||
// and the values v1, v2, ..., must support the << operator for
 | 
			
		||||
// streaming to std::ostream.
 | 
			
		||||
//
 | 
			
		||||
// We also define the EXPECT_* variations.
 | 
			
		||||
//
 | 
			
		||||
// For now we only support predicates whose arity is at most 5.
 | 
			
		||||
// Please email googletestframework@googlegroups.com if you need
 | 
			
		||||
// support for higher arities.
 | 
			
		||||
 | 
			
		||||
// GTEST_ASSERT_ is the basic statement to which all of the assertions
 | 
			
		||||
// in this file reduce.  Don't use this in your code.
 | 
			
		||||
 | 
			
		||||
#define GTEST_ASSERT_(expression, on_failure) \
 | 
			
		||||
  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
 | 
			
		||||
  if (const ::testing::AssertionResult gtest_ar = (expression)) \
 | 
			
		||||
    ; \
 | 
			
		||||
  else \
 | 
			
		||||
    on_failure(gtest_ar.failure_message())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
template <typename Pred,
 | 
			
		||||
          typename T1>
 | 
			
		||||
AssertionResult AssertPred1Helper(const char* pred_text,
 | 
			
		||||
                                  const char* e1,
 | 
			
		||||
                                  Pred pred,
 | 
			
		||||
                                  const T1& v1) {
 | 
			
		||||
  if (pred(v1)) return AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
  return AssertionFailure() << pred_text << "("
 | 
			
		||||
                            << e1 << ") evaluates to false, where"
 | 
			
		||||
                            << "\n" << e1 << " evaluates to " << v1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
 | 
			
		||||
// Don't use this in your code.
 | 
			
		||||
#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(pred_format(#v1, v1), \
 | 
			
		||||
                on_failure)
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
#define GTEST_PRED1_(pred, v1, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
 | 
			
		||||
                                             #v1, \
 | 
			
		||||
                                             pred, \
 | 
			
		||||
                                             v1), on_failure)
 | 
			
		||||
 | 
			
		||||
// Unary predicate assertion macros.
 | 
			
		||||
#define EXPECT_PRED_FORMAT1(pred_format, v1) \
 | 
			
		||||
  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define EXPECT_PRED1(pred, v1) \
 | 
			
		||||
  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED_FORMAT1(pred_format, v1) \
 | 
			
		||||
  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED1(pred, v1) \
 | 
			
		||||
  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
template <typename Pred,
 | 
			
		||||
          typename T1,
 | 
			
		||||
          typename T2>
 | 
			
		||||
AssertionResult AssertPred2Helper(const char* pred_text,
 | 
			
		||||
                                  const char* e1,
 | 
			
		||||
                                  const char* e2,
 | 
			
		||||
                                  Pred pred,
 | 
			
		||||
                                  const T1& v1,
 | 
			
		||||
                                  const T2& v2) {
 | 
			
		||||
  if (pred(v1, v2)) return AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
  return AssertionFailure() << pred_text << "("
 | 
			
		||||
                            << e1 << ", "
 | 
			
		||||
                            << e2 << ") evaluates to false, where"
 | 
			
		||||
                            << "\n" << e1 << " evaluates to " << v1
 | 
			
		||||
                            << "\n" << e2 << " evaluates to " << v2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
 | 
			
		||||
// Don't use this in your code.
 | 
			
		||||
#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
 | 
			
		||||
                on_failure)
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
#define GTEST_PRED2_(pred, v1, v2, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
 | 
			
		||||
                                             #v1, \
 | 
			
		||||
                                             #v2, \
 | 
			
		||||
                                             pred, \
 | 
			
		||||
                                             v1, \
 | 
			
		||||
                                             v2), on_failure)
 | 
			
		||||
 | 
			
		||||
// Binary predicate assertion macros.
 | 
			
		||||
#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
 | 
			
		||||
  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define EXPECT_PRED2(pred, v1, v2) \
 | 
			
		||||
  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
 | 
			
		||||
  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED2(pred, v1, v2) \
 | 
			
		||||
  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
template <typename Pred,
 | 
			
		||||
          typename T1,
 | 
			
		||||
          typename T2,
 | 
			
		||||
          typename T3>
 | 
			
		||||
AssertionResult AssertPred3Helper(const char* pred_text,
 | 
			
		||||
                                  const char* e1,
 | 
			
		||||
                                  const char* e2,
 | 
			
		||||
                                  const char* e3,
 | 
			
		||||
                                  Pred pred,
 | 
			
		||||
                                  const T1& v1,
 | 
			
		||||
                                  const T2& v2,
 | 
			
		||||
                                  const T3& v3) {
 | 
			
		||||
  if (pred(v1, v2, v3)) return AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
  return AssertionFailure() << pred_text << "("
 | 
			
		||||
                            << e1 << ", "
 | 
			
		||||
                            << e2 << ", "
 | 
			
		||||
                            << e3 << ") evaluates to false, where"
 | 
			
		||||
                            << "\n" << e1 << " evaluates to " << v1
 | 
			
		||||
                            << "\n" << e2 << " evaluates to " << v2
 | 
			
		||||
                            << "\n" << e3 << " evaluates to " << v3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
 | 
			
		||||
// Don't use this in your code.
 | 
			
		||||
#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
 | 
			
		||||
                on_failure)
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
 | 
			
		||||
                                             #v1, \
 | 
			
		||||
                                             #v2, \
 | 
			
		||||
                                             #v3, \
 | 
			
		||||
                                             pred, \
 | 
			
		||||
                                             v1, \
 | 
			
		||||
                                             v2, \
 | 
			
		||||
                                             v3), on_failure)
 | 
			
		||||
 | 
			
		||||
// Ternary predicate assertion macros.
 | 
			
		||||
#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
 | 
			
		||||
  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define EXPECT_PRED3(pred, v1, v2, v3) \
 | 
			
		||||
  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
 | 
			
		||||
  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED3(pred, v1, v2, v3) \
 | 
			
		||||
  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
template <typename Pred,
 | 
			
		||||
          typename T1,
 | 
			
		||||
          typename T2,
 | 
			
		||||
          typename T3,
 | 
			
		||||
          typename T4>
 | 
			
		||||
AssertionResult AssertPred4Helper(const char* pred_text,
 | 
			
		||||
                                  const char* e1,
 | 
			
		||||
                                  const char* e2,
 | 
			
		||||
                                  const char* e3,
 | 
			
		||||
                                  const char* e4,
 | 
			
		||||
                                  Pred pred,
 | 
			
		||||
                                  const T1& v1,
 | 
			
		||||
                                  const T2& v2,
 | 
			
		||||
                                  const T3& v3,
 | 
			
		||||
                                  const T4& v4) {
 | 
			
		||||
  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
  return AssertionFailure() << pred_text << "("
 | 
			
		||||
                            << e1 << ", "
 | 
			
		||||
                            << e2 << ", "
 | 
			
		||||
                            << e3 << ", "
 | 
			
		||||
                            << e4 << ") evaluates to false, where"
 | 
			
		||||
                            << "\n" << e1 << " evaluates to " << v1
 | 
			
		||||
                            << "\n" << e2 << " evaluates to " << v2
 | 
			
		||||
                            << "\n" << e3 << " evaluates to " << v3
 | 
			
		||||
                            << "\n" << e4 << " evaluates to " << v4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
 | 
			
		||||
// Don't use this in your code.
 | 
			
		||||
#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
 | 
			
		||||
                on_failure)
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
 | 
			
		||||
                                             #v1, \
 | 
			
		||||
                                             #v2, \
 | 
			
		||||
                                             #v3, \
 | 
			
		||||
                                             #v4, \
 | 
			
		||||
                                             pred, \
 | 
			
		||||
                                             v1, \
 | 
			
		||||
                                             v2, \
 | 
			
		||||
                                             v3, \
 | 
			
		||||
                                             v4), on_failure)
 | 
			
		||||
 | 
			
		||||
// 4-ary predicate assertion macros.
 | 
			
		||||
#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
 | 
			
		||||
  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
 | 
			
		||||
  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
 | 
			
		||||
  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
 | 
			
		||||
  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
template <typename Pred,
 | 
			
		||||
          typename T1,
 | 
			
		||||
          typename T2,
 | 
			
		||||
          typename T3,
 | 
			
		||||
          typename T4,
 | 
			
		||||
          typename T5>
 | 
			
		||||
AssertionResult AssertPred5Helper(const char* pred_text,
 | 
			
		||||
                                  const char* e1,
 | 
			
		||||
                                  const char* e2,
 | 
			
		||||
                                  const char* e3,
 | 
			
		||||
                                  const char* e4,
 | 
			
		||||
                                  const char* e5,
 | 
			
		||||
                                  Pred pred,
 | 
			
		||||
                                  const T1& v1,
 | 
			
		||||
                                  const T2& v2,
 | 
			
		||||
                                  const T3& v3,
 | 
			
		||||
                                  const T4& v4,
 | 
			
		||||
                                  const T5& v5) {
 | 
			
		||||
  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
 | 
			
		||||
 | 
			
		||||
  return AssertionFailure() << pred_text << "("
 | 
			
		||||
                            << e1 << ", "
 | 
			
		||||
                            << e2 << ", "
 | 
			
		||||
                            << e3 << ", "
 | 
			
		||||
                            << e4 << ", "
 | 
			
		||||
                            << e5 << ") evaluates to false, where"
 | 
			
		||||
                            << "\n" << e1 << " evaluates to " << v1
 | 
			
		||||
                            << "\n" << e2 << " evaluates to " << v2
 | 
			
		||||
                            << "\n" << e3 << " evaluates to " << v3
 | 
			
		||||
                            << "\n" << e4 << " evaluates to " << v4
 | 
			
		||||
                            << "\n" << e5 << " evaluates to " << v5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
 | 
			
		||||
// Don't use this in your code.
 | 
			
		||||
#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
 | 
			
		||||
                on_failure)
 | 
			
		||||
 | 
			
		||||
// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
 | 
			
		||||
// this in your code.
 | 
			
		||||
#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
 | 
			
		||||
  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
 | 
			
		||||
                                             #v1, \
 | 
			
		||||
                                             #v2, \
 | 
			
		||||
                                             #v3, \
 | 
			
		||||
                                             #v4, \
 | 
			
		||||
                                             #v5, \
 | 
			
		||||
                                             pred, \
 | 
			
		||||
                                             v1, \
 | 
			
		||||
                                             v2, \
 | 
			
		||||
                                             v3, \
 | 
			
		||||
                                             v4, \
 | 
			
		||||
                                             v5), on_failure)
 | 
			
		||||
 | 
			
		||||
// 5-ary predicate assertion macros.
 | 
			
		||||
#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
 | 
			
		||||
  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
 | 
			
		||||
  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
 | 
			
		||||
  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
 | 
			
		||||
#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
 | 
			
		||||
  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
 | 
			
		||||
							
								
								
									
										58
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest_prod.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/gtest_prod.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
// Copyright 2006, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
//
 | 
			
		||||
// Google C++ Testing Framework definitions useful in production code.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
 | 
			
		||||
 | 
			
		||||
// When you need to test the private or protected members of a class,
 | 
			
		||||
// use the FRIEND_TEST macro to declare your tests as friends of the
 | 
			
		||||
// class.  For example:
 | 
			
		||||
//
 | 
			
		||||
// class MyClass {
 | 
			
		||||
//  private:
 | 
			
		||||
//   void MyMethod();
 | 
			
		||||
//   FRIEND_TEST(MyClassTest, MyMethod);
 | 
			
		||||
// };
 | 
			
		||||
//
 | 
			
		||||
// class MyClassTest : public testing::Test {
 | 
			
		||||
//   // ...
 | 
			
		||||
// };
 | 
			
		||||
//
 | 
			
		||||
// TEST_F(MyClassTest, MyMethod) {
 | 
			
		||||
//   // Can call MyClass::MyMethod() here.
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
#define FRIEND_TEST(test_case_name, test_name)\
 | 
			
		||||
friend class test_case_name##_##test_name##_Test
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
 | 
			
		||||
							
								
								
									
										69
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/custom/gtest-port.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/custom/gtest-port.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
// Copyright 2015, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Injection point for custom user configurations.
 | 
			
		||||
// The following macros can be defined:
 | 
			
		||||
//
 | 
			
		||||
//   Flag related macros:
 | 
			
		||||
//     GTEST_FLAG(flag_name)
 | 
			
		||||
//     GTEST_USE_OWN_FLAGFILE_FLAG_  - Define to 0 when the system provides its
 | 
			
		||||
//                                     own flagfile flag parsing.
 | 
			
		||||
//     GTEST_DECLARE_bool_(name)
 | 
			
		||||
//     GTEST_DECLARE_int32_(name)
 | 
			
		||||
//     GTEST_DECLARE_string_(name)
 | 
			
		||||
//     GTEST_DEFINE_bool_(name, default_val, doc)
 | 
			
		||||
//     GTEST_DEFINE_int32_(name, default_val, doc)
 | 
			
		||||
//     GTEST_DEFINE_string_(name, default_val, doc)
 | 
			
		||||
//
 | 
			
		||||
//   Test filtering:
 | 
			
		||||
//     GTEST_TEST_FILTER_ENV_VAR_ - The name of an environment variable that
 | 
			
		||||
//                                  will be used if --GTEST_FLAG(test_filter)
 | 
			
		||||
//                                  is not provided.
 | 
			
		||||
//
 | 
			
		||||
//   Logging:
 | 
			
		||||
//     GTEST_LOG_(severity)
 | 
			
		||||
//     GTEST_CHECK_(condition)
 | 
			
		||||
//     Functions LogToStderr() and FlushInfoLog() have to be provided too.
 | 
			
		||||
//
 | 
			
		||||
//   Threading:
 | 
			
		||||
//     GTEST_HAS_NOTIFICATION_ - Enabled if Notification is already provided.
 | 
			
		||||
//     GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ - Enabled if Mutex and ThreadLocal are
 | 
			
		||||
//                                         already provided.
 | 
			
		||||
//     Must also provide GTEST_DECLARE_STATIC_MUTEX_(mutex) and
 | 
			
		||||
//     GTEST_DEFINE_STATIC_MUTEX_(mutex)
 | 
			
		||||
//
 | 
			
		||||
//     GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
 | 
			
		||||
//     GTEST_LOCK_EXCLUDED_(locks)
 | 
			
		||||
//
 | 
			
		||||
// ** Custom implementation starts here **
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_
 | 
			
		||||
							
								
								
									
										42
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/custom/gtest-printers.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/custom/gtest-printers.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
// Copyright 2015, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// This file provides an injection point for custom printers in a local
 | 
			
		||||
// installation of gTest.
 | 
			
		||||
// It will be included from gtest-printers.h and the overrides in this file
 | 
			
		||||
// will be visible to everyone.
 | 
			
		||||
// See documentation at gtest/gtest-printers.h for details on how to define a
 | 
			
		||||
// custom printer.
 | 
			
		||||
//
 | 
			
		||||
// ** Custom implementation starts here **
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_
 | 
			
		||||
							
								
								
									
										41
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/custom/gtest.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/custom/gtest.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
// Copyright 2015, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Injection point for custom user configurations.
 | 
			
		||||
// The following macros can be defined:
 | 
			
		||||
//
 | 
			
		||||
// GTEST_OS_STACK_TRACE_GETTER_  - The name of an implementation of
 | 
			
		||||
//                                 OsStackTraceGetterInterface.
 | 
			
		||||
//
 | 
			
		||||
// ** Custom implementation starts here **
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_
 | 
			
		||||
							
								
								
									
										319
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-death-test-internal.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-death-test-internal.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,319 @@
 | 
			
		||||
// Copyright 2005, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This header file defines internal utilities needed for implementing
 | 
			
		||||
// death tests.  They are subject to change without notice.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-internal.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
GTEST_DECLARE_string_(internal_run_death_test);
 | 
			
		||||
 | 
			
		||||
// Names of the flags (needed for parsing Google Test flags).
 | 
			
		||||
const char kDeathTestStyleFlag[] = "death_test_style";
 | 
			
		||||
const char kDeathTestUseFork[] = "death_test_use_fork";
 | 
			
		||||
const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
// DeathTest is a class that hides much of the complexity of the
 | 
			
		||||
// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
 | 
			
		||||
// returns a concrete class that depends on the prevailing death test
 | 
			
		||||
// style, as defined by the --gtest_death_test_style and/or
 | 
			
		||||
// --gtest_internal_run_death_test flags.
 | 
			
		||||
 | 
			
		||||
// In describing the results of death tests, these terms are used with
 | 
			
		||||
// the corresponding definitions:
 | 
			
		||||
//
 | 
			
		||||
// exit status:  The integer exit information in the format specified
 | 
			
		||||
//               by wait(2)
 | 
			
		||||
// exit code:    The integer code passed to exit(3), _exit(2), or
 | 
			
		||||
//               returned from main()
 | 
			
		||||
class GTEST_API_ DeathTest {
 | 
			
		||||
 public:
 | 
			
		||||
  // Create returns false if there was an error determining the
 | 
			
		||||
  // appropriate action to take for the current death test; for example,
 | 
			
		||||
  // if the gtest_death_test_style flag is set to an invalid value.
 | 
			
		||||
  // The LastMessage method will return a more detailed message in that
 | 
			
		||||
  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
 | 
			
		||||
  // argument is set.  If the death test should be skipped, the pointer
 | 
			
		||||
  // is set to NULL; otherwise, it is set to the address of a new concrete
 | 
			
		||||
  // DeathTest object that controls the execution of the current test.
 | 
			
		||||
  static bool Create(const char* statement, const RE* regex,
 | 
			
		||||
                     const char* file, int line, DeathTest** test);
 | 
			
		||||
  DeathTest();
 | 
			
		||||
  virtual ~DeathTest() { }
 | 
			
		||||
 | 
			
		||||
  // A helper class that aborts a death test when it's deleted.
 | 
			
		||||
  class ReturnSentinel {
 | 
			
		||||
   public:
 | 
			
		||||
    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
 | 
			
		||||
    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
 | 
			
		||||
   private:
 | 
			
		||||
    DeathTest* const test_;
 | 
			
		||||
    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
 | 
			
		||||
  } GTEST_ATTRIBUTE_UNUSED_;
 | 
			
		||||
 | 
			
		||||
  // An enumeration of possible roles that may be taken when a death
 | 
			
		||||
  // test is encountered.  EXECUTE means that the death test logic should
 | 
			
		||||
  // be executed immediately.  OVERSEE means that the program should prepare
 | 
			
		||||
  // the appropriate environment for a child process to execute the death
 | 
			
		||||
  // test, then wait for it to complete.
 | 
			
		||||
  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
 | 
			
		||||
 | 
			
		||||
  // An enumeration of the three reasons that a test might be aborted.
 | 
			
		||||
  enum AbortReason {
 | 
			
		||||
    TEST_ENCOUNTERED_RETURN_STATEMENT,
 | 
			
		||||
    TEST_THREW_EXCEPTION,
 | 
			
		||||
    TEST_DID_NOT_DIE
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // Assumes one of the above roles.
 | 
			
		||||
  virtual TestRole AssumeRole() = 0;
 | 
			
		||||
 | 
			
		||||
  // Waits for the death test to finish and returns its status.
 | 
			
		||||
  virtual int Wait() = 0;
 | 
			
		||||
 | 
			
		||||
  // Returns true if the death test passed; that is, the test process
 | 
			
		||||
  // exited during the test, its exit status matches a user-supplied
 | 
			
		||||
  // predicate, and its stderr output matches a user-supplied regular
 | 
			
		||||
  // expression.
 | 
			
		||||
  // The user-supplied predicate may be a macro expression rather
 | 
			
		||||
  // than a function pointer or functor, or else Wait and Passed could
 | 
			
		||||
  // be combined.
 | 
			
		||||
  virtual bool Passed(bool exit_status_ok) = 0;
 | 
			
		||||
 | 
			
		||||
  // Signals that the death test did not die as expected.
 | 
			
		||||
  virtual void Abort(AbortReason reason) = 0;
 | 
			
		||||
 | 
			
		||||
  // Returns a human-readable outcome message regarding the outcome of
 | 
			
		||||
  // the last death test.
 | 
			
		||||
  static const char* LastMessage();
 | 
			
		||||
 | 
			
		||||
  static void set_last_death_test_message(const std::string& message);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // A string containing a description of the outcome of the last death test.
 | 
			
		||||
  static std::string last_death_test_message_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Factory interface for death tests.  May be mocked out for testing.
 | 
			
		||||
class DeathTestFactory {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~DeathTestFactory() { }
 | 
			
		||||
  virtual bool Create(const char* statement, const RE* regex,
 | 
			
		||||
                      const char* file, int line, DeathTest** test) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A concrete DeathTestFactory implementation for normal use.
 | 
			
		||||
class DefaultDeathTestFactory : public DeathTestFactory {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual bool Create(const char* statement, const RE* regex,
 | 
			
		||||
                      const char* file, int line, DeathTest** test);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Returns true if exit_status describes a process that was terminated
 | 
			
		||||
// by a signal, or exited normally with a nonzero exit code.
 | 
			
		||||
GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
 | 
			
		||||
 | 
			
		||||
// Traps C++ exceptions escaping statement and reports them as test
 | 
			
		||||
// failures. Note that trapping SEH exceptions is not implemented here.
 | 
			
		||||
# if GTEST_HAS_EXCEPTIONS
 | 
			
		||||
#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
 | 
			
		||||
  try { \
 | 
			
		||||
    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
 | 
			
		||||
  } catch (const ::std::exception& gtest_exception) { \
 | 
			
		||||
    fprintf(\
 | 
			
		||||
        stderr, \
 | 
			
		||||
        "\n%s: Caught std::exception-derived exception escaping the " \
 | 
			
		||||
        "death test statement. Exception message: %s\n", \
 | 
			
		||||
        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
 | 
			
		||||
        gtest_exception.what()); \
 | 
			
		||||
    fflush(stderr); \
 | 
			
		||||
    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
 | 
			
		||||
  } catch (...) { \
 | 
			
		||||
    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
# else
 | 
			
		||||
#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
 | 
			
		||||
  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
 | 
			
		||||
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
 | 
			
		||||
// ASSERT_EXIT*, and EXPECT_EXIT*.
 | 
			
		||||
# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
 | 
			
		||||
  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
 | 
			
		||||
  if (::testing::internal::AlwaysTrue()) { \
 | 
			
		||||
    const ::testing::internal::RE& gtest_regex = (regex); \
 | 
			
		||||
    ::testing::internal::DeathTest* gtest_dt; \
 | 
			
		||||
    if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
 | 
			
		||||
        __FILE__, __LINE__, >est_dt)) { \
 | 
			
		||||
      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
 | 
			
		||||
    } \
 | 
			
		||||
    if (gtest_dt != NULL) { \
 | 
			
		||||
      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
 | 
			
		||||
          gtest_dt_ptr(gtest_dt); \
 | 
			
		||||
      switch (gtest_dt->AssumeRole()) { \
 | 
			
		||||
        case ::testing::internal::DeathTest::OVERSEE_TEST: \
 | 
			
		||||
          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
 | 
			
		||||
            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
 | 
			
		||||
          } \
 | 
			
		||||
          break; \
 | 
			
		||||
        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
 | 
			
		||||
          ::testing::internal::DeathTest::ReturnSentinel \
 | 
			
		||||
              gtest_sentinel(gtest_dt); \
 | 
			
		||||
          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
 | 
			
		||||
          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
 | 
			
		||||
          break; \
 | 
			
		||||
        } \
 | 
			
		||||
        default: \
 | 
			
		||||
          break; \
 | 
			
		||||
      } \
 | 
			
		||||
    } \
 | 
			
		||||
  } else \
 | 
			
		||||
    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
 | 
			
		||||
      fail(::testing::internal::DeathTest::LastMessage())
 | 
			
		||||
// The symbol "fail" here expands to something into which a message
 | 
			
		||||
// can be streamed.
 | 
			
		||||
 | 
			
		||||
// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
 | 
			
		||||
// NDEBUG mode. In this case we need the statements to be executed, the regex is
 | 
			
		||||
// ignored, and the macro must accept a streamed message even though the message
 | 
			
		||||
// is never printed.
 | 
			
		||||
# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
 | 
			
		||||
  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
 | 
			
		||||
  if (::testing::internal::AlwaysTrue()) { \
 | 
			
		||||
     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
 | 
			
		||||
  } else \
 | 
			
		||||
    ::testing::Message()
 | 
			
		||||
 | 
			
		||||
// A class representing the parsed contents of the
 | 
			
		||||
// --gtest_internal_run_death_test flag, as it existed when
 | 
			
		||||
// RUN_ALL_TESTS was called.
 | 
			
		||||
class InternalRunDeathTestFlag {
 | 
			
		||||
 public:
 | 
			
		||||
  InternalRunDeathTestFlag(const std::string& a_file,
 | 
			
		||||
                           int a_line,
 | 
			
		||||
                           int an_index,
 | 
			
		||||
                           int a_write_fd)
 | 
			
		||||
      : file_(a_file), line_(a_line), index_(an_index),
 | 
			
		||||
        write_fd_(a_write_fd) {}
 | 
			
		||||
 | 
			
		||||
  ~InternalRunDeathTestFlag() {
 | 
			
		||||
    if (write_fd_ >= 0)
 | 
			
		||||
      posix::Close(write_fd_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const std::string& file() const { return file_; }
 | 
			
		||||
  int line() const { return line_; }
 | 
			
		||||
  int index() const { return index_; }
 | 
			
		||||
  int write_fd() const { return write_fd_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::string file_;
 | 
			
		||||
  int line_;
 | 
			
		||||
  int index_;
 | 
			
		||||
  int write_fd_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Returns a newly created InternalRunDeathTestFlag object with fields
 | 
			
		||||
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
 | 
			
		||||
// the flag is specified; otherwise returns NULL.
 | 
			
		||||
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
 | 
			
		||||
 | 
			
		||||
#else  // GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
// This macro is used for implementing macros such as
 | 
			
		||||
// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
 | 
			
		||||
// death tests are not supported. Those macros must compile on such systems
 | 
			
		||||
// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
 | 
			
		||||
// systems that support death tests. This allows one to write such a macro
 | 
			
		||||
// on a system that does not support death tests and be sure that it will
 | 
			
		||||
// compile on a death-test supporting system.
 | 
			
		||||
//
 | 
			
		||||
// Parameters:
 | 
			
		||||
//   statement -  A statement that a macro such as EXPECT_DEATH would test
 | 
			
		||||
//                for program termination. This macro has to make sure this
 | 
			
		||||
//                statement is compiled but not executed, to ensure that
 | 
			
		||||
//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
 | 
			
		||||
//                parameter iff EXPECT_DEATH compiles with it.
 | 
			
		||||
//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
 | 
			
		||||
//                the output of statement.  This parameter has to be
 | 
			
		||||
//                compiled but not evaluated by this macro, to ensure that
 | 
			
		||||
//                this macro only accepts expressions that a macro such as
 | 
			
		||||
//                EXPECT_DEATH would accept.
 | 
			
		||||
//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
 | 
			
		||||
//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
 | 
			
		||||
//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
 | 
			
		||||
//                compile inside functions where ASSERT_DEATH doesn't
 | 
			
		||||
//                compile.
 | 
			
		||||
//
 | 
			
		||||
//  The branch that has an always false condition is used to ensure that
 | 
			
		||||
//  statement and regex are compiled (and thus syntactically correct) but
 | 
			
		||||
//  never executed. The unreachable code macro protects the terminator
 | 
			
		||||
//  statement from generating an 'unreachable code' warning in case
 | 
			
		||||
//  statement unconditionally returns or throws. The Message constructor at
 | 
			
		||||
//  the end allows the syntax of streaming additional messages into the
 | 
			
		||||
//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
 | 
			
		||||
# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
 | 
			
		||||
    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
 | 
			
		||||
    if (::testing::internal::AlwaysTrue()) { \
 | 
			
		||||
      GTEST_LOG_(WARNING) \
 | 
			
		||||
          << "Death tests are not supported on this platform.\n" \
 | 
			
		||||
          << "Statement '" #statement "' cannot be verified."; \
 | 
			
		||||
    } else if (::testing::internal::AlwaysFalse()) { \
 | 
			
		||||
      ::testing::internal::RE::PartialMatch(".*", (regex)); \
 | 
			
		||||
      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
 | 
			
		||||
      terminator; \
 | 
			
		||||
    } else \
 | 
			
		||||
      ::testing::Message()
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_DEATH_TEST
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
 | 
			
		||||
							
								
								
									
										206
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-filepath.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-filepath.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,206 @@
 | 
			
		||||
// Copyright 2008, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: keith.ray@gmail.com (Keith Ray)
 | 
			
		||||
//
 | 
			
		||||
// Google Test filepath utilities
 | 
			
		||||
//
 | 
			
		||||
// This header file declares classes and functions used internally by
 | 
			
		||||
// Google Test.  They are subject to change without notice.
 | 
			
		||||
//
 | 
			
		||||
// This file is #included in <gtest/internal/gtest-internal.h>.
 | 
			
		||||
// Do not include this header file separately!
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-string.h"
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// FilePath - a class for file and directory pathname manipulation which
 | 
			
		||||
// handles platform-specific conventions (like the pathname separator).
 | 
			
		||||
// Used for helper functions for naming files in a directory for xml output.
 | 
			
		||||
// Except for Set methods, all methods are const or static, which provides an
 | 
			
		||||
// "immutable value object" -- useful for peace of mind.
 | 
			
		||||
// A FilePath with a value ending in a path separator ("like/this/") represents
 | 
			
		||||
// a directory, otherwise it is assumed to represent a file. In either case,
 | 
			
		||||
// it may or may not represent an actual file or directory in the file system.
 | 
			
		||||
// Names are NOT checked for syntax correctness -- no checking for illegal
 | 
			
		||||
// characters, malformed paths, etc.
 | 
			
		||||
 | 
			
		||||
class GTEST_API_ FilePath {
 | 
			
		||||
 public:
 | 
			
		||||
  FilePath() : pathname_("") { }
 | 
			
		||||
  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
 | 
			
		||||
 | 
			
		||||
  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
 | 
			
		||||
    Normalize();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  FilePath& operator=(const FilePath& rhs) {
 | 
			
		||||
    Set(rhs);
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void Set(const FilePath& rhs) {
 | 
			
		||||
    pathname_ = rhs.pathname_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const std::string& string() const { return pathname_; }
 | 
			
		||||
  const char* c_str() const { return pathname_.c_str(); }
 | 
			
		||||
 | 
			
		||||
  // Returns the current working directory, or "" if unsuccessful.
 | 
			
		||||
  static FilePath GetCurrentDir();
 | 
			
		||||
 | 
			
		||||
  // Given directory = "dir", base_name = "test", number = 0,
 | 
			
		||||
  // extension = "xml", returns "dir/test.xml". If number is greater
 | 
			
		||||
  // than zero (e.g., 12), returns "dir/test_12.xml".
 | 
			
		||||
  // On Windows platform, uses \ as the separator rather than /.
 | 
			
		||||
  static FilePath MakeFileName(const FilePath& directory,
 | 
			
		||||
                               const FilePath& base_name,
 | 
			
		||||
                               int number,
 | 
			
		||||
                               const char* extension);
 | 
			
		||||
 | 
			
		||||
  // Given directory = "dir", relative_path = "test.xml",
 | 
			
		||||
  // returns "dir/test.xml".
 | 
			
		||||
  // On Windows, uses \ as the separator rather than /.
 | 
			
		||||
  static FilePath ConcatPaths(const FilePath& directory,
 | 
			
		||||
                              const FilePath& relative_path);
 | 
			
		||||
 | 
			
		||||
  // Returns a pathname for a file that does not currently exist. The pathname
 | 
			
		||||
  // will be directory/base_name.extension or
 | 
			
		||||
  // directory/base_name_<number>.extension if directory/base_name.extension
 | 
			
		||||
  // already exists. The number will be incremented until a pathname is found
 | 
			
		||||
  // that does not already exist.
 | 
			
		||||
  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
 | 
			
		||||
  // There could be a race condition if two or more processes are calling this
 | 
			
		||||
  // function at the same time -- they could both pick the same filename.
 | 
			
		||||
  static FilePath GenerateUniqueFileName(const FilePath& directory,
 | 
			
		||||
                                         const FilePath& base_name,
 | 
			
		||||
                                         const char* extension);
 | 
			
		||||
 | 
			
		||||
  // Returns true iff the path is "".
 | 
			
		||||
  bool IsEmpty() const { return pathname_.empty(); }
 | 
			
		||||
 | 
			
		||||
  // If input name has a trailing separator character, removes it and returns
 | 
			
		||||
  // the name, otherwise return the name string unmodified.
 | 
			
		||||
  // On Windows platform, uses \ as the separator, other platforms use /.
 | 
			
		||||
  FilePath RemoveTrailingPathSeparator() const;
 | 
			
		||||
 | 
			
		||||
  // Returns a copy of the FilePath with the directory part removed.
 | 
			
		||||
  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
 | 
			
		||||
  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
 | 
			
		||||
  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
 | 
			
		||||
  // returns an empty FilePath ("").
 | 
			
		||||
  // On Windows platform, '\' is the path separator, otherwise it is '/'.
 | 
			
		||||
  FilePath RemoveDirectoryName() const;
 | 
			
		||||
 | 
			
		||||
  // RemoveFileName returns the directory path with the filename removed.
 | 
			
		||||
  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
 | 
			
		||||
  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
 | 
			
		||||
  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
 | 
			
		||||
  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
 | 
			
		||||
  // On Windows platform, '\' is the path separator, otherwise it is '/'.
 | 
			
		||||
  FilePath RemoveFileName() const;
 | 
			
		||||
 | 
			
		||||
  // Returns a copy of the FilePath with the case-insensitive extension removed.
 | 
			
		||||
  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
 | 
			
		||||
  // FilePath("dir/file"). If a case-insensitive extension is not
 | 
			
		||||
  // found, returns a copy of the original FilePath.
 | 
			
		||||
  FilePath RemoveExtension(const char* extension) const;
 | 
			
		||||
 | 
			
		||||
  // Creates directories so that path exists. Returns true if successful or if
 | 
			
		||||
  // the directories already exist; returns false if unable to create
 | 
			
		||||
  // directories for any reason. Will also return false if the FilePath does
 | 
			
		||||
  // not represent a directory (that is, it doesn't end with a path separator).
 | 
			
		||||
  bool CreateDirectoriesRecursively() const;
 | 
			
		||||
 | 
			
		||||
  // Create the directory so that path exists. Returns true if successful or
 | 
			
		||||
  // if the directory already exists; returns false if unable to create the
 | 
			
		||||
  // directory for any reason, including if the parent directory does not
 | 
			
		||||
  // exist. Not named "CreateDirectory" because that's a macro on Windows.
 | 
			
		||||
  bool CreateFolder() const;
 | 
			
		||||
 | 
			
		||||
  // Returns true if FilePath describes something in the file-system,
 | 
			
		||||
  // either a file, directory, or whatever, and that something exists.
 | 
			
		||||
  bool FileOrDirectoryExists() const;
 | 
			
		||||
 | 
			
		||||
  // Returns true if pathname describes a directory in the file-system
 | 
			
		||||
  // that exists.
 | 
			
		||||
  bool DirectoryExists() const;
 | 
			
		||||
 | 
			
		||||
  // Returns true if FilePath ends with a path separator, which indicates that
 | 
			
		||||
  // it is intended to represent a directory. Returns false otherwise.
 | 
			
		||||
  // This does NOT check that a directory (or file) actually exists.
 | 
			
		||||
  bool IsDirectory() const;
 | 
			
		||||
 | 
			
		||||
  // Returns true if pathname describes a root directory. (Windows has one
 | 
			
		||||
  // root directory per disk drive.)
 | 
			
		||||
  bool IsRootDirectory() const;
 | 
			
		||||
 | 
			
		||||
  // Returns true if pathname describes an absolute path.
 | 
			
		||||
  bool IsAbsolutePath() const;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // Replaces multiple consecutive separators with a single separator.
 | 
			
		||||
  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
 | 
			
		||||
  // redundancies that might be in a pathname involving "." or "..".
 | 
			
		||||
  //
 | 
			
		||||
  // A pathname with multiple consecutive separators may occur either through
 | 
			
		||||
  // user error or as a result of some scripts or APIs that generate a pathname
 | 
			
		||||
  // with a trailing separator. On other platforms the same API or script
 | 
			
		||||
  // may NOT generate a pathname with a trailing "/". Then elsewhere that
 | 
			
		||||
  // pathname may have another "/" and pathname components added to it,
 | 
			
		||||
  // without checking for the separator already being there.
 | 
			
		||||
  // The script language and operating system may allow paths like "foo//bar"
 | 
			
		||||
  // but some of the functions in FilePath will not handle that correctly. In
 | 
			
		||||
  // particular, RemoveTrailingPathSeparator() only removes one separator, and
 | 
			
		||||
  // it is called in CreateDirectoriesRecursively() assuming that it will change
 | 
			
		||||
  // a pathname from directory syntax (trailing separator) to filename syntax.
 | 
			
		||||
  //
 | 
			
		||||
  // On Windows this method also replaces the alternate path separator '/' with
 | 
			
		||||
  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
 | 
			
		||||
  // "bar\\foo".
 | 
			
		||||
 | 
			
		||||
  void Normalize();
 | 
			
		||||
 | 
			
		||||
  // Returns a pointer to the last occurence of a valid path separator in
 | 
			
		||||
  // the FilePath. On Windows, for example, both '/' and '\' are valid path
 | 
			
		||||
  // separators. Returns NULL if no path separator was found.
 | 
			
		||||
  const char* FindLastPathSeparator() const;
 | 
			
		||||
 | 
			
		||||
  std::string pathname_;
 | 
			
		||||
};  // class FilePath
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
 | 
			
		||||
							
								
								
									
										1238
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-internal.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1238
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-internal.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										243
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-linked_ptr.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-linked_ptr.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
			
		||||
// Copyright 2003 Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Authors: Dan Egnor (egnor@google.com)
 | 
			
		||||
//
 | 
			
		||||
// A "smart" pointer type with reference tracking.  Every pointer to a
 | 
			
		||||
// particular object is kept on a circular linked list.  When the last pointer
 | 
			
		||||
// to an object is destroyed or reassigned, the object is deleted.
 | 
			
		||||
//
 | 
			
		||||
// Used properly, this deletes the object when the last reference goes away.
 | 
			
		||||
// There are several caveats:
 | 
			
		||||
// - Like all reference counting schemes, cycles lead to leaks.
 | 
			
		||||
// - Each smart pointer is actually two pointers (8 bytes instead of 4).
 | 
			
		||||
// - Every time a pointer is assigned, the entire list of pointers to that
 | 
			
		||||
//   object is traversed.  This class is therefore NOT SUITABLE when there
 | 
			
		||||
//   will often be more than two or three pointers to a particular object.
 | 
			
		||||
// - References are only tracked as long as linked_ptr<> objects are copied.
 | 
			
		||||
//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
 | 
			
		||||
//   will happen (double deletion).
 | 
			
		||||
//
 | 
			
		||||
// A good use of this class is storing object references in STL containers.
 | 
			
		||||
// You can safely put linked_ptr<> in a vector<>.
 | 
			
		||||
// Other uses may not be as good.
 | 
			
		||||
//
 | 
			
		||||
// Note: If you use an incomplete type with linked_ptr<>, the class
 | 
			
		||||
// *containing* linked_ptr<> must have a constructor and destructor (even
 | 
			
		||||
// if they do nothing!).
 | 
			
		||||
//
 | 
			
		||||
// Bill Gibbons suggested we use something like this.
 | 
			
		||||
//
 | 
			
		||||
// Thread Safety:
 | 
			
		||||
//   Unlike other linked_ptr implementations, in this implementation
 | 
			
		||||
//   a linked_ptr object is thread-safe in the sense that:
 | 
			
		||||
//     - it's safe to copy linked_ptr objects concurrently,
 | 
			
		||||
//     - it's safe to copy *from* a linked_ptr and read its underlying
 | 
			
		||||
//       raw pointer (e.g. via get()) concurrently, and
 | 
			
		||||
//     - it's safe to write to two linked_ptrs that point to the same
 | 
			
		||||
//       shared object concurrently.
 | 
			
		||||
// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
 | 
			
		||||
// confusion with normal linked_ptr.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// Protects copying of all linked_ptr objects.
 | 
			
		||||
GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
 | 
			
		||||
 | 
			
		||||
// This is used internally by all instances of linked_ptr<>.  It needs to be
 | 
			
		||||
// a non-template class because different types of linked_ptr<> can refer to
 | 
			
		||||
// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
 | 
			
		||||
// So, it needs to be possible for different types of linked_ptr to participate
 | 
			
		||||
// in the same circular linked list, so we need a single class type here.
 | 
			
		||||
//
 | 
			
		||||
// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
 | 
			
		||||
class linked_ptr_internal {
 | 
			
		||||
 public:
 | 
			
		||||
  // Create a new circle that includes only this instance.
 | 
			
		||||
  void join_new() {
 | 
			
		||||
    next_ = this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Many linked_ptr operations may change p.link_ for some linked_ptr
 | 
			
		||||
  // variable p in the same circle as this object.  Therefore we need
 | 
			
		||||
  // to prevent two such operations from occurring concurrently.
 | 
			
		||||
  //
 | 
			
		||||
  // Note that different types of linked_ptr objects can coexist in a
 | 
			
		||||
  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
 | 
			
		||||
  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
 | 
			
		||||
  // protect all linked_ptr objects.  This can create serious
 | 
			
		||||
  // contention in production code, but is acceptable in a testing
 | 
			
		||||
  // framework.
 | 
			
		||||
 | 
			
		||||
  // Join an existing circle.
 | 
			
		||||
  void join(linked_ptr_internal const* ptr)
 | 
			
		||||
      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
 | 
			
		||||
    MutexLock lock(&g_linked_ptr_mutex);
 | 
			
		||||
 | 
			
		||||
    linked_ptr_internal const* p = ptr;
 | 
			
		||||
    while (p->next_ != ptr) {
 | 
			
		||||
      assert(p->next_ != this &&
 | 
			
		||||
             "Trying to join() a linked ring we are already in. "
 | 
			
		||||
             "Is GMock thread safety enabled?");
 | 
			
		||||
      p = p->next_;
 | 
			
		||||
    }
 | 
			
		||||
    p->next_ = this;
 | 
			
		||||
    next_ = ptr;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Leave whatever circle we're part of.  Returns true if we were the
 | 
			
		||||
  // last member of the circle.  Once this is done, you can join() another.
 | 
			
		||||
  bool depart()
 | 
			
		||||
      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
 | 
			
		||||
    MutexLock lock(&g_linked_ptr_mutex);
 | 
			
		||||
 | 
			
		||||
    if (next_ == this) return true;
 | 
			
		||||
    linked_ptr_internal const* p = next_;
 | 
			
		||||
    while (p->next_ != this) {
 | 
			
		||||
      assert(p->next_ != next_ &&
 | 
			
		||||
             "Trying to depart() a linked ring we are not in. "
 | 
			
		||||
             "Is GMock thread safety enabled?");
 | 
			
		||||
      p = p->next_;
 | 
			
		||||
    }
 | 
			
		||||
    p->next_ = next_;
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  mutable linked_ptr_internal const* next_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class linked_ptr {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T element_type;
 | 
			
		||||
 | 
			
		||||
  // Take over ownership of a raw pointer.  This should happen as soon as
 | 
			
		||||
  // possible after the object is created.
 | 
			
		||||
  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
 | 
			
		||||
  ~linked_ptr() { depart(); }
 | 
			
		||||
 | 
			
		||||
  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
 | 
			
		||||
  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
 | 
			
		||||
  linked_ptr(linked_ptr const& ptr) {  // NOLINT
 | 
			
		||||
    assert(&ptr != this);
 | 
			
		||||
    copy(&ptr);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Assignment releases the old value and acquires the new.
 | 
			
		||||
  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
 | 
			
		||||
    depart();
 | 
			
		||||
    copy(&ptr);
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  linked_ptr& operator=(linked_ptr const& ptr) {
 | 
			
		||||
    if (&ptr != this) {
 | 
			
		||||
      depart();
 | 
			
		||||
      copy(&ptr);
 | 
			
		||||
    }
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Smart pointer members.
 | 
			
		||||
  void reset(T* ptr = NULL) {
 | 
			
		||||
    depart();
 | 
			
		||||
    capture(ptr);
 | 
			
		||||
  }
 | 
			
		||||
  T* get() const { return value_; }
 | 
			
		||||
  T* operator->() const { return value_; }
 | 
			
		||||
  T& operator*() const { return *value_; }
 | 
			
		||||
 | 
			
		||||
  bool operator==(T* p) const { return value_ == p; }
 | 
			
		||||
  bool operator!=(T* p) const { return value_ != p; }
 | 
			
		||||
  template <typename U>
 | 
			
		||||
  bool operator==(linked_ptr<U> const& ptr) const {
 | 
			
		||||
    return value_ == ptr.get();
 | 
			
		||||
  }
 | 
			
		||||
  template <typename U>
 | 
			
		||||
  bool operator!=(linked_ptr<U> const& ptr) const {
 | 
			
		||||
    return value_ != ptr.get();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  template <typename U>
 | 
			
		||||
  friend class linked_ptr;
 | 
			
		||||
 | 
			
		||||
  T* value_;
 | 
			
		||||
  linked_ptr_internal link_;
 | 
			
		||||
 | 
			
		||||
  void depart() {
 | 
			
		||||
    if (link_.depart()) delete value_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void capture(T* ptr) {
 | 
			
		||||
    value_ = ptr;
 | 
			
		||||
    link_.join_new();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <typename U> void copy(linked_ptr<U> const* ptr) {
 | 
			
		||||
    value_ = ptr->get();
 | 
			
		||||
    if (value_)
 | 
			
		||||
      link_.join(&ptr->link_);
 | 
			
		||||
    else
 | 
			
		||||
      link_.join_new();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T> inline
 | 
			
		||||
bool operator==(T* ptr, const linked_ptr<T>& x) {
 | 
			
		||||
  return ptr == x.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T> inline
 | 
			
		||||
bool operator!=(T* ptr, const linked_ptr<T>& x) {
 | 
			
		||||
  return ptr != x.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A function to convert T* into linked_ptr<T>
 | 
			
		||||
// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
 | 
			
		||||
// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
 | 
			
		||||
template <typename T>
 | 
			
		||||
linked_ptr<T> make_linked_ptr(T* ptr) {
 | 
			
		||||
  return linked_ptr<T>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
 | 
			
		||||
							
								
								
									
										5146
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-param-util-generated.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5146
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-param-util-generated.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										286
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-param-util-generated.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-param-util-generated.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,286 @@
 | 
			
		||||
$$ -*- mode: c++; -*-
 | 
			
		||||
$var n = 50  $$ Maximum length of Values arguments we want to support.
 | 
			
		||||
$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
 | 
			
		||||
// Copyright 2008 Google Inc.
 | 
			
		||||
// All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// Type and function utilities for implementing parameterized tests.
 | 
			
		||||
// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
 | 
			
		||||
//
 | 
			
		||||
// Currently Google Test supports at most $n arguments in Values,
 | 
			
		||||
// and at most $maxtuple arguments in Combine. Please contact
 | 
			
		||||
// googletestframework@googlegroups.com if you need more.
 | 
			
		||||
// Please note that the number of arguments to Combine is limited
 | 
			
		||||
// by the maximum arity of the implementation of tuple which is
 | 
			
		||||
// currently set at $maxtuple.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
 | 
			
		||||
 | 
			
		||||
// scripts/fuse_gtest.py depends on gtest's own header being #included
 | 
			
		||||
// *unconditionally*.  Therefore these #includes cannot be moved
 | 
			
		||||
// inside #if GTEST_HAS_PARAM_TEST.
 | 
			
		||||
#include "gtest/internal/gtest-param-util.h"
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// Forward declarations of ValuesIn(), which is implemented in
 | 
			
		||||
// include/gtest/gtest-param-test.h.
 | 
			
		||||
template <typename ForwardIterator>
 | 
			
		||||
internal::ParamGenerator<
 | 
			
		||||
  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
 | 
			
		||||
ValuesIn(ForwardIterator begin, ForwardIterator end);
 | 
			
		||||
 | 
			
		||||
template <typename T, size_t N>
 | 
			
		||||
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
 | 
			
		||||
 | 
			
		||||
template <class Container>
 | 
			
		||||
internal::ParamGenerator<typename Container::value_type> ValuesIn(
 | 
			
		||||
    const Container& container);
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// Used in the Values() function to provide polymorphic capabilities.
 | 
			
		||||
$range i 1..n
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
 | 
			
		||||
template <$for j, [[typename T$j]]>
 | 
			
		||||
class ValueArray$i {
 | 
			
		||||
 public:
 | 
			
		||||
  $if i==1 [[explicit ]]ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
 | 
			
		||||
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  operator ParamGenerator<T>() const {
 | 
			
		||||
    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
 | 
			
		||||
    return ValuesIn(array);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // No implementation - assignment is unsupported.
 | 
			
		||||
  void operator=(const ValueArray$i& other);
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
 | 
			
		||||
  const T$j v$(j)_;
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
# if GTEST_HAS_COMBINE
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Generates values from the Cartesian product of values produced
 | 
			
		||||
// by the argument generators.
 | 
			
		||||
//
 | 
			
		||||
$range i 2..maxtuple
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
$range k 2..i
 | 
			
		||||
 | 
			
		||||
template <$for j, [[typename T$j]]>
 | 
			
		||||
class CartesianProductGenerator$i
 | 
			
		||||
    : public ParamGeneratorInterface< ::testing::tuple<$for j, [[T$j]]> > {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef ::testing::tuple<$for j, [[T$j]]> ParamType;
 | 
			
		||||
 | 
			
		||||
  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
 | 
			
		||||
      : $for j, [[g$(j)_(g$j)]] {}
 | 
			
		||||
  virtual ~CartesianProductGenerator$i() {}
 | 
			
		||||
 | 
			
		||||
  virtual ParamIteratorInterface<ParamType>* Begin() const {
 | 
			
		||||
    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
 | 
			
		||||
  }
 | 
			
		||||
  virtual ParamIteratorInterface<ParamType>* End() const {
 | 
			
		||||
    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  class Iterator : public ParamIteratorInterface<ParamType> {
 | 
			
		||||
   public:
 | 
			
		||||
    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
 | 
			
		||||
 | 
			
		||||
      const ParamGenerator<T$j>& g$j,
 | 
			
		||||
      const typename ParamGenerator<T$j>::iterator& current$(j)]])
 | 
			
		||||
        : base_(base),
 | 
			
		||||
$for j, [[
 | 
			
		||||
 | 
			
		||||
          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
 | 
			
		||||
]]    {
 | 
			
		||||
      ComputeCurrentValue();
 | 
			
		||||
    }
 | 
			
		||||
    virtual ~Iterator() {}
 | 
			
		||||
 | 
			
		||||
    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
 | 
			
		||||
      return base_;
 | 
			
		||||
    }
 | 
			
		||||
    // Advance should not be called on beyond-of-range iterators
 | 
			
		||||
    // so no component iterators must be beyond end of range, either.
 | 
			
		||||
    virtual void Advance() {
 | 
			
		||||
      assert(!AtEnd());
 | 
			
		||||
      ++current$(i)_;
 | 
			
		||||
 | 
			
		||||
$for k [[
 | 
			
		||||
      if (current$(i+2-k)_ == end$(i+2-k)_) {
 | 
			
		||||
        current$(i+2-k)_ = begin$(i+2-k)_;
 | 
			
		||||
        ++current$(i+2-k-1)_;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
      ComputeCurrentValue();
 | 
			
		||||
    }
 | 
			
		||||
    virtual ParamIteratorInterface<ParamType>* Clone() const {
 | 
			
		||||
      return new Iterator(*this);
 | 
			
		||||
    }
 | 
			
		||||
    virtual const ParamType* Current() const { return ¤t_value_; }
 | 
			
		||||
    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
 | 
			
		||||
      // Having the same base generator guarantees that the other
 | 
			
		||||
      // iterator is of the same type and we can downcast.
 | 
			
		||||
      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | 
			
		||||
          << "The program attempted to compare iterators "
 | 
			
		||||
          << "from different generators." << std::endl;
 | 
			
		||||
      const Iterator* typed_other =
 | 
			
		||||
          CheckedDowncastToActualType<const Iterator>(&other);
 | 
			
		||||
      // We must report iterators equal if they both point beyond their
 | 
			
		||||
      // respective ranges. That can happen in a variety of fashions,
 | 
			
		||||
      // so we have to consult AtEnd().
 | 
			
		||||
      return (AtEnd() && typed_other->AtEnd()) ||
 | 
			
		||||
         ($for j  && [[
 | 
			
		||||
 | 
			
		||||
          current$(j)_ == typed_other->current$(j)_
 | 
			
		||||
]]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    Iterator(const Iterator& other)
 | 
			
		||||
        : base_(other.base_), $for j, [[
 | 
			
		||||
 | 
			
		||||
        begin$(j)_(other.begin$(j)_),
 | 
			
		||||
        end$(j)_(other.end$(j)_),
 | 
			
		||||
        current$(j)_(other.current$(j)_)
 | 
			
		||||
]] {
 | 
			
		||||
      ComputeCurrentValue();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void ComputeCurrentValue() {
 | 
			
		||||
      if (!AtEnd())
 | 
			
		||||
        current_value_ = ParamType($for j, [[*current$(j)_]]);
 | 
			
		||||
    }
 | 
			
		||||
    bool AtEnd() const {
 | 
			
		||||
      // We must report iterator past the end of the range when either of the
 | 
			
		||||
      // component iterators has reached the end of its range.
 | 
			
		||||
      return
 | 
			
		||||
$for j  || [[
 | 
			
		||||
 | 
			
		||||
          current$(j)_ == end$(j)_
 | 
			
		||||
]];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // No implementation - assignment is unsupported.
 | 
			
		||||
    void operator=(const Iterator& other);
 | 
			
		||||
 | 
			
		||||
    const ParamGeneratorInterface<ParamType>* const base_;
 | 
			
		||||
    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
 | 
			
		||||
    // current[i]_ is the actual traversing iterator.
 | 
			
		||||
$for j [[
 | 
			
		||||
 | 
			
		||||
    const typename ParamGenerator<T$j>::iterator begin$(j)_;
 | 
			
		||||
    const typename ParamGenerator<T$j>::iterator end$(j)_;
 | 
			
		||||
    typename ParamGenerator<T$j>::iterator current$(j)_;
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
    ParamType current_value_;
 | 
			
		||||
  };  // class CartesianProductGenerator$i::Iterator
 | 
			
		||||
 | 
			
		||||
  // No implementation - assignment is unsupported.
 | 
			
		||||
  void operator=(const CartesianProductGenerator$i& other);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
  const ParamGenerator<T$j> g$(j)_;
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
};  // class CartesianProductGenerator$i
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Helper classes providing Combine() with polymorphic features. They allow
 | 
			
		||||
// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
 | 
			
		||||
// convertible to U.
 | 
			
		||||
//
 | 
			
		||||
$range i 2..maxtuple
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
 | 
			
		||||
template <$for j, [[class Generator$j]]>
 | 
			
		||||
class CartesianProductHolder$i {
 | 
			
		||||
 public:
 | 
			
		||||
CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
 | 
			
		||||
      : $for j, [[g$(j)_(g$j)]] {}
 | 
			
		||||
  template <$for j, [[typename T$j]]>
 | 
			
		||||
  operator ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >() const {
 | 
			
		||||
    return ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >(
 | 
			
		||||
        new CartesianProductGenerator$i<$for j, [[T$j]]>(
 | 
			
		||||
$for j,[[
 | 
			
		||||
 | 
			
		||||
        static_cast<ParamGenerator<T$j> >(g$(j)_)
 | 
			
		||||
]]));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // No implementation - assignment is unsupported.
 | 
			
		||||
  void operator=(const CartesianProductHolder$i& other);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
  const Generator$j g$(j)_;
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
};  // class CartesianProductHolder$i
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
# endif  // GTEST_HAS_COMBINE
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  //  GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
 | 
			
		||||
							
								
								
									
										731
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-param-util.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										731
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-param-util.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,731 @@
 | 
			
		||||
// Copyright 2008 Google Inc.
 | 
			
		||||
// All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// Type and function utilities for implementing parameterized tests.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
// scripts/fuse_gtest.py depends on gtest's own header being #included
 | 
			
		||||
// *unconditionally*.  Therefore these #includes cannot be moved
 | 
			
		||||
// inside #if GTEST_HAS_PARAM_TEST.
 | 
			
		||||
#include "gtest/internal/gtest-internal.h"
 | 
			
		||||
#include "gtest/internal/gtest-linked_ptr.h"
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
#include "gtest/gtest-printers.h"
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
 | 
			
		||||
// Input to a parameterized test name generator, describing a test parameter.
 | 
			
		||||
// Consists of the parameter value and the integer parameter index.
 | 
			
		||||
template <class ParamType>
 | 
			
		||||
struct TestParamInfo {
 | 
			
		||||
  TestParamInfo(const ParamType& a_param, size_t an_index) :
 | 
			
		||||
    param(a_param),
 | 
			
		||||
    index(an_index) {}
 | 
			
		||||
  ParamType param;
 | 
			
		||||
  size_t index;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A builtin parameterized test name generator which returns the result of
 | 
			
		||||
// testing::PrintToString.
 | 
			
		||||
struct PrintToStringParamName {
 | 
			
		||||
  template <class ParamType>
 | 
			
		||||
  std::string operator()(const TestParamInfo<ParamType>& info) const {
 | 
			
		||||
    return PrintToString(info.param);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Outputs a message explaining invalid registration of different
 | 
			
		||||
// fixture class for the same test case. This may happen when
 | 
			
		||||
// TEST_P macro is used to define two tests with the same name
 | 
			
		||||
// but in different namespaces.
 | 
			
		||||
GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
 | 
			
		||||
                                          CodeLocation code_location);
 | 
			
		||||
 | 
			
		||||
template <typename> class ParamGeneratorInterface;
 | 
			
		||||
template <typename> class ParamGenerator;
 | 
			
		||||
 | 
			
		||||
// Interface for iterating over elements provided by an implementation
 | 
			
		||||
// of ParamGeneratorInterface<T>.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class ParamIteratorInterface {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~ParamIteratorInterface() {}
 | 
			
		||||
  // A pointer to the base generator instance.
 | 
			
		||||
  // Used only for the purposes of iterator comparison
 | 
			
		||||
  // to make sure that two iterators belong to the same generator.
 | 
			
		||||
  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
 | 
			
		||||
  // Advances iterator to point to the next element
 | 
			
		||||
  // provided by the generator. The caller is responsible
 | 
			
		||||
  // for not calling Advance() on an iterator equal to
 | 
			
		||||
  // BaseGenerator()->End().
 | 
			
		||||
  virtual void Advance() = 0;
 | 
			
		||||
  // Clones the iterator object. Used for implementing copy semantics
 | 
			
		||||
  // of ParamIterator<T>.
 | 
			
		||||
  virtual ParamIteratorInterface* Clone() const = 0;
 | 
			
		||||
  // Dereferences the current iterator and provides (read-only) access
 | 
			
		||||
  // to the pointed value. It is the caller's responsibility not to call
 | 
			
		||||
  // Current() on an iterator equal to BaseGenerator()->End().
 | 
			
		||||
  // Used for implementing ParamGenerator<T>::operator*().
 | 
			
		||||
  virtual const T* Current() const = 0;
 | 
			
		||||
  // Determines whether the given iterator and other point to the same
 | 
			
		||||
  // element in the sequence generated by the generator.
 | 
			
		||||
  // Used for implementing ParamGenerator<T>::operator==().
 | 
			
		||||
  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Class iterating over elements provided by an implementation of
 | 
			
		||||
// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
 | 
			
		||||
// and implements the const forward iterator concept.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class ParamIterator {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T value_type;
 | 
			
		||||
  typedef const T& reference;
 | 
			
		||||
  typedef ptrdiff_t difference_type;
 | 
			
		||||
 | 
			
		||||
  // ParamIterator assumes ownership of the impl_ pointer.
 | 
			
		||||
  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
 | 
			
		||||
  ParamIterator& operator=(const ParamIterator& other) {
 | 
			
		||||
    if (this != &other)
 | 
			
		||||
      impl_.reset(other.impl_->Clone());
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const T& operator*() const { return *impl_->Current(); }
 | 
			
		||||
  const T* operator->() const { return impl_->Current(); }
 | 
			
		||||
  // Prefix version of operator++.
 | 
			
		||||
  ParamIterator& operator++() {
 | 
			
		||||
    impl_->Advance();
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
  // Postfix version of operator++.
 | 
			
		||||
  ParamIterator operator++(int /*unused*/) {
 | 
			
		||||
    ParamIteratorInterface<T>* clone = impl_->Clone();
 | 
			
		||||
    impl_->Advance();
 | 
			
		||||
    return ParamIterator(clone);
 | 
			
		||||
  }
 | 
			
		||||
  bool operator==(const ParamIterator& other) const {
 | 
			
		||||
    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
 | 
			
		||||
  }
 | 
			
		||||
  bool operator!=(const ParamIterator& other) const {
 | 
			
		||||
    return !(*this == other);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  friend class ParamGenerator<T>;
 | 
			
		||||
  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
 | 
			
		||||
  scoped_ptr<ParamIteratorInterface<T> > impl_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// ParamGeneratorInterface<T> is the binary interface to access generators
 | 
			
		||||
// defined in other translation units.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class ParamGeneratorInterface {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T ParamType;
 | 
			
		||||
 | 
			
		||||
  virtual ~ParamGeneratorInterface() {}
 | 
			
		||||
 | 
			
		||||
  // Generator interface definition
 | 
			
		||||
  virtual ParamIteratorInterface<T>* Begin() const = 0;
 | 
			
		||||
  virtual ParamIteratorInterface<T>* End() const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Wraps ParamGeneratorInterface<T> and provides general generator syntax
 | 
			
		||||
// compatible with the STL Container concept.
 | 
			
		||||
// This class implements copy initialization semantics and the contained
 | 
			
		||||
// ParamGeneratorInterface<T> instance is shared among all copies
 | 
			
		||||
// of the original object. This is possible because that instance is immutable.
 | 
			
		||||
template<typename T>
 | 
			
		||||
class ParamGenerator {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef ParamIterator<T> iterator;
 | 
			
		||||
 | 
			
		||||
  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
 | 
			
		||||
  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
 | 
			
		||||
 | 
			
		||||
  ParamGenerator& operator=(const ParamGenerator& other) {
 | 
			
		||||
    impl_ = other.impl_;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  iterator begin() const { return iterator(impl_->Begin()); }
 | 
			
		||||
  iterator end() const { return iterator(impl_->End()); }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  linked_ptr<const ParamGeneratorInterface<T> > impl_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Generates values from a range of two comparable values. Can be used to
 | 
			
		||||
// generate sequences of user-defined types that implement operator+() and
 | 
			
		||||
// operator<().
 | 
			
		||||
// This class is used in the Range() function.
 | 
			
		||||
template <typename T, typename IncrementT>
 | 
			
		||||
class RangeGenerator : public ParamGeneratorInterface<T> {
 | 
			
		||||
 public:
 | 
			
		||||
  RangeGenerator(T begin, T end, IncrementT step)
 | 
			
		||||
      : begin_(begin), end_(end),
 | 
			
		||||
        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
 | 
			
		||||
  virtual ~RangeGenerator() {}
 | 
			
		||||
 | 
			
		||||
  virtual ParamIteratorInterface<T>* Begin() const {
 | 
			
		||||
    return new Iterator(this, begin_, 0, step_);
 | 
			
		||||
  }
 | 
			
		||||
  virtual ParamIteratorInterface<T>* End() const {
 | 
			
		||||
    return new Iterator(this, end_, end_index_, step_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  class Iterator : public ParamIteratorInterface<T> {
 | 
			
		||||
   public:
 | 
			
		||||
    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
 | 
			
		||||
             IncrementT step)
 | 
			
		||||
        : base_(base), value_(value), index_(index), step_(step) {}
 | 
			
		||||
    virtual ~Iterator() {}
 | 
			
		||||
 | 
			
		||||
    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
 | 
			
		||||
      return base_;
 | 
			
		||||
    }
 | 
			
		||||
    virtual void Advance() {
 | 
			
		||||
      value_ = static_cast<T>(value_ + step_);
 | 
			
		||||
      index_++;
 | 
			
		||||
    }
 | 
			
		||||
    virtual ParamIteratorInterface<T>* Clone() const {
 | 
			
		||||
      return new Iterator(*this);
 | 
			
		||||
    }
 | 
			
		||||
    virtual const T* Current() const { return &value_; }
 | 
			
		||||
    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
 | 
			
		||||
      // Having the same base generator guarantees that the other
 | 
			
		||||
      // iterator is of the same type and we can downcast.
 | 
			
		||||
      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | 
			
		||||
          << "The program attempted to compare iterators "
 | 
			
		||||
          << "from different generators." << std::endl;
 | 
			
		||||
      const int other_index =
 | 
			
		||||
          CheckedDowncastToActualType<const Iterator>(&other)->index_;
 | 
			
		||||
      return index_ == other_index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    Iterator(const Iterator& other)
 | 
			
		||||
        : ParamIteratorInterface<T>(),
 | 
			
		||||
          base_(other.base_), value_(other.value_), index_(other.index_),
 | 
			
		||||
          step_(other.step_) {}
 | 
			
		||||
 | 
			
		||||
    // No implementation - assignment is unsupported.
 | 
			
		||||
    void operator=(const Iterator& other);
 | 
			
		||||
 | 
			
		||||
    const ParamGeneratorInterface<T>* const base_;
 | 
			
		||||
    T value_;
 | 
			
		||||
    int index_;
 | 
			
		||||
    const IncrementT step_;
 | 
			
		||||
  };  // class RangeGenerator::Iterator
 | 
			
		||||
 | 
			
		||||
  static int CalculateEndIndex(const T& begin,
 | 
			
		||||
                               const T& end,
 | 
			
		||||
                               const IncrementT& step) {
 | 
			
		||||
    int end_index = 0;
 | 
			
		||||
    for (T i = begin; i < end; i = static_cast<T>(i + step))
 | 
			
		||||
      end_index++;
 | 
			
		||||
    return end_index;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // No implementation - assignment is unsupported.
 | 
			
		||||
  void operator=(const RangeGenerator& other);
 | 
			
		||||
 | 
			
		||||
  const T begin_;
 | 
			
		||||
  const T end_;
 | 
			
		||||
  const IncrementT step_;
 | 
			
		||||
  // The index for the end() iterator. All the elements in the generated
 | 
			
		||||
  // sequence are indexed (0-based) to aid iterator comparison.
 | 
			
		||||
  const int end_index_;
 | 
			
		||||
};  // class RangeGenerator
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Generates values from a pair of STL-style iterators. Used in the
 | 
			
		||||
// ValuesIn() function. The elements are copied from the source range
 | 
			
		||||
// since the source can be located on the stack, and the generator
 | 
			
		||||
// is likely to persist beyond that stack frame.
 | 
			
		||||
template <typename T>
 | 
			
		||||
class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
 | 
			
		||||
 public:
 | 
			
		||||
  template <typename ForwardIterator>
 | 
			
		||||
  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
 | 
			
		||||
      : container_(begin, end) {}
 | 
			
		||||
  virtual ~ValuesInIteratorRangeGenerator() {}
 | 
			
		||||
 | 
			
		||||
  virtual ParamIteratorInterface<T>* Begin() const {
 | 
			
		||||
    return new Iterator(this, container_.begin());
 | 
			
		||||
  }
 | 
			
		||||
  virtual ParamIteratorInterface<T>* End() const {
 | 
			
		||||
    return new Iterator(this, container_.end());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  typedef typename ::std::vector<T> ContainerType;
 | 
			
		||||
 | 
			
		||||
  class Iterator : public ParamIteratorInterface<T> {
 | 
			
		||||
   public:
 | 
			
		||||
    Iterator(const ParamGeneratorInterface<T>* base,
 | 
			
		||||
             typename ContainerType::const_iterator iterator)
 | 
			
		||||
        : base_(base), iterator_(iterator) {}
 | 
			
		||||
    virtual ~Iterator() {}
 | 
			
		||||
 | 
			
		||||
    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
 | 
			
		||||
      return base_;
 | 
			
		||||
    }
 | 
			
		||||
    virtual void Advance() {
 | 
			
		||||
      ++iterator_;
 | 
			
		||||
      value_.reset();
 | 
			
		||||
    }
 | 
			
		||||
    virtual ParamIteratorInterface<T>* Clone() const {
 | 
			
		||||
      return new Iterator(*this);
 | 
			
		||||
    }
 | 
			
		||||
    // We need to use cached value referenced by iterator_ because *iterator_
 | 
			
		||||
    // can return a temporary object (and of type other then T), so just
 | 
			
		||||
    // having "return &*iterator_;" doesn't work.
 | 
			
		||||
    // value_ is updated here and not in Advance() because Advance()
 | 
			
		||||
    // can advance iterator_ beyond the end of the range, and we cannot
 | 
			
		||||
    // detect that fact. The client code, on the other hand, is
 | 
			
		||||
    // responsible for not calling Current() on an out-of-range iterator.
 | 
			
		||||
    virtual const T* Current() const {
 | 
			
		||||
      if (value_.get() == NULL)
 | 
			
		||||
        value_.reset(new T(*iterator_));
 | 
			
		||||
      return value_.get();
 | 
			
		||||
    }
 | 
			
		||||
    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
 | 
			
		||||
      // Having the same base generator guarantees that the other
 | 
			
		||||
      // iterator is of the same type and we can downcast.
 | 
			
		||||
      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
 | 
			
		||||
          << "The program attempted to compare iterators "
 | 
			
		||||
          << "from different generators." << std::endl;
 | 
			
		||||
      return iterator_ ==
 | 
			
		||||
          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    Iterator(const Iterator& other)
 | 
			
		||||
          // The explicit constructor call suppresses a false warning
 | 
			
		||||
          // emitted by gcc when supplied with the -Wextra option.
 | 
			
		||||
        : ParamIteratorInterface<T>(),
 | 
			
		||||
          base_(other.base_),
 | 
			
		||||
          iterator_(other.iterator_) {}
 | 
			
		||||
 | 
			
		||||
    const ParamGeneratorInterface<T>* const base_;
 | 
			
		||||
    typename ContainerType::const_iterator iterator_;
 | 
			
		||||
    // A cached value of *iterator_. We keep it here to allow access by
 | 
			
		||||
    // pointer in the wrapping iterator's operator->().
 | 
			
		||||
    // value_ needs to be mutable to be accessed in Current().
 | 
			
		||||
    // Use of scoped_ptr helps manage cached value's lifetime,
 | 
			
		||||
    // which is bound by the lifespan of the iterator itself.
 | 
			
		||||
    mutable scoped_ptr<const T> value_;
 | 
			
		||||
  };  // class ValuesInIteratorRangeGenerator::Iterator
 | 
			
		||||
 | 
			
		||||
  // No implementation - assignment is unsupported.
 | 
			
		||||
  void operator=(const ValuesInIteratorRangeGenerator& other);
 | 
			
		||||
 | 
			
		||||
  const ContainerType container_;
 | 
			
		||||
};  // class ValuesInIteratorRangeGenerator
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Default parameterized test name generator, returns a string containing the
 | 
			
		||||
// integer test parameter index.
 | 
			
		||||
template <class ParamType>
 | 
			
		||||
std::string DefaultParamName(const TestParamInfo<ParamType>& info) {
 | 
			
		||||
  Message name_stream;
 | 
			
		||||
  name_stream << info.index;
 | 
			
		||||
  return name_stream.GetString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Parameterized test name overload helpers, which help the
 | 
			
		||||
// INSTANTIATE_TEST_CASE_P macro choose between the default parameterized
 | 
			
		||||
// test name generator and user param name generator.
 | 
			
		||||
template <class ParamType, class ParamNameGenFunctor>
 | 
			
		||||
ParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func) {
 | 
			
		||||
  return func;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class ParamType>
 | 
			
		||||
struct ParamNameGenFunc {
 | 
			
		||||
  typedef std::string Type(const TestParamInfo<ParamType>&);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class ParamType>
 | 
			
		||||
typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() {
 | 
			
		||||
  return DefaultParamName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// Stores a parameter value and later creates tests parameterized with that
 | 
			
		||||
// value.
 | 
			
		||||
template <class TestClass>
 | 
			
		||||
class ParameterizedTestFactory : public TestFactoryBase {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef typename TestClass::ParamType ParamType;
 | 
			
		||||
  explicit ParameterizedTestFactory(ParamType parameter) :
 | 
			
		||||
      parameter_(parameter) {}
 | 
			
		||||
  virtual Test* CreateTest() {
 | 
			
		||||
    TestClass::SetParam(¶meter_);
 | 
			
		||||
    return new TestClass();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  const ParamType parameter_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// TestMetaFactoryBase is a base class for meta-factories that create
 | 
			
		||||
// test factories for passing into MakeAndRegisterTestInfo function.
 | 
			
		||||
template <class ParamType>
 | 
			
		||||
class TestMetaFactoryBase {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~TestMetaFactoryBase() {}
 | 
			
		||||
 | 
			
		||||
  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// TestMetaFactory creates test factories for passing into
 | 
			
		||||
// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
 | 
			
		||||
// ownership of test factory pointer, same factory object cannot be passed
 | 
			
		||||
// into that method twice. But ParameterizedTestCaseInfo is going to call
 | 
			
		||||
// it for each Test/Parameter value combination. Thus it needs meta factory
 | 
			
		||||
// creator class.
 | 
			
		||||
template <class TestCase>
 | 
			
		||||
class TestMetaFactory
 | 
			
		||||
    : public TestMetaFactoryBase<typename TestCase::ParamType> {
 | 
			
		||||
 public:
 | 
			
		||||
  typedef typename TestCase::ParamType ParamType;
 | 
			
		||||
 | 
			
		||||
  TestMetaFactory() {}
 | 
			
		||||
 | 
			
		||||
  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
 | 
			
		||||
    return new ParameterizedTestFactory<TestCase>(parameter);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// ParameterizedTestCaseInfoBase is a generic interface
 | 
			
		||||
// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
 | 
			
		||||
// accumulates test information provided by TEST_P macro invocations
 | 
			
		||||
// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
 | 
			
		||||
// and uses that information to register all resulting test instances
 | 
			
		||||
// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
 | 
			
		||||
// a collection of pointers to the ParameterizedTestCaseInfo objects
 | 
			
		||||
// and calls RegisterTests() on each of them when asked.
 | 
			
		||||
class ParameterizedTestCaseInfoBase {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual ~ParameterizedTestCaseInfoBase() {}
 | 
			
		||||
 | 
			
		||||
  // Base part of test case name for display purposes.
 | 
			
		||||
  virtual const string& GetTestCaseName() const = 0;
 | 
			
		||||
  // Test case id to verify identity.
 | 
			
		||||
  virtual TypeId GetTestCaseTypeId() const = 0;
 | 
			
		||||
  // UnitTest class invokes this method to register tests in this
 | 
			
		||||
  // test case right before running them in RUN_ALL_TESTS macro.
 | 
			
		||||
  // This method should not be called more then once on any single
 | 
			
		||||
  // instance of a ParameterizedTestCaseInfoBase derived class.
 | 
			
		||||
  virtual void RegisterTests() = 0;
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  ParameterizedTestCaseInfoBase() {}
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
 | 
			
		||||
// macro invocations for a particular test case and generators
 | 
			
		||||
// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
 | 
			
		||||
// test case. It registers tests with all values generated by all
 | 
			
		||||
// generators when asked.
 | 
			
		||||
template <class TestCase>
 | 
			
		||||
class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
 | 
			
		||||
 public:
 | 
			
		||||
  // ParamType and GeneratorCreationFunc are private types but are required
 | 
			
		||||
  // for declarations of public methods AddTestPattern() and
 | 
			
		||||
  // AddTestCaseInstantiation().
 | 
			
		||||
  typedef typename TestCase::ParamType ParamType;
 | 
			
		||||
  // A function that returns an instance of appropriate generator type.
 | 
			
		||||
  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
 | 
			
		||||
  typedef typename ParamNameGenFunc<ParamType>::Type ParamNameGeneratorFunc;
 | 
			
		||||
 | 
			
		||||
  explicit ParameterizedTestCaseInfo(
 | 
			
		||||
      const char* name, CodeLocation code_location)
 | 
			
		||||
      : test_case_name_(name), code_location_(code_location) {}
 | 
			
		||||
 | 
			
		||||
  // Test case base name for display purposes.
 | 
			
		||||
  virtual const string& GetTestCaseName() const { return test_case_name_; }
 | 
			
		||||
  // Test case id to verify identity.
 | 
			
		||||
  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
 | 
			
		||||
  // TEST_P macro uses AddTestPattern() to record information
 | 
			
		||||
  // about a single test in a LocalTestInfo structure.
 | 
			
		||||
  // test_case_name is the base name of the test case (without invocation
 | 
			
		||||
  // prefix). test_base_name is the name of an individual test without
 | 
			
		||||
  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
 | 
			
		||||
  // test case base name and DoBar is test base name.
 | 
			
		||||
  void AddTestPattern(const char* test_case_name,
 | 
			
		||||
                      const char* test_base_name,
 | 
			
		||||
                      TestMetaFactoryBase<ParamType>* meta_factory) {
 | 
			
		||||
    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
 | 
			
		||||
                                                       test_base_name,
 | 
			
		||||
                                                       meta_factory)));
 | 
			
		||||
  }
 | 
			
		||||
  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
 | 
			
		||||
  // about a generator.
 | 
			
		||||
  int AddTestCaseInstantiation(const string& instantiation_name,
 | 
			
		||||
                               GeneratorCreationFunc* func,
 | 
			
		||||
                               ParamNameGeneratorFunc* name_func,
 | 
			
		||||
                               const char* file,
 | 
			
		||||
                               int line) {
 | 
			
		||||
    instantiations_.push_back(
 | 
			
		||||
        InstantiationInfo(instantiation_name, func, name_func, file, line));
 | 
			
		||||
    return 0;  // Return value used only to run this method in namespace scope.
 | 
			
		||||
  }
 | 
			
		||||
  // UnitTest class invokes this method to register tests in this test case
 | 
			
		||||
  // test cases right before running tests in RUN_ALL_TESTS macro.
 | 
			
		||||
  // This method should not be called more then once on any single
 | 
			
		||||
  // instance of a ParameterizedTestCaseInfoBase derived class.
 | 
			
		||||
  // UnitTest has a guard to prevent from calling this method more then once.
 | 
			
		||||
  virtual void RegisterTests() {
 | 
			
		||||
    for (typename TestInfoContainer::iterator test_it = tests_.begin();
 | 
			
		||||
         test_it != tests_.end(); ++test_it) {
 | 
			
		||||
      linked_ptr<TestInfo> test_info = *test_it;
 | 
			
		||||
      for (typename InstantiationContainer::iterator gen_it =
 | 
			
		||||
               instantiations_.begin(); gen_it != instantiations_.end();
 | 
			
		||||
               ++gen_it) {
 | 
			
		||||
        const string& instantiation_name = gen_it->name;
 | 
			
		||||
        ParamGenerator<ParamType> generator((*gen_it->generator)());
 | 
			
		||||
        ParamNameGeneratorFunc* name_func = gen_it->name_func;
 | 
			
		||||
        const char* file = gen_it->file;
 | 
			
		||||
        int line = gen_it->line;
 | 
			
		||||
 | 
			
		||||
        string test_case_name;
 | 
			
		||||
        if ( !instantiation_name.empty() )
 | 
			
		||||
          test_case_name = instantiation_name + "/";
 | 
			
		||||
        test_case_name += test_info->test_case_base_name;
 | 
			
		||||
 | 
			
		||||
        size_t i = 0;
 | 
			
		||||
        std::set<std::string> test_param_names;
 | 
			
		||||
        for (typename ParamGenerator<ParamType>::iterator param_it =
 | 
			
		||||
                 generator.begin();
 | 
			
		||||
             param_it != generator.end(); ++param_it, ++i) {
 | 
			
		||||
          Message test_name_stream;
 | 
			
		||||
 | 
			
		||||
          std::string param_name = name_func(
 | 
			
		||||
              TestParamInfo<ParamType>(*param_it, i));
 | 
			
		||||
 | 
			
		||||
          GTEST_CHECK_(IsValidParamName(param_name))
 | 
			
		||||
              << "Parameterized test name '" << param_name
 | 
			
		||||
              << "' is invalid, in " << file
 | 
			
		||||
              << " line " << line << std::endl;
 | 
			
		||||
 | 
			
		||||
          GTEST_CHECK_(test_param_names.count(param_name) == 0)
 | 
			
		||||
              << "Duplicate parameterized test name '" << param_name
 | 
			
		||||
              << "', in " << file << " line " << line << std::endl;
 | 
			
		||||
 | 
			
		||||
          test_param_names.insert(param_name);
 | 
			
		||||
 | 
			
		||||
          test_name_stream << test_info->test_base_name << "/" << param_name;
 | 
			
		||||
          MakeAndRegisterTestInfo(
 | 
			
		||||
              test_case_name.c_str(),
 | 
			
		||||
              test_name_stream.GetString().c_str(),
 | 
			
		||||
              NULL,  // No type parameter.
 | 
			
		||||
              PrintToString(*param_it).c_str(),
 | 
			
		||||
              code_location_,
 | 
			
		||||
              GetTestCaseTypeId(),
 | 
			
		||||
              TestCase::SetUpTestCase,
 | 
			
		||||
              TestCase::TearDownTestCase,
 | 
			
		||||
              test_info->test_meta_factory->CreateTestFactory(*param_it));
 | 
			
		||||
        }  // for param_it
 | 
			
		||||
      }  // for gen_it
 | 
			
		||||
    }  // for test_it
 | 
			
		||||
  }  // RegisterTests
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // LocalTestInfo structure keeps information about a single test registered
 | 
			
		||||
  // with TEST_P macro.
 | 
			
		||||
  struct TestInfo {
 | 
			
		||||
    TestInfo(const char* a_test_case_base_name,
 | 
			
		||||
             const char* a_test_base_name,
 | 
			
		||||
             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
 | 
			
		||||
        test_case_base_name(a_test_case_base_name),
 | 
			
		||||
        test_base_name(a_test_base_name),
 | 
			
		||||
        test_meta_factory(a_test_meta_factory) {}
 | 
			
		||||
 | 
			
		||||
    const string test_case_base_name;
 | 
			
		||||
    const string test_base_name;
 | 
			
		||||
    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
 | 
			
		||||
  };
 | 
			
		||||
  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
 | 
			
		||||
  // Records data received from INSTANTIATE_TEST_CASE_P macros:
 | 
			
		||||
  //  <Instantiation name, Sequence generator creation function,
 | 
			
		||||
  //     Name generator function, Source file, Source line>
 | 
			
		||||
  struct InstantiationInfo {
 | 
			
		||||
      InstantiationInfo(const std::string &name_in,
 | 
			
		||||
                        GeneratorCreationFunc* generator_in,
 | 
			
		||||
                        ParamNameGeneratorFunc* name_func_in,
 | 
			
		||||
                        const char* file_in,
 | 
			
		||||
                        int line_in)
 | 
			
		||||
          : name(name_in),
 | 
			
		||||
            generator(generator_in),
 | 
			
		||||
            name_func(name_func_in),
 | 
			
		||||
            file(file_in),
 | 
			
		||||
            line(line_in) {}
 | 
			
		||||
 | 
			
		||||
      std::string name;
 | 
			
		||||
      GeneratorCreationFunc* generator;
 | 
			
		||||
      ParamNameGeneratorFunc* name_func;
 | 
			
		||||
      const char* file;
 | 
			
		||||
      int line;
 | 
			
		||||
  };
 | 
			
		||||
  typedef ::std::vector<InstantiationInfo> InstantiationContainer;
 | 
			
		||||
 | 
			
		||||
  static bool IsValidParamName(const std::string& name) {
 | 
			
		||||
    // Check for empty string
 | 
			
		||||
    if (name.empty())
 | 
			
		||||
      return false;
 | 
			
		||||
 | 
			
		||||
    // Check for invalid characters
 | 
			
		||||
    for (std::string::size_type index = 0; index < name.size(); ++index) {
 | 
			
		||||
      if (!isalnum(name[index]) && name[index] != '_')
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const string test_case_name_;
 | 
			
		||||
  CodeLocation code_location_;
 | 
			
		||||
  TestInfoContainer tests_;
 | 
			
		||||
  InstantiationContainer instantiations_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
 | 
			
		||||
};  // class ParameterizedTestCaseInfo
 | 
			
		||||
 | 
			
		||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
 | 
			
		||||
//
 | 
			
		||||
// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
 | 
			
		||||
// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
 | 
			
		||||
// macros use it to locate their corresponding ParameterizedTestCaseInfo
 | 
			
		||||
// descriptors.
 | 
			
		||||
class ParameterizedTestCaseRegistry {
 | 
			
		||||
 public:
 | 
			
		||||
  ParameterizedTestCaseRegistry() {}
 | 
			
		||||
  ~ParameterizedTestCaseRegistry() {
 | 
			
		||||
    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
 | 
			
		||||
         it != test_case_infos_.end(); ++it) {
 | 
			
		||||
      delete *it;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Looks up or creates and returns a structure containing information about
 | 
			
		||||
  // tests and instantiations of a particular test case.
 | 
			
		||||
  template <class TestCase>
 | 
			
		||||
  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
 | 
			
		||||
      const char* test_case_name,
 | 
			
		||||
      CodeLocation code_location) {
 | 
			
		||||
    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
 | 
			
		||||
    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
 | 
			
		||||
         it != test_case_infos_.end(); ++it) {
 | 
			
		||||
      if ((*it)->GetTestCaseName() == test_case_name) {
 | 
			
		||||
        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
 | 
			
		||||
          // Complain about incorrect usage of Google Test facilities
 | 
			
		||||
          // and terminate the program since we cannot guaranty correct
 | 
			
		||||
          // test case setup and tear-down in this case.
 | 
			
		||||
          ReportInvalidTestCaseType(test_case_name, code_location);
 | 
			
		||||
          posix::Abort();
 | 
			
		||||
        } else {
 | 
			
		||||
          // At this point we are sure that the object we found is of the same
 | 
			
		||||
          // type we are looking for, so we downcast it to that type
 | 
			
		||||
          // without further checks.
 | 
			
		||||
          typed_test_info = CheckedDowncastToActualType<
 | 
			
		||||
              ParameterizedTestCaseInfo<TestCase> >(*it);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (typed_test_info == NULL) {
 | 
			
		||||
      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(
 | 
			
		||||
          test_case_name, code_location);
 | 
			
		||||
      test_case_infos_.push_back(typed_test_info);
 | 
			
		||||
    }
 | 
			
		||||
    return typed_test_info;
 | 
			
		||||
  }
 | 
			
		||||
  void RegisterTests() {
 | 
			
		||||
    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
 | 
			
		||||
         it != test_case_infos_.end(); ++it) {
 | 
			
		||||
      (*it)->RegisterTests();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
 | 
			
		||||
 | 
			
		||||
  TestCaseInfoContainer test_case_infos_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  //  GTEST_HAS_PARAM_TEST
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
 | 
			
		||||
							
								
								
									
										93
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-port-arch.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-port-arch.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
// Copyright 2015, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This header file defines the GTEST_OS_* macro.
 | 
			
		||||
// It is separate from gtest-port.h so that custom/gtest-port.h can include it.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
 | 
			
		||||
 | 
			
		||||
// Determines the platform on which Google Test is compiled.
 | 
			
		||||
#ifdef __CYGWIN__
 | 
			
		||||
# define GTEST_OS_CYGWIN 1
 | 
			
		||||
#elif defined __SYMBIAN32__
 | 
			
		||||
# define GTEST_OS_SYMBIAN 1
 | 
			
		||||
#elif defined _WIN32
 | 
			
		||||
# define GTEST_OS_WINDOWS 1
 | 
			
		||||
# ifdef _WIN32_WCE
 | 
			
		||||
#  define GTEST_OS_WINDOWS_MOBILE 1
 | 
			
		||||
# elif defined(__MINGW__) || defined(__MINGW32__)
 | 
			
		||||
#  define GTEST_OS_WINDOWS_MINGW 1
 | 
			
		||||
# elif defined(WINAPI_FAMILY)
 | 
			
		||||
#  include <winapifamily.h>
 | 
			
		||||
#  if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 | 
			
		||||
#   define GTEST_OS_WINDOWS_DESKTOP 1
 | 
			
		||||
#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
 | 
			
		||||
#   define GTEST_OS_WINDOWS_PHONE 1
 | 
			
		||||
#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
 | 
			
		||||
#   define GTEST_OS_WINDOWS_RT 1
 | 
			
		||||
#  else
 | 
			
		||||
    // WINAPI_FAMILY defined but no known partition matched.
 | 
			
		||||
    // Default to desktop.
 | 
			
		||||
#   define GTEST_OS_WINDOWS_DESKTOP 1
 | 
			
		||||
#  endif
 | 
			
		||||
# else
 | 
			
		||||
#  define GTEST_OS_WINDOWS_DESKTOP 1
 | 
			
		||||
# endif  // _WIN32_WCE
 | 
			
		||||
#elif defined __APPLE__
 | 
			
		||||
# define GTEST_OS_MAC 1
 | 
			
		||||
# if TARGET_OS_IPHONE
 | 
			
		||||
#  define GTEST_OS_IOS 1
 | 
			
		||||
# endif
 | 
			
		||||
#elif defined __FreeBSD__
 | 
			
		||||
# define GTEST_OS_FREEBSD 1
 | 
			
		||||
#elif defined __linux__
 | 
			
		||||
# define GTEST_OS_LINUX 1
 | 
			
		||||
# if defined __ANDROID__
 | 
			
		||||
#  define GTEST_OS_LINUX_ANDROID 1
 | 
			
		||||
# endif
 | 
			
		||||
#elif defined __MVS__
 | 
			
		||||
# define GTEST_OS_ZOS 1
 | 
			
		||||
#elif defined(__sun) && defined(__SVR4)
 | 
			
		||||
# define GTEST_OS_SOLARIS 1
 | 
			
		||||
#elif defined(_AIX)
 | 
			
		||||
# define GTEST_OS_AIX 1
 | 
			
		||||
#elif defined(__hpux)
 | 
			
		||||
# define GTEST_OS_HPUX 1
 | 
			
		||||
#elif defined __native_client__
 | 
			
		||||
# define GTEST_OS_NACL 1
 | 
			
		||||
#elif defined __OpenBSD__
 | 
			
		||||
# define GTEST_OS_OPENBSD 1
 | 
			
		||||
#elif defined __QNX__
 | 
			
		||||
# define GTEST_OS_QNX 1
 | 
			
		||||
#endif  // __CYGWIN__
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_
 | 
			
		||||
							
								
								
									
										2554
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-port.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2554
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-port.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										167
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-string.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-string.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,167 @@
 | 
			
		||||
// Copyright 2005, Google Inc.
 | 
			
		||||
// All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
 | 
			
		||||
//
 | 
			
		||||
// The Google C++ Testing Framework (Google Test)
 | 
			
		||||
//
 | 
			
		||||
// This header file declares the String class and functions used internally by
 | 
			
		||||
// Google Test.  They are subject to change without notice. They should not used
 | 
			
		||||
// by code external to Google Test.
 | 
			
		||||
//
 | 
			
		||||
// This header file is #included by <gtest/internal/gtest-internal.h>.
 | 
			
		||||
// It should not be #included by other files.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
// string.h is not guaranteed to provide strcpy on C++ Builder.
 | 
			
		||||
# include <mem.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// String - an abstract class holding static string utilities.
 | 
			
		||||
class GTEST_API_ String {
 | 
			
		||||
 public:
 | 
			
		||||
  // Static utility methods
 | 
			
		||||
 | 
			
		||||
  // Clones a 0-terminated C string, allocating memory using new.  The
 | 
			
		||||
  // caller is responsible for deleting the return value using
 | 
			
		||||
  // delete[].  Returns the cloned string, or NULL if the input is
 | 
			
		||||
  // NULL.
 | 
			
		||||
  //
 | 
			
		||||
  // This is different from strdup() in string.h, which allocates
 | 
			
		||||
  // memory using malloc().
 | 
			
		||||
  static const char* CloneCString(const char* c_str);
 | 
			
		||||
 | 
			
		||||
#if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
 | 
			
		||||
  // able to pass strings to Win32 APIs on CE we need to convert them
 | 
			
		||||
  // to 'Unicode', UTF-16.
 | 
			
		||||
 | 
			
		||||
  // Creates a UTF-16 wide string from the given ANSI string, allocating
 | 
			
		||||
  // memory using new. The caller is responsible for deleting the return
 | 
			
		||||
  // value using delete[]. Returns the wide string, or NULL if the
 | 
			
		||||
  // input is NULL.
 | 
			
		||||
  //
 | 
			
		||||
  // The wide string is created using the ANSI codepage (CP_ACP) to
 | 
			
		||||
  // match the behaviour of the ANSI versions of Win32 calls and the
 | 
			
		||||
  // C runtime.
 | 
			
		||||
  static LPCWSTR AnsiToUtf16(const char* c_str);
 | 
			
		||||
 | 
			
		||||
  // Creates an ANSI string from the given wide string, allocating
 | 
			
		||||
  // memory using new. The caller is responsible for deleting the return
 | 
			
		||||
  // value using delete[]. Returns the ANSI string, or NULL if the
 | 
			
		||||
  // input is NULL.
 | 
			
		||||
  //
 | 
			
		||||
  // The returned string is created using the ANSI codepage (CP_ACP) to
 | 
			
		||||
  // match the behaviour of the ANSI versions of Win32 calls and the
 | 
			
		||||
  // C runtime.
 | 
			
		||||
  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  // Compares two C strings.  Returns true iff they have the same content.
 | 
			
		||||
  //
 | 
			
		||||
  // Unlike strcmp(), this function can handle NULL argument(s).  A
 | 
			
		||||
  // NULL C string is considered different to any non-NULL C string,
 | 
			
		||||
  // including the empty string.
 | 
			
		||||
  static bool CStringEquals(const char* lhs, const char* rhs);
 | 
			
		||||
 | 
			
		||||
  // Converts a wide C string to a String using the UTF-8 encoding.
 | 
			
		||||
  // NULL will be converted to "(null)".  If an error occurred during
 | 
			
		||||
  // the conversion, "(failed to convert from wide string)" is
 | 
			
		||||
  // returned.
 | 
			
		||||
  static std::string ShowWideCString(const wchar_t* wide_c_str);
 | 
			
		||||
 | 
			
		||||
  // Compares two wide C strings.  Returns true iff they have the same
 | 
			
		||||
  // content.
 | 
			
		||||
  //
 | 
			
		||||
  // Unlike wcscmp(), this function can handle NULL argument(s).  A
 | 
			
		||||
  // NULL C string is considered different to any non-NULL C string,
 | 
			
		||||
  // including the empty string.
 | 
			
		||||
  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
 | 
			
		||||
 | 
			
		||||
  // Compares two C strings, ignoring case.  Returns true iff they
 | 
			
		||||
  // have the same content.
 | 
			
		||||
  //
 | 
			
		||||
  // Unlike strcasecmp(), this function can handle NULL argument(s).
 | 
			
		||||
  // A NULL C string is considered different to any non-NULL C string,
 | 
			
		||||
  // including the empty string.
 | 
			
		||||
  static bool CaseInsensitiveCStringEquals(const char* lhs,
 | 
			
		||||
                                           const char* rhs);
 | 
			
		||||
 | 
			
		||||
  // Compares two wide C strings, ignoring case.  Returns true iff they
 | 
			
		||||
  // have the same content.
 | 
			
		||||
  //
 | 
			
		||||
  // Unlike wcscasecmp(), this function can handle NULL argument(s).
 | 
			
		||||
  // A NULL C string is considered different to any non-NULL wide C string,
 | 
			
		||||
  // including the empty string.
 | 
			
		||||
  // NB: The implementations on different platforms slightly differ.
 | 
			
		||||
  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
 | 
			
		||||
  // environment variable. On GNU platform this method uses wcscasecmp
 | 
			
		||||
  // which compares according to LC_CTYPE category of the current locale.
 | 
			
		||||
  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
 | 
			
		||||
  // current locale.
 | 
			
		||||
  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
 | 
			
		||||
                                               const wchar_t* rhs);
 | 
			
		||||
 | 
			
		||||
  // Returns true iff the given string ends with the given suffix, ignoring
 | 
			
		||||
  // case. Any string is considered to end with an empty suffix.
 | 
			
		||||
  static bool EndsWithCaseInsensitive(
 | 
			
		||||
      const std::string& str, const std::string& suffix);
 | 
			
		||||
 | 
			
		||||
  // Formats an int value as "%02d".
 | 
			
		||||
  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
 | 
			
		||||
 | 
			
		||||
  // Formats an int value as "%X".
 | 
			
		||||
  static std::string FormatHexInt(int value);
 | 
			
		||||
 | 
			
		||||
  // Formats a byte as "%02X".
 | 
			
		||||
  static std::string FormatByte(unsigned char value);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  String();  // Not meant to be instantiated.
 | 
			
		||||
};  // class String
 | 
			
		||||
 | 
			
		||||
// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
 | 
			
		||||
// character in the buffer is replaced with "\\0".
 | 
			
		||||
GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
 | 
			
		||||
							
								
								
									
										1020
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-tuple.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1020
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-tuple.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										347
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-tuple.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-tuple.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,347 @@
 | 
			
		||||
$$ -*- mode: c++; -*-
 | 
			
		||||
$var n = 10  $$ Maximum number of tuple fields we want to support.
 | 
			
		||||
$$ This meta comment fixes auto-indentation in Emacs. }}
 | 
			
		||||
// Copyright 2009 Google Inc.
 | 
			
		||||
// All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
 | 
			
		||||
 | 
			
		||||
#include <utility>  // For ::std::pair.
 | 
			
		||||
 | 
			
		||||
// The compiler used in Symbian has a bug that prevents us from declaring the
 | 
			
		||||
// tuple template as a friend (it complains that tuple is redefined).  This
 | 
			
		||||
// hack bypasses the bug by declaring the members that should otherwise be
 | 
			
		||||
// private as public.
 | 
			
		||||
// Sun Studio versions < 12 also have the above bug.
 | 
			
		||||
#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
 | 
			
		||||
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
 | 
			
		||||
#else
 | 
			
		||||
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
 | 
			
		||||
    template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \
 | 
			
		||||
   private:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict
 | 
			
		||||
// with our own definitions. Therefore using our own tuple does not work on
 | 
			
		||||
// those compilers.
 | 
			
		||||
#if defined(_MSC_VER) && _MSC_VER >= 1600  /* 1600 is Visual Studio 2010 */
 | 
			
		||||
# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \
 | 
			
		||||
GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$range i 0..n-1
 | 
			
		||||
$range j 0..n
 | 
			
		||||
$range k 1..n
 | 
			
		||||
// GTEST_n_TUPLE_(T) is the type of an n-tuple.
 | 
			
		||||
#define GTEST_0_TUPLE_(T) tuple<>
 | 
			
		||||
 | 
			
		||||
$for k [[
 | 
			
		||||
$range m 0..k-1
 | 
			
		||||
$range m2 k..n-1
 | 
			
		||||
#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
$range m 0..j-1
 | 
			
		||||
#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// In theory, defining stuff in the ::std namespace is undefined
 | 
			
		||||
// behavior.  We can do this as we are playing the role of a standard
 | 
			
		||||
// library vendor.
 | 
			
		||||
namespace std {
 | 
			
		||||
namespace tr1 {
 | 
			
		||||
 | 
			
		||||
template <$for i, [[typename T$i = void]]>
 | 
			
		||||
class tuple;
 | 
			
		||||
 | 
			
		||||
// Anything in namespace gtest_internal is Google Test's INTERNAL
 | 
			
		||||
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
 | 
			
		||||
namespace gtest_internal {
 | 
			
		||||
 | 
			
		||||
// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct ByRef { typedef const T& type; };  // NOLINT
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct ByRef<T&> { typedef T& type; };  // NOLINT
 | 
			
		||||
 | 
			
		||||
// A handy wrapper for ByRef.
 | 
			
		||||
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
 | 
			
		||||
 | 
			
		||||
// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
 | 
			
		||||
// is the same as tr1::add_reference<T>::type.
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct AddRef { typedef T& type; };  // NOLINT
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct AddRef<T&> { typedef T& type; };  // NOLINT
 | 
			
		||||
 | 
			
		||||
// A handy wrapper for AddRef.
 | 
			
		||||
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
 | 
			
		||||
 | 
			
		||||
// A helper for implementing get<k>().
 | 
			
		||||
template <int k> class Get;
 | 
			
		||||
 | 
			
		||||
// A helper for implementing tuple_element<k, T>.  kIndexValid is true
 | 
			
		||||
// iff k < the number of fields in tuple type T.
 | 
			
		||||
template <bool kIndexValid, int kIndex, class Tuple>
 | 
			
		||||
struct TupleElement;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for i [[
 | 
			
		||||
template <GTEST_$(n)_TYPENAMES_(T)>
 | 
			
		||||
struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > {
 | 
			
		||||
  typedef T$i type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
}  // namespace gtest_internal
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
class tuple<> {
 | 
			
		||||
 public:
 | 
			
		||||
  tuple() {}
 | 
			
		||||
  tuple(const tuple& /* t */)  {}
 | 
			
		||||
  tuple& operator=(const tuple& /* t */) { return *this; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for k [[
 | 
			
		||||
$range m 0..k-1
 | 
			
		||||
template <GTEST_$(k)_TYPENAMES_(T)>
 | 
			
		||||
class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {
 | 
			
		||||
 public:
 | 
			
		||||
  template <int k> friend class gtest_internal::Get;
 | 
			
		||||
 | 
			
		||||
  tuple() : $for m, [[f$(m)_()]] {}
 | 
			
		||||
 | 
			
		||||
  explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]
 | 
			
		||||
$for m, [[f$(m)_(f$m)]] {}
 | 
			
		||||
 | 
			
		||||
  tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
 | 
			
		||||
 | 
			
		||||
  template <GTEST_$(k)_TYPENAMES_(U)>
 | 
			
		||||
  tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
 | 
			
		||||
 | 
			
		||||
$if k == 2 [[
 | 
			
		||||
  template <typename U0, typename U1>
 | 
			
		||||
  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
  tuple& operator=(const tuple& t) { return CopyFrom(t); }
 | 
			
		||||
 | 
			
		||||
  template <GTEST_$(k)_TYPENAMES_(U)>
 | 
			
		||||
  tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {
 | 
			
		||||
    return CopyFrom(t);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
$if k == 2 [[
 | 
			
		||||
  template <typename U0, typename U1>
 | 
			
		||||
  tuple& operator=(const ::std::pair<U0, U1>& p) {
 | 
			
		||||
    f0_ = p.first;
 | 
			
		||||
    f1_ = p.second;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
  GTEST_DECLARE_TUPLE_AS_FRIEND_
 | 
			
		||||
 | 
			
		||||
  template <GTEST_$(k)_TYPENAMES_(U)>
 | 
			
		||||
  tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {
 | 
			
		||||
 | 
			
		||||
$for m [[
 | 
			
		||||
    f$(m)_ = t.f$(m)_;
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for m [[
 | 
			
		||||
  T$m f$(m)_;
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
// 6.1.3.2 Tuple creation functions.
 | 
			
		||||
 | 
			
		||||
// Known limitations: we don't support passing an
 | 
			
		||||
// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
 | 
			
		||||
// implement tie().
 | 
			
		||||
 | 
			
		||||
inline tuple<> make_tuple() { return tuple<>(); }
 | 
			
		||||
 | 
			
		||||
$for k [[
 | 
			
		||||
$range m 0..k-1
 | 
			
		||||
 | 
			
		||||
template <GTEST_$(k)_TYPENAMES_(T)>
 | 
			
		||||
inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {
 | 
			
		||||
  return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// 6.1.3.3 Tuple helper classes.
 | 
			
		||||
 | 
			
		||||
template <typename Tuple> struct tuple_size;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
template <GTEST_$(j)_TYPENAMES_(T)>
 | 
			
		||||
struct tuple_size<GTEST_$(j)_TUPLE_(T) > {
 | 
			
		||||
  static const int value = $j;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
template <int k, class Tuple>
 | 
			
		||||
struct tuple_element {
 | 
			
		||||
  typedef typename gtest_internal::TupleElement<
 | 
			
		||||
      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
 | 
			
		||||
 | 
			
		||||
// 6.1.3.4 Element access.
 | 
			
		||||
 | 
			
		||||
namespace gtest_internal {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for i [[
 | 
			
		||||
template <>
 | 
			
		||||
class Get<$i> {
 | 
			
		||||
 public:
 | 
			
		||||
  template <class Tuple>
 | 
			
		||||
  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
 | 
			
		||||
  Field(Tuple& t) { return t.f$(i)_; }  // NOLINT
 | 
			
		||||
 | 
			
		||||
  template <class Tuple>
 | 
			
		||||
  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
 | 
			
		||||
  ConstField(const Tuple& t) { return t.f$(i)_; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
}  // namespace gtest_internal
 | 
			
		||||
 | 
			
		||||
template <int k, GTEST_$(n)_TYPENAMES_(T)>
 | 
			
		||||
GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))
 | 
			
		||||
get(GTEST_$(n)_TUPLE_(T)& t) {
 | 
			
		||||
  return gtest_internal::Get<k>::Field(t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <int k, GTEST_$(n)_TYPENAMES_(T)>
 | 
			
		||||
GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T)))
 | 
			
		||||
get(const GTEST_$(n)_TUPLE_(T)& t) {
 | 
			
		||||
  return gtest_internal::Get<k>::ConstField(t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 6.1.3.5 Relational operators
 | 
			
		||||
 | 
			
		||||
// We only implement == and !=, as we don't have a need for the rest yet.
 | 
			
		||||
 | 
			
		||||
namespace gtest_internal {
 | 
			
		||||
 | 
			
		||||
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
 | 
			
		||||
// first k fields of t1 equals the first k fields of t2.
 | 
			
		||||
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
 | 
			
		||||
// k1 != k2.
 | 
			
		||||
template <int kSize1, int kSize2>
 | 
			
		||||
struct SameSizeTuplePrefixComparator;
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
struct SameSizeTuplePrefixComparator<0, 0> {
 | 
			
		||||
  template <class Tuple1, class Tuple2>
 | 
			
		||||
  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <int k>
 | 
			
		||||
struct SameSizeTuplePrefixComparator<k, k> {
 | 
			
		||||
  template <class Tuple1, class Tuple2>
 | 
			
		||||
  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
 | 
			
		||||
    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
 | 
			
		||||
        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace gtest_internal
 | 
			
		||||
 | 
			
		||||
template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
 | 
			
		||||
inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,
 | 
			
		||||
                       const GTEST_$(n)_TUPLE_(U)& u) {
 | 
			
		||||
  return gtest_internal::SameSizeTuplePrefixComparator<
 | 
			
		||||
      tuple_size<GTEST_$(n)_TUPLE_(T) >::value,
 | 
			
		||||
      tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
 | 
			
		||||
inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,
 | 
			
		||||
                       const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }
 | 
			
		||||
 | 
			
		||||
// 6.1.4 Pairs.
 | 
			
		||||
// Unimplemented.
 | 
			
		||||
 | 
			
		||||
}  // namespace tr1
 | 
			
		||||
}  // namespace std
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
#undef GTEST_$(j)_TUPLE_
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$for j [[
 | 
			
		||||
#undef GTEST_$(j)_TYPENAMES_
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
 | 
			
		||||
#undef GTEST_BY_REF_
 | 
			
		||||
#undef GTEST_ADD_REF_
 | 
			
		||||
#undef GTEST_TUPLE_ELEMENT_
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
 | 
			
		||||
							
								
								
									
										3331
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-type-util.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3331
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-type-util.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										297
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-type-util.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								thirdparty/assimp/contrib/gtest/include/gtest/internal/gtest-type-util.h.pump
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,297 @@
 | 
			
		||||
$$ -*- mode: c++; -*-
 | 
			
		||||
$var n = 50  $$ Maximum length of type lists we want to support.
 | 
			
		||||
// Copyright 2008 Google Inc.
 | 
			
		||||
// All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: wan@google.com (Zhanyong Wan)
 | 
			
		||||
 | 
			
		||||
// Type utilities needed for implementing typed and type-parameterized
 | 
			
		||||
// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
 | 
			
		||||
//
 | 
			
		||||
// Currently we support at most $n types in a list, and at most $n
 | 
			
		||||
// type-parameterized tests in one type-parameterized test case.
 | 
			
		||||
// Please contact googletestframework@googlegroups.com if you need
 | 
			
		||||
// more.
 | 
			
		||||
 | 
			
		||||
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
 | 
			
		||||
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
 | 
			
		||||
 | 
			
		||||
#include "gtest/internal/gtest-port.h"
 | 
			
		||||
 | 
			
		||||
// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
 | 
			
		||||
// libstdc++ (which is where cxxabi.h comes from).
 | 
			
		||||
# if GTEST_HAS_CXXABI_H_
 | 
			
		||||
#  include <cxxabi.h>
 | 
			
		||||
# elif defined(__HP_aCC)
 | 
			
		||||
#  include <acxx_demangle.h>
 | 
			
		||||
# endif  // GTEST_HASH_CXXABI_H_
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// GetTypeName<T>() returns a human-readable name of type T.
 | 
			
		||||
// NB: This function is also used in Google Mock, so don't move it inside of
 | 
			
		||||
// the typed-test-only section below.
 | 
			
		||||
template <typename T>
 | 
			
		||||
std::string GetTypeName() {
 | 
			
		||||
# if GTEST_HAS_RTTI
 | 
			
		||||
 | 
			
		||||
  const char* const name = typeid(T).name();
 | 
			
		||||
#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
 | 
			
		||||
  int status = 0;
 | 
			
		||||
  // gcc's implementation of typeid(T).name() mangles the type name,
 | 
			
		||||
  // so we have to demangle it.
 | 
			
		||||
#   if GTEST_HAS_CXXABI_H_
 | 
			
		||||
  using abi::__cxa_demangle;
 | 
			
		||||
#   endif  // GTEST_HAS_CXXABI_H_
 | 
			
		||||
  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
 | 
			
		||||
  const std::string name_str(status == 0 ? readable_name : name);
 | 
			
		||||
  free(readable_name);
 | 
			
		||||
  return name_str;
 | 
			
		||||
#  else
 | 
			
		||||
  return name;
 | 
			
		||||
#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
 | 
			
		||||
 | 
			
		||||
# else
 | 
			
		||||
 | 
			
		||||
  return "<type>";
 | 
			
		||||
 | 
			
		||||
# endif  // GTEST_HAS_RTTI
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
 | 
			
		||||
// type.  This can be used as a compile-time assertion to ensure that
 | 
			
		||||
// two types are equal.
 | 
			
		||||
 | 
			
		||||
template <typename T1, typename T2>
 | 
			
		||||
struct AssertTypeEq;
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct AssertTypeEq<T, T> {
 | 
			
		||||
  typedef bool type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A unique type used as the default value for the arguments of class
 | 
			
		||||
// template Types.  This allows us to simulate variadic templates
 | 
			
		||||
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
 | 
			
		||||
// support directly.
 | 
			
		||||
struct None {};
 | 
			
		||||
 | 
			
		||||
// The following family of struct and struct templates are used to
 | 
			
		||||
// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
 | 
			
		||||
// represents a type list with N types (T1, T2, ..., and TN) in it.
 | 
			
		||||
// Except for Types0, every struct in the family has two member types:
 | 
			
		||||
// Head for the first type in the list, and Tail for the rest of the
 | 
			
		||||
// list.
 | 
			
		||||
 | 
			
		||||
// The empty type list.
 | 
			
		||||
struct Types0 {};
 | 
			
		||||
 | 
			
		||||
// Type lists of length 1, 2, 3, and so on.
 | 
			
		||||
 | 
			
		||||
template <typename T1>
 | 
			
		||||
struct Types1 {
 | 
			
		||||
  typedef T1 Head;
 | 
			
		||||
  typedef Types0 Tail;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$range i 2..n
 | 
			
		||||
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
$range k 2..i
 | 
			
		||||
template <$for j, [[typename T$j]]>
 | 
			
		||||
struct Types$i {
 | 
			
		||||
  typedef T1 Head;
 | 
			
		||||
  typedef Types$(i-1)<$for k, [[T$k]]> Tail;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
// We don't want to require the users to write TypesN<...> directly,
 | 
			
		||||
// as that would require them to count the length.  Types<...> is much
 | 
			
		||||
// easier to write, but generates horrible messages when there is a
 | 
			
		||||
// compiler error, as gcc insists on printing out each template
 | 
			
		||||
// argument, even if it has the default value (this means Types<int>
 | 
			
		||||
// will appear as Types<int, None, None, ..., None> in the compiler
 | 
			
		||||
// errors).
 | 
			
		||||
//
 | 
			
		||||
// Our solution is to combine the best part of the two approaches: a
 | 
			
		||||
// user would write Types<T1, ..., TN>, and Google Test will translate
 | 
			
		||||
// that to TypesN<T1, ..., TN> internally to make error messages
 | 
			
		||||
// readable.  The translation is done by the 'type' member of the
 | 
			
		||||
// Types template.
 | 
			
		||||
 | 
			
		||||
$range i 1..n
 | 
			
		||||
template <$for i, [[typename T$i = internal::None]]>
 | 
			
		||||
struct Types {
 | 
			
		||||
  typedef internal::Types$n<$for i, [[T$i]]> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
struct Types<$for i, [[internal::None]]> {
 | 
			
		||||
  typedef internal::Types0 type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$range i 1..n-1
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
$range k i+1..n
 | 
			
		||||
template <$for j, [[typename T$j]]>
 | 
			
		||||
struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
 | 
			
		||||
  typedef internal::Types$i<$for j, [[T$j]]> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
# define GTEST_TEMPLATE_ template <typename T> class
 | 
			
		||||
 | 
			
		||||
// The template "selector" struct TemplateSel<Tmpl> is used to
 | 
			
		||||
// represent Tmpl, which must be a class template with one type
 | 
			
		||||
// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
 | 
			
		||||
// as the type Tmpl<T>.  This allows us to actually instantiate the
 | 
			
		||||
// template "selected" by TemplateSel<Tmpl>.
 | 
			
		||||
//
 | 
			
		||||
// This trick is necessary for simulating typedef for class templates,
 | 
			
		||||
// which C++ doesn't support directly.
 | 
			
		||||
template <GTEST_TEMPLATE_ Tmpl>
 | 
			
		||||
struct TemplateSel {
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  struct Bind {
 | 
			
		||||
    typedef Tmpl<T> type;
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
# define GTEST_BIND_(TmplSel, T) \
 | 
			
		||||
  TmplSel::template Bind<T>::type
 | 
			
		||||
 | 
			
		||||
// A unique struct template used as the default value for the
 | 
			
		||||
// arguments of class template Templates.  This allows us to simulate
 | 
			
		||||
// variadic templates (e.g. Templates<int>, Templates<int, double>,
 | 
			
		||||
// and etc), which C++ doesn't support directly.
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct NoneT {};
 | 
			
		||||
 | 
			
		||||
// The following family of struct and struct templates are used to
 | 
			
		||||
// represent template lists.  In particular, TemplatesN<T1, T2, ...,
 | 
			
		||||
// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
 | 
			
		||||
// for Templates0, every struct in the family has two member types:
 | 
			
		||||
// Head for the selector of the first template in the list, and Tail
 | 
			
		||||
// for the rest of the list.
 | 
			
		||||
 | 
			
		||||
// The empty template list.
 | 
			
		||||
struct Templates0 {};
 | 
			
		||||
 | 
			
		||||
// Template lists of length 1, 2, 3, and so on.
 | 
			
		||||
 | 
			
		||||
template <GTEST_TEMPLATE_ T1>
 | 
			
		||||
struct Templates1 {
 | 
			
		||||
  typedef TemplateSel<T1> Head;
 | 
			
		||||
  typedef Templates0 Tail;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$range i 2..n
 | 
			
		||||
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
$range k 2..i
 | 
			
		||||
template <$for j, [[GTEST_TEMPLATE_ T$j]]>
 | 
			
		||||
struct Templates$i {
 | 
			
		||||
  typedef TemplateSel<T1> Head;
 | 
			
		||||
  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// We don't want to require the users to write TemplatesN<...> directly,
 | 
			
		||||
// as that would require them to count the length.  Templates<...> is much
 | 
			
		||||
// easier to write, but generates horrible messages when there is a
 | 
			
		||||
// compiler error, as gcc insists on printing out each template
 | 
			
		||||
// argument, even if it has the default value (this means Templates<list>
 | 
			
		||||
// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
 | 
			
		||||
// errors).
 | 
			
		||||
//
 | 
			
		||||
// Our solution is to combine the best part of the two approaches: a
 | 
			
		||||
// user would write Templates<T1, ..., TN>, and Google Test will translate
 | 
			
		||||
// that to TemplatesN<T1, ..., TN> internally to make error messages
 | 
			
		||||
// readable.  The translation is done by the 'type' member of the
 | 
			
		||||
// Templates template.
 | 
			
		||||
 | 
			
		||||
$range i 1..n
 | 
			
		||||
template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
 | 
			
		||||
struct Templates {
 | 
			
		||||
  typedef Templates$n<$for i, [[T$i]]> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
struct Templates<$for i, [[NoneT]]> {
 | 
			
		||||
  typedef Templates0 type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$range i 1..n-1
 | 
			
		||||
$for i [[
 | 
			
		||||
$range j 1..i
 | 
			
		||||
$range k i+1..n
 | 
			
		||||
template <$for j, [[GTEST_TEMPLATE_ T$j]]>
 | 
			
		||||
struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
 | 
			
		||||
  typedef Templates$i<$for j, [[T$j]]> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
// The TypeList template makes it possible to use either a single type
 | 
			
		||||
// or a Types<...> list in TYPED_TEST_CASE() and
 | 
			
		||||
// INSTANTIATE_TYPED_TEST_CASE_P().
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct TypeList {
 | 
			
		||||
  typedef Types1<T> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$range i 1..n
 | 
			
		||||
template <$for i, [[typename T$i]]>
 | 
			
		||||
struct TypeList<Types<$for i, [[T$i]]> > {
 | 
			
		||||
  typedef typename Types<$for i, [[T$i]]>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
 | 
			
		||||
		Reference in New Issue
	
	Block a user