Push upstream to SVN.
This commit is contained in:
@@ -802,25 +802,20 @@ class ImplicitlyConvertible {
|
||||
// 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.
|
||||
#elif defined(__BORLANDC__)
|
||||
#if defined(__BORLANDC__)
|
||||
// C++Builder cannot use member overload resolution during template
|
||||
// instantiation. The simplest workaround is to use its C++0x type traits
|
||||
// functions (C++Builder 2009 and above only).
|
||||
static const bool value = __is_convertible(From, To);
|
||||
#else
|
||||
// MSVC warns about implicitly converting from double to int for
|
||||
// possible loss of data, so we need to temporarily disable the
|
||||
// warning.
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244)
|
||||
static const bool value =
|
||||
sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
|
||||
#endif // _MSV_VER
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_()
|
||||
#endif // __BORLANDC__
|
||||
};
|
||||
template <typename From, typename To>
|
||||
const bool ImplicitlyConvertible<From, To>::value;
|
||||
@@ -946,11 +941,10 @@ void CopyArray(const T* from, size_t size, U* to) {
|
||||
|
||||
// The relation between an NativeArray object (see below) and the
|
||||
// native array it represents.
|
||||
enum RelationToSource {
|
||||
kReference, // The NativeArray references the native array.
|
||||
kCopy // The NativeArray makes a copy of the native array and
|
||||
// owns the copy.
|
||||
};
|
||||
// We use 2 different structs to allow non-copyable types to be used, as long
|
||||
// as RelationToSourceReference() is passed.
|
||||
struct RelationToSourceReference {};
|
||||
struct RelationToSourceCopy {};
|
||||
|
||||
// Adapts a native array to a read-only STL-style container. Instead
|
||||
// of the complete STL container concept, this adaptor only implements
|
||||
@@ -968,22 +962,23 @@ class NativeArray {
|
||||
typedef Element* iterator;
|
||||
typedef const Element* const_iterator;
|
||||
|
||||
// Constructs from a native array.
|
||||
NativeArray(const Element* array, size_t count, RelationToSource relation) {
|
||||
Init(array, count, relation);
|
||||
// Constructs from a native array. References the source.
|
||||
NativeArray(const Element* array, size_t count, RelationToSourceReference) {
|
||||
InitRef(array, count);
|
||||
}
|
||||
|
||||
// Constructs from a native array. Copies the source.
|
||||
NativeArray(const Element* array, size_t count, RelationToSourceCopy) {
|
||||
InitCopy(array, count);
|
||||
}
|
||||
|
||||
// Copy constructor.
|
||||
NativeArray(const NativeArray& rhs) {
|
||||
Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
|
||||
(this->*rhs.clone_)(rhs.array_, rhs.size_);
|
||||
}
|
||||
|
||||
~NativeArray() {
|
||||
// Ensures that the user doesn't instantiate NativeArray with a
|
||||
// const or reference type.
|
||||
static_cast<void>(StaticAssertTypeEqHelper<Element,
|
||||
GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
|
||||
if (relation_to_source_ == kCopy)
|
||||
if (clone_ != &NativeArray::InitRef)
|
||||
delete[] array_;
|
||||
}
|
||||
|
||||
@@ -997,23 +992,30 @@ class NativeArray {
|
||||
}
|
||||
|
||||
private:
|
||||
// Initializes this object; makes a copy of the input array if
|
||||
// 'relation' is kCopy.
|
||||
void Init(const Element* array, size_t a_size, RelationToSource relation) {
|
||||
if (relation == kReference) {
|
||||
array_ = array;
|
||||
} else {
|
||||
Element* const copy = new Element[a_size];
|
||||
CopyArray(array, a_size, copy);
|
||||
array_ = copy;
|
||||
}
|
||||
enum {
|
||||
kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper<
|
||||
Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value,
|
||||
};
|
||||
|
||||
// Initializes this object with a copy of the input.
|
||||
void InitCopy(const Element* array, size_t a_size) {
|
||||
Element* const copy = new Element[a_size];
|
||||
CopyArray(array, a_size, copy);
|
||||
array_ = copy;
|
||||
size_ = a_size;
|
||||
relation_to_source_ = relation;
|
||||
clone_ = &NativeArray::InitCopy;
|
||||
}
|
||||
|
||||
// Initializes this object with a reference of the input.
|
||||
void InitRef(const Element* array, size_t a_size) {
|
||||
array_ = array;
|
||||
size_ = a_size;
|
||||
clone_ = &NativeArray::InitRef;
|
||||
}
|
||||
|
||||
const Element* array_;
|
||||
size_t size_;
|
||||
RelationToSource relation_to_source_;
|
||||
void (NativeArray::*clone_)(const Element*, size_t);
|
||||
|
||||
GTEST_DISALLOW_ASSIGN_(NativeArray);
|
||||
};
|
||||
@@ -1156,3 +1158,4 @@ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|
||||
|
||||
|
||||
@@ -136,6 +136,8 @@
|
||||
// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
|
||||
// GTEST_OS_WINDOWS_MINGW - MinGW
|
||||
// GTEST_OS_WINDOWS_MOBILE - Windows Mobile
|
||||
// GTEST_OS_WINDOWS_PHONE - Windows Phone
|
||||
// GTEST_OS_WINDOWS_RT - Windows Store App/WinRT
|
||||
// GTEST_OS_ZOS - z/OS
|
||||
//
|
||||
// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
|
||||
@@ -269,6 +271,7 @@
|
||||
# include <TargetConditionals.h>
|
||||
#endif
|
||||
|
||||
#include <algorithm> // NOLINT
|
||||
#include <iostream> // NOLINT
|
||||
#include <sstream> // NOLINT
|
||||
#include <string> // NOLINT
|
||||
@@ -299,6 +302,19 @@
|
||||
# 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
|
||||
@@ -331,6 +347,23 @@
|
||||
# define GTEST_OS_QNX 1
|
||||
#endif // __CYGWIN__
|
||||
|
||||
// Macros for disabling Microsoft Visual C++ warnings.
|
||||
//
|
||||
// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)
|
||||
// /* code that triggers warnings C4800 and C4385 */
|
||||
// GTEST_DISABLE_MSC_WARNINGS_POP_()
|
||||
#if _MSC_VER >= 1500
|
||||
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \
|
||||
__pragma(warning(push)) \
|
||||
__pragma(warning(disable: warnings))
|
||||
# define GTEST_DISABLE_MSC_WARNINGS_POP_() \
|
||||
__pragma(warning(pop))
|
||||
#else
|
||||
// Older versions of MSVC don't have __pragma.
|
||||
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
|
||||
# define GTEST_DISABLE_MSC_WARNINGS_POP_()
|
||||
#endif
|
||||
|
||||
#ifndef GTEST_LANG_CXX11
|
||||
// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
|
||||
// -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a
|
||||
@@ -641,20 +674,20 @@ struct _RTL_CRITICAL_SECTION;
|
||||
// To avoid conditional compilation everywhere, we make it
|
||||
// gtest-port.h's responsibility to #include the header implementing
|
||||
// tuple.
|
||||
// TODO(sbenza): Enable this block to start using std::tuple instead of
|
||||
// std::tr1::tuple.
|
||||
#if 0 && GTEST_HAS_STD_TUPLE_
|
||||
# include <tuple>
|
||||
#if GTEST_HAS_STD_TUPLE_
|
||||
# include <tuple> // IWYU pragma: export
|
||||
# define GTEST_TUPLE_NAMESPACE_ ::std
|
||||
#endif
|
||||
#endif // GTEST_HAS_STD_TUPLE_
|
||||
|
||||
// We include tr1::tuple even if std::tuple is available to define printers for
|
||||
// them.
|
||||
#if GTEST_HAS_TR1_TUPLE
|
||||
# ifndef GTEST_TUPLE_NAMESPACE_
|
||||
# define GTEST_TUPLE_NAMESPACE_ ::std::tr1
|
||||
# endif // GTEST_TUPLE_NAMESPACE_
|
||||
|
||||
# if GTEST_USE_OWN_TR1_TUPLE
|
||||
# include "gtest/internal/gtest-tuple.h"
|
||||
# include "gtest/internal/gtest-tuple.h" // IWYU pragma: export // NOLINT
|
||||
# elif GTEST_ENV_HAS_STD_TUPLE_
|
||||
# include <tuple>
|
||||
// C++11 puts its tuple into the ::std namespace rather than
|
||||
@@ -685,7 +718,7 @@ using ::std::tuple_size;
|
||||
// This prevents <boost/tr1/detail/config.hpp>, which defines
|
||||
// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
|
||||
# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
|
||||
# include <tuple>
|
||||
# include <tuple> // IWYU pragma: export // NOLINT
|
||||
|
||||
# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
|
||||
// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
|
||||
@@ -708,7 +741,7 @@ using ::std::tuple_size;
|
||||
# else
|
||||
// If the compiler is not GCC 4.0+, we assume the user is using a
|
||||
// spec-conforming TR1 implementation.
|
||||
# include <tuple> // NOLINT
|
||||
# include <tuple> // IWYU pragma: export // NOLINT
|
||||
# endif // GTEST_USE_OWN_TR1_TUPLE
|
||||
|
||||
#endif // GTEST_HAS_TR1_TUPLE
|
||||
@@ -742,7 +775,8 @@ using ::std::tuple_size;
|
||||
#ifndef GTEST_HAS_STREAM_REDIRECTION
|
||||
// By default, we assume that stream redirection is supported on all
|
||||
// platforms except known mobile ones.
|
||||
# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
|
||||
# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \
|
||||
GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT
|
||||
# define GTEST_HAS_STREAM_REDIRECTION 0
|
||||
# else
|
||||
# define GTEST_HAS_STREAM_REDIRECTION 1
|
||||
@@ -859,20 +893,14 @@ using ::std::tuple_size;
|
||||
// constant. In some contexts this warning is false positive and needs to be
|
||||
// suppressed. Use the following two macros in such cases:
|
||||
//
|
||||
// GTEST_INTENTIONAL_CONST_COND_PUSH_
|
||||
// GTEST_INTENTIONAL_CONST_COND_PUSH_()
|
||||
// while (true) {
|
||||
// GTEST_INTENTIONAL_CONST_COND_POP_
|
||||
// GTEST_INTENTIONAL_CONST_COND_POP_()
|
||||
// }
|
||||
#if defined(_MSC_VER)
|
||||
# define GTEST_INTENTIONAL_CONST_COND_PUSH_ \
|
||||
__pragma(warning(push)) \
|
||||
__pragma(warning(disable: 4127))
|
||||
# define GTEST_INTENTIONAL_CONST_COND_POP_ \
|
||||
__pragma(warning(pop))
|
||||
#else
|
||||
# define GTEST_INTENTIONAL_CONST_COND_PUSH_
|
||||
# define GTEST_INTENTIONAL_CONST_COND_POP_
|
||||
#endif
|
||||
# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127)
|
||||
# define GTEST_INTENTIONAL_CONST_COND_POP_() \
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_()
|
||||
|
||||
// Determine whether the compiler supports Microsoft's Structured Exception
|
||||
// Handling. This is supported by several Windows compilers but generally
|
||||
@@ -962,6 +990,7 @@ namespace testing {
|
||||
|
||||
class Message;
|
||||
|
||||
#if defined(GTEST_TUPLE_NAMESPACE_)
|
||||
// Import tuple and friends into the ::testing namespace.
|
||||
// It is part of our interface, having them in ::testing allows us to change
|
||||
// their types as needed.
|
||||
@@ -970,6 +999,7 @@ using GTEST_TUPLE_NAMESPACE_::make_tuple;
|
||||
using GTEST_TUPLE_NAMESPACE_::tuple;
|
||||
using GTEST_TUPLE_NAMESPACE_::tuple_size;
|
||||
using GTEST_TUPLE_NAMESPACE_::tuple_element;
|
||||
#endif // defined(GTEST_TUPLE_NAMESPACE_)
|
||||
|
||||
namespace internal {
|
||||
|
||||
@@ -1049,7 +1079,9 @@ template <typename T1, typename T2>
|
||||
struct StaticAssertTypeEqHelper;
|
||||
|
||||
template <typename T>
|
||||
struct StaticAssertTypeEqHelper<T, T> {};
|
||||
struct StaticAssertTypeEqHelper<T, T> {
|
||||
enum { value = true };
|
||||
};
|
||||
|
||||
// Evaluates to the number of elements in 'array'.
|
||||
#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
|
||||
@@ -1101,6 +1133,11 @@ class scoped_ptr {
|
||||
}
|
||||
}
|
||||
|
||||
friend void swap(scoped_ptr& a, scoped_ptr& b) {
|
||||
using std::swap;
|
||||
swap(a.ptr_, b.ptr_);
|
||||
}
|
||||
|
||||
private:
|
||||
T* ptr_;
|
||||
|
||||
@@ -1312,9 +1349,9 @@ inline To DownCast_(From* f) { // so we only accept pointers
|
||||
// for compile-time type checking, and has no overhead in an
|
||||
// optimized build at run-time, as it will be optimized away
|
||||
// completely.
|
||||
GTEST_INTENTIONAL_CONST_COND_PUSH_
|
||||
GTEST_INTENTIONAL_CONST_COND_PUSH_()
|
||||
if (false) {
|
||||
GTEST_INTENTIONAL_CONST_COND_POP_
|
||||
GTEST_INTENTIONAL_CONST_COND_POP_()
|
||||
const To to = NULL;
|
||||
::testing::internal::ImplicitCast_<From*>(to);
|
||||
}
|
||||
@@ -2203,11 +2240,7 @@ inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
|
||||
|
||||
// Functions deprecated by MSVC 8.0.
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// Temporarily disable warning 4996 (deprecated function).
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4996)
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */)
|
||||
|
||||
inline const char* StrNCpy(char* dest, const char* src, size_t n) {
|
||||
return strncpy(dest, src, n);
|
||||
@@ -2217,7 +2250,7 @@ inline const char* StrNCpy(char* dest, const char* src, size_t n) {
|
||||
// StrError() aren't needed on Windows CE at this time and thus not
|
||||
// defined there.
|
||||
|
||||
#if !GTEST_OS_WINDOWS_MOBILE
|
||||
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
|
||||
inline int ChDir(const char* dir) { return chdir(dir); }
|
||||
#endif
|
||||
inline FILE* FOpen(const char* path, const char* mode) {
|
||||
@@ -2241,7 +2274,7 @@ inline int Close(int fd) { return close(fd); }
|
||||
inline const char* StrError(int errnum) { return strerror(errnum); }
|
||||
#endif
|
||||
inline const char* GetEnv(const char* name) {
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE | GTEST_OS_WINDOWS_RT
|
||||
// We are on Windows CE, which has no environment variables.
|
||||
return NULL;
|
||||
#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
|
||||
@@ -2254,9 +2287,7 @@ inline const char* GetEnv(const char* name) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# pragma warning(pop) // Restores the warning state.
|
||||
#endif
|
||||
GTEST_DISABLE_MSC_WARNINGS_POP_()
|
||||
|
||||
#if GTEST_OS_WINDOWS_MOBILE
|
||||
// Windows CE has no C library. The abort() function is used in
|
||||
@@ -2396,3 +2427,4 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
|
||||
} // namespace testing
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
|
||||
|
||||
|
||||
Reference in New Issue
Block a user