Index: testing/gmock/include/gmock/internal/gmock-internal-utils.h |
diff --git a/testing/gmock/include/gmock/internal/gmock-internal-utils.h b/testing/gmock/include/gmock/internal/gmock-internal-utils.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b02682f874492122b2a8d75a0eee43a03c51fff2 |
--- /dev/null |
+++ b/testing/gmock/include/gmock/internal/gmock-internal-utils.h |
@@ -0,0 +1,484 @@ |
+// 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 Mock - a framework for writing C++ mock classes. |
+// |
+// This file defines some utilities useful for implementing Google |
+// Mock. They are subject to change without notice, so please DO NOT |
+// USE THEM IN USER CODE. |
+ |
+#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ |
+#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ |
+ |
+#include <stdio.h> |
+#include <ostream> // NOLINT |
+#include <string> |
+ |
+#include <gmock/internal/gmock-generated-internal-utils.h> |
+#include <gmock/internal/gmock-port.h> |
+#include <gtest/gtest.h> |
+ |
+// Concatenates two pre-processor symbols; works for concatenating |
+// built-in macros like __FILE__ and __LINE__. |
+#define GMOCK_CONCAT_TOKEN_IMPL_(foo, bar) foo##bar |
+#define GMOCK_CONCAT_TOKEN_(foo, bar) GMOCK_CONCAT_TOKEN_IMPL_(foo, bar) |
+ |
+#ifdef __GNUC__ |
+#define GMOCK_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) |
+#else |
+#define GMOCK_ATTRIBUTE_UNUSED_ |
+#endif // __GNUC__ |
+ |
+class ProtocolMessage; |
+namespace proto2 { class Message; } |
+ |
+namespace testing { |
+namespace internal { |
+ |
+// Converts an identifier name to a space-separated list of lower-case |
+// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is |
+// treated as one word. For example, both "FooBar123" and |
+// "foo_bar_123" are converted to "foo bar 123". |
+string ConvertIdentifierNameToWords(const char* id_name); |
+ |
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a |
+// compiler error iff T1 and T2 are different types. |
+template <typename T1, typename T2> |
+struct CompileAssertTypesEqual; |
+ |
+template <typename T> |
+struct CompileAssertTypesEqual<T, T> { |
+}; |
+ |
+// Removes the reference from a type if it is a reference type, |
+// otherwise leaves it unchanged. This is the same as |
+// tr1::remove_reference, which is not widely available yet. |
+template <typename T> |
+struct RemoveReference { typedef T type; }; // NOLINT |
+template <typename T> |
+struct RemoveReference<T&> { typedef T type; }; // NOLINT |
+ |
+// A handy wrapper around RemoveReference that works when the argument |
+// T depends on template parameters. |
+#define GMOCK_REMOVE_REFERENCE_(T) \ |
+ typename ::testing::internal::RemoveReference<T>::type |
+ |
+// Removes const from a type if it is a const type, otherwise leaves |
+// it unchanged. This is the same as tr1::remove_const, which is not |
+// widely available yet. |
+template <typename T> |
+struct RemoveConst { typedef T type; }; // NOLINT |
+template <typename T> |
+struct RemoveConst<const T> { typedef T type; }; // NOLINT |
+ |
+// A handy wrapper around RemoveConst that works when the argument |
+// T depends on template parameters. |
+#define GMOCK_REMOVE_CONST_(T) \ |
+ typename ::testing::internal::RemoveConst<T>::type |
+ |
+// Adds reference to a type if it is not a reference type, |
+// otherwise leaves it unchanged. This is the same as |
+// tr1::add_reference, which is not widely available yet. |
+template <typename T> |
+struct AddReference { typedef T& type; }; // NOLINT |
+template <typename T> |
+struct AddReference<T&> { typedef T& type; }; // NOLINT |
+ |
+// A handy wrapper around AddReference that works when the argument T |
+// depends on template parameters. |
+#define GMOCK_ADD_REFERENCE_(T) \ |
+ typename ::testing::internal::AddReference<T>::type |
+ |
+// Adds a reference to const on top of T as necessary. For example, |
+// it transforms |
+// |
+// char ==> const char& |
+// const char ==> const char& |
+// char& ==> const char& |
+// const char& ==> const char& |
+// |
+// The argument T must depend on some template parameters. |
+#define GMOCK_REFERENCE_TO_CONST_(T) \ |
+ GMOCK_ADD_REFERENCE_(const GMOCK_REMOVE_REFERENCE_(T)) |
+ |
+// PointeeOf<Pointer>::type is the type of a value pointed to by a |
+// Pointer, which can be either a smart pointer or a raw pointer. The |
+// following default implementation is for the case where Pointer is a |
+// smart pointer. |
+template <typename Pointer> |
+struct PointeeOf { |
+ // Smart pointer classes define type element_type as the type of |
+ // their pointees. |
+ typedef typename Pointer::element_type type; |
+}; |
+// This specialization is for the raw pointer case. |
+template <typename T> |
+struct PointeeOf<T*> { typedef T type; }; // NOLINT |
+ |
+// GetRawPointer(p) returns the raw pointer underlying p when p is a |
+// smart pointer, or returns p itself when p is already a raw pointer. |
+// The following default implementation is for the smart pointer case. |
+template <typename Pointer> |
+inline typename Pointer::element_type* GetRawPointer(const Pointer& p) { |
+ return p.get(); |
+} |
+// This overloaded version is for the raw pointer case. |
+template <typename Element> |
+inline Element* GetRawPointer(Element* p) { return p; } |
+ |
+// This comparator allows linked_ptr to be stored in sets. |
+template <typename T> |
+struct LinkedPtrLessThan { |
+ bool operator()(const ::testing::internal::linked_ptr<T>& lhs, |
+ const ::testing::internal::linked_ptr<T>& rhs) const { |
+ return lhs.get() < rhs.get(); |
+ } |
+}; |
+ |
+// ImplicitlyConvertible<From, To>::value is a compile-time bool |
+// constant that's true iff type From can be implicitly converted to |
+// type To. |
+template <typename From, typename To> |
+class ImplicitlyConvertible { |
+ private: |
+ // We need the following helper functions only for their types. |
+ // They have no implementations. |
+ |
+ // MakeFrom() is an expression whose type is From. We cannot simply |
+ // use From(), as the type From may not have a public default |
+ // constructor. |
+ static From MakeFrom(); |
+ |
+ // These two functions are overloaded. Given an expression |
+ // Helper(x), the compiler will pick the first version if x can be |
+ // implicitly converted to type To; otherwise it will pick the |
+ // second version. |
+ // |
+ // The first version returns a value of size 1, and the second |
+ // version returns a value of size 2. Therefore, by checking the |
+ // size of Helper(x), which can be done at compile time, we can tell |
+ // which version of Helper() is used, and hence whether x can be |
+ // implicitly converted to type To. |
+ static char Helper(To); |
+ static char (&Helper(...))[2]; // NOLINT |
+ |
+ // We have to put the 'public' section after the 'private' section, |
+ // or MSVC refuses to compile the code. |
+ public: |
+ // MSVC warns about implicitly converting from double to int for |
+ // possible loss of data, so we need to temporarily disable the |
+ // warning. |
+#ifdef _MSC_VER |
+#pragma warning(push) // Saves the current warning state. |
+#pragma warning(disable:4244) // Temporarily disables warning 4244. |
+ static const bool value = |
+ sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; |
+#pragma warning(pop) // Restores the warning state. |
+#else |
+ static const bool value = |
+ sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; |
+#endif // _MSV_VER |
+}; |
+template <typename From, typename To> |
+const bool ImplicitlyConvertible<From, To>::value; |
+ |
+// In what follows, we use the term "kind" to indicate whether a type |
+// is bool, an integer type (excluding bool), a floating-point type, |
+// or none of them. This categorization is useful for determining |
+// when a matcher argument type can be safely converted to another |
+// type in the implementation of SafeMatcherCast. |
+enum TypeKind { |
+ kBool, kInteger, kFloatingPoint, kOther |
+}; |
+ |
+// KindOf<T>::value is the kind of type T. |
+template <typename T> struct KindOf { |
+ enum { value = kOther }; // The default kind. |
+}; |
+ |
+// This macro declares that the kind of 'type' is 'kind'. |
+#define GMOCK_DECLARE_KIND_(type, kind) \ |
+ template <> struct KindOf<type> { enum { value = kind }; } |
+ |
+GMOCK_DECLARE_KIND_(bool, kBool); |
+ |
+// All standard integer types. |
+GMOCK_DECLARE_KIND_(char, kInteger); |
+GMOCK_DECLARE_KIND_(signed char, kInteger); |
+GMOCK_DECLARE_KIND_(unsigned char, kInteger); |
+GMOCK_DECLARE_KIND_(short, kInteger); // NOLINT |
+GMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT |
+GMOCK_DECLARE_KIND_(int, kInteger); |
+GMOCK_DECLARE_KIND_(unsigned int, kInteger); |
+GMOCK_DECLARE_KIND_(long, kInteger); // NOLINT |
+GMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT |
+ |
+// MSVC can be configured to define wchar_t as a typedef of unsigned |
+// short. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t is a |
+// native type. |
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) |
+GMOCK_DECLARE_KIND_(wchar_t, kInteger); |
+#endif |
+ |
+// Non-standard integer types. |
+GMOCK_DECLARE_KIND_(Int64, kInteger); |
+GMOCK_DECLARE_KIND_(UInt64, kInteger); |
+ |
+// All standard floating-point types. |
+GMOCK_DECLARE_KIND_(float, kFloatingPoint); |
+GMOCK_DECLARE_KIND_(double, kFloatingPoint); |
+GMOCK_DECLARE_KIND_(long double, kFloatingPoint); |
+ |
+#undef GMOCK_DECLARE_KIND_ |
+ |
+// Evaluates to the kind of 'type'. |
+#define GMOCK_KIND_OF_(type) \ |
+ static_cast< ::testing::internal::TypeKind>( \ |
+ ::testing::internal::KindOf<type>::value) |
+ |
+// Evaluates to true iff integer type T is signed. |
+#define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0) |
+ |
+// LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value |
+// is true iff arithmetic type From can be losslessly converted to |
+// arithmetic type To. |
+// |
+// It's the user's responsibility to ensure that both From and To are |
+// raw (i.e. has no CV modifier, is not a pointer, and is not a |
+// reference) built-in arithmetic types, kFromKind is the kind of |
+// From, and kToKind is the kind of To; the value is |
+// implementation-defined when the above pre-condition is violated. |
+template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To> |
+struct LosslessArithmeticConvertibleImpl : public false_type {}; |
+ |
+// Converting bool to bool is lossless. |
+template <> |
+struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool> |
+ : public true_type {}; // NOLINT |
+ |
+// Converting bool to any integer type is lossless. |
+template <typename To> |
+struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To> |
+ : public true_type {}; // NOLINT |
+ |
+// Converting bool to any floating-point type is lossless. |
+template <typename To> |
+struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To> |
+ : public true_type {}; // NOLINT |
+ |
+// Converting an integer to bool is lossy. |
+template <typename From> |
+struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool> |
+ : public false_type {}; // NOLINT |
+ |
+// Converting an integer to another non-bool integer is lossless iff |
+// the target type's range encloses the source type's range. |
+template <typename From, typename To> |
+struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To> |
+ : public bool_constant< |
+ // When converting from a smaller size to a larger size, we are |
+ // fine as long as we are not converting from signed to unsigned. |
+ ((sizeof(From) < sizeof(To)) && |
+ (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) || |
+ // When converting between the same size, the signedness must match. |
+ ((sizeof(From) == sizeof(To)) && |
+ (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {}; // NOLINT |
+ |
+#undef GMOCK_IS_SIGNED_ |
+ |
+// Converting an integer to a floating-point type may be lossy, since |
+// the format of a floating-point number is implementation-defined. |
+template <typename From, typename To> |
+struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To> |
+ : public false_type {}; // NOLINT |
+ |
+// Converting a floating-point to bool is lossy. |
+template <typename From> |
+struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool> |
+ : public false_type {}; // NOLINT |
+ |
+// Converting a floating-point to an integer is lossy. |
+template <typename From, typename To> |
+struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To> |
+ : public false_type {}; // NOLINT |
+ |
+// Converting a floating-point to another floating-point is lossless |
+// iff the target type is at least as big as the source type. |
+template <typename From, typename To> |
+struct LosslessArithmeticConvertibleImpl< |
+ kFloatingPoint, From, kFloatingPoint, To> |
+ : public bool_constant<sizeof(From) <= sizeof(To)> {}; // NOLINT |
+ |
+// LosslessArithmeticConvertible<From, To>::value is true iff arithmetic |
+// type From can be losslessly converted to arithmetic type To. |
+// |
+// It's the user's responsibility to ensure that both From and To are |
+// raw (i.e. has no CV modifier, is not a pointer, and is not a |
+// reference) built-in arithmetic types; the value is |
+// implementation-defined when the above pre-condition is violated. |
+template <typename From, typename To> |
+struct LosslessArithmeticConvertible |
+ : public LosslessArithmeticConvertibleImpl< |
+ GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {}; // NOLINT |
+ |
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's |
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass |
+// of those. |
+template <typename T> |
+struct IsAProtocolMessage |
+ : public bool_constant< |
+ ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value || |
+ ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> { |
+}; |
+ |
+// When the compiler sees expression IsContainerTest<C>(0), the first |
+// overload of IsContainerTest will be picked if C is an STL-style |
+// container class (since C::const_iterator* is a valid type and 0 can |
+// be converted to it), while the second overload will be picked |
+// otherwise (since C::const_iterator will be an invalid type in this |
+// case). Therefore, we can determine whether C is a container class |
+// by checking the type of IsContainerTest<C>(0). The value of the |
+// expression is insignificant. |
+typedef int IsContainer; |
+template <class C> |
+IsContainer IsContainerTest(typename C::const_iterator*) { return 0; } |
+ |
+typedef char IsNotContainer; |
+template <class C> |
+IsNotContainer IsContainerTest(...) { return '\0'; } |
+ |
+// This interface knows how to report a Google Mock failure (either |
+// non-fatal or fatal). |
+class FailureReporterInterface { |
+ public: |
+ // The type of a failure (either non-fatal or fatal). |
+ enum FailureType { |
+ NONFATAL, FATAL |
+ }; |
+ |
+ virtual ~FailureReporterInterface() {} |
+ |
+ // Reports a failure that occurred at the given source file location. |
+ virtual void ReportFailure(FailureType type, const char* file, int line, |
+ const string& message) = 0; |
+}; |
+ |
+// Returns the failure reporter used by Google Mock. |
+FailureReporterInterface* GetFailureReporter(); |
+ |
+// Asserts that condition is true; aborts the process with the given |
+// message if condition is false. We cannot use LOG(FATAL) or CHECK() |
+// as Google Mock might be used to mock the log sink itself. We |
+// inline this function to prevent it from showing up in the stack |
+// trace. |
+inline void Assert(bool condition, const char* file, int line, |
+ const string& msg) { |
+ if (!condition) { |
+ GetFailureReporter()->ReportFailure(FailureReporterInterface::FATAL, |
+ file, line, msg); |
+ } |
+} |
+inline void Assert(bool condition, const char* file, int line) { |
+ Assert(condition, file, line, "Assertion failed."); |
+} |
+ |
+// Verifies that condition is true; generates a non-fatal failure if |
+// condition is false. |
+inline void Expect(bool condition, const char* file, int line, |
+ const string& msg) { |
+ if (!condition) { |
+ GetFailureReporter()->ReportFailure(FailureReporterInterface::NONFATAL, |
+ file, line, msg); |
+ } |
+} |
+inline void Expect(bool condition, const char* file, int line) { |
+ Expect(condition, file, line, "Expectation failed."); |
+} |
+ |
+// Severity level of a log. |
+enum LogSeverity { |
+ INFO = 0, |
+ WARNING = 1, |
+}; |
+ |
+// Valid values for the --gmock_verbose flag. |
+ |
+// All logs (informational and warnings) are printed. |
+const char kInfoVerbosity[] = "info"; |
+// Only warnings are printed. |
+const char kWarningVerbosity[] = "warning"; |
+// No logs are printed. |
+const char kErrorVerbosity[] = "error"; |
+ |
+// Prints the given message to stdout iff 'severity' >= the level |
+// specified by the --gmock_verbose flag. If stack_frames_to_skip >= |
+// 0, also prints the stack trace excluding the top |
+// stack_frames_to_skip frames. In opt mode, any positive |
+// stack_frames_to_skip is treated as 0, since we don't know which |
+// function calls will be inlined by the compiler and need to be |
+// conservative. |
+void Log(LogSeverity severity, const string& message, int stack_frames_to_skip); |
+ |
+// The universal value printer (public/gmock-printers.h) needs this |
+// to declare an unused << operator in the global namespace. |
+struct Unused {}; |
+ |
+// TODO(wan@google.com): group all type utilities together. |
+ |
+// Type traits. |
+ |
+// is_reference<T>::value is non-zero iff T is a reference type. |
+template <typename T> struct is_reference : public false_type {}; |
+template <typename T> struct is_reference<T&> : public true_type {}; |
+ |
+// type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type. |
+template <typename T1, typename T2> struct type_equals : public false_type {}; |
+template <typename T> struct type_equals<T, T> : public true_type {}; |
+ |
+// remove_reference<T>::type removes the reference from type T, if any. |
+template <typename T> struct remove_reference { typedef T type; }; // NOLINT |
+template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT |
+ |
+// Invalid<T>() returns an invalid value of type T. This is useful |
+// when a value of type T is needed for compilation, but the statement |
+// will not really be executed (or we don't care if the statement |
+// crashes). |
+template <typename T> |
+inline T Invalid() { |
+ return *static_cast<typename remove_reference<T>::type*>(NULL); |
+} |
+template <> |
+inline void Invalid<void>() {} |
+ |
+} // namespace internal |
+} // namespace testing |
+ |
+#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ |