Renames some internal functions to avoid name clashes.
This commit is contained in:
parent
48b1315108
commit
a198966dd3
|
@ -404,22 +404,22 @@ GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
|
||||||
// Overloads for C strings.
|
// Overloads for C strings.
|
||||||
GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
|
GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
|
||||||
inline void PrintTo(char* s, ::std::ostream* os) {
|
inline void PrintTo(char* s, ::std::ostream* os) {
|
||||||
PrintTo(implicit_cast<const char*>(s), os);
|
PrintTo(ImplicitCast_<const char*>(s), os);
|
||||||
}
|
}
|
||||||
|
|
||||||
// signed/unsigned char is often used for representing binary data, so
|
// signed/unsigned char is often used for representing binary data, so
|
||||||
// we print pointers to it as void* to be safe.
|
// we print pointers to it as void* to be safe.
|
||||||
inline void PrintTo(const signed char* s, ::std::ostream* os) {
|
inline void PrintTo(const signed char* s, ::std::ostream* os) {
|
||||||
PrintTo(implicit_cast<const void*>(s), os);
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
}
|
}
|
||||||
inline void PrintTo(signed char* s, ::std::ostream* os) {
|
inline void PrintTo(signed char* s, ::std::ostream* os) {
|
||||||
PrintTo(implicit_cast<const void*>(s), os);
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
}
|
}
|
||||||
inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
|
inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
|
||||||
PrintTo(implicit_cast<const void*>(s), os);
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
}
|
}
|
||||||
inline void PrintTo(unsigned char* s, ::std::ostream* os) {
|
inline void PrintTo(unsigned char* s, ::std::ostream* os) {
|
||||||
PrintTo(implicit_cast<const void*>(s), os);
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
}
|
}
|
||||||
|
|
||||||
// MSVC can be configured to define wchar_t as a typedef of unsigned
|
// MSVC can be configured to define wchar_t as a typedef of unsigned
|
||||||
|
@ -431,7 +431,7 @@ inline void PrintTo(unsigned char* s, ::std::ostream* os) {
|
||||||
// Overloads for wide C strings
|
// Overloads for wide C strings
|
||||||
GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
|
GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
|
||||||
inline void PrintTo(wchar_t* s, ::std::ostream* os) {
|
inline void PrintTo(wchar_t* s, ::std::ostream* os) {
|
||||||
PrintTo(implicit_cast<const wchar_t*>(s), os);
|
PrintTo(ImplicitCast_<const wchar_t*>(s), os);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -919,25 +919,29 @@ inline void FlushInfoLog() { fflush(NULL); }
|
||||||
|
|
||||||
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
||||||
//
|
//
|
||||||
// Use implicit_cast as a safe version of static_cast for upcasting in
|
// Use ImplicitCast_ as a safe version of static_cast for upcasting in
|
||||||
// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
|
// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
|
||||||
// const Foo*). When you use implicit_cast, the compiler checks that
|
// const Foo*). When you use ImplicitCast_, the compiler checks that
|
||||||
// the cast is safe. Such explicit implicit_casts are necessary in
|
// the cast is safe. Such explicit ImplicitCast_s are necessary in
|
||||||
// surprisingly many situations where C++ demands an exact type match
|
// surprisingly many situations where C++ demands an exact type match
|
||||||
// instead of an argument type convertable to a target type.
|
// instead of an argument type convertable to a target type.
|
||||||
//
|
//
|
||||||
// The syntax for using implicit_cast is the same as for static_cast:
|
// The syntax for using ImplicitCast_ is the same as for static_cast:
|
||||||
//
|
//
|
||||||
// implicit_cast<ToType>(expr)
|
// ImplicitCast_<ToType>(expr)
|
||||||
//
|
//
|
||||||
// implicit_cast would have been part of the C++ standard library,
|
// ImplicitCast_ would have been part of the C++ standard library,
|
||||||
// but the proposal was submitted too late. It will probably make
|
// but the proposal was submitted too late. It will probably make
|
||||||
// its way into the language in the future.
|
// its way into the language in the future.
|
||||||
|
//
|
||||||
|
// This relatively ugly name is intentional. It prevents clashes with
|
||||||
|
// similar functions users may have (e.g., implicit_cast). The internal
|
||||||
|
// namespace alone is not enough because the function can be found by ADL.
|
||||||
template<typename To>
|
template<typename To>
|
||||||
inline To implicit_cast(To x) { return x; }
|
inline To ImplicitCast_(To x) { return x; }
|
||||||
|
|
||||||
// When you upcast (that is, cast a pointer from type Foo to type
|
// When you upcast (that is, cast a pointer from type Foo to type
|
||||||
// SuperclassOfFoo), it's fine to use implicit_cast<>, since upcasts
|
// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
|
||||||
// always succeed. When you downcast (that is, cast a pointer from
|
// always succeed. When you downcast (that is, cast a pointer from
|
||||||
// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
|
// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
|
||||||
// how do you know the pointer is really of type SubclassOfFoo? It
|
// how do you know the pointer is really of type SubclassOfFoo? It
|
||||||
|
@ -953,15 +957,19 @@ inline To implicit_cast(To x) { return x; }
|
||||||
// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
|
// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
|
||||||
// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
|
// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
|
||||||
// You should design the code some other way not to need this.
|
// You should design the code some other way not to need this.
|
||||||
template<typename To, typename From> // use like this: down_cast<T*>(foo);
|
//
|
||||||
inline To down_cast(From* f) { // so we only accept pointers
|
// This relatively ugly name is intentional. It prevents clashes with
|
||||||
|
// similar functions users may have (e.g., down_cast). The internal
|
||||||
|
// namespace alone is not enough because the function can be found by ADL.
|
||||||
|
template<typename To, typename From> // use like this: DownCast_<T*>(foo);
|
||||||
|
inline To DownCast_(From* f) { // so we only accept pointers
|
||||||
// Ensures that To is a sub-type of From *. This test is here only
|
// Ensures that To is a sub-type of From *. This test is here only
|
||||||
// for compile-time type checking, and has no overhead in an
|
// for compile-time type checking, and has no overhead in an
|
||||||
// optimized build at run-time, as it will be optimized away
|
// optimized build at run-time, as it will be optimized away
|
||||||
// completely.
|
// completely.
|
||||||
if (false) {
|
if (false) {
|
||||||
const To to = NULL;
|
const To to = NULL;
|
||||||
::testing::internal::implicit_cast<From*>(to);
|
::testing::internal::ImplicitCast_<From*>(to);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTEST_HAS_RTTI
|
#if GTEST_HAS_RTTI
|
||||||
|
|
|
@ -308,7 +308,7 @@ void PrintTo(const char* s, ostream* os) {
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
*os << "NULL";
|
*os << "NULL";
|
||||||
} else {
|
} else {
|
||||||
*os << implicit_cast<const void*>(s) << " pointing to ";
|
*os << ImplicitCast_<const void*>(s) << " pointing to ";
|
||||||
PrintCharsAsStringTo(s, strlen(s), os);
|
PrintCharsAsStringTo(s, strlen(s), os);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,7 +325,7 @@ void PrintTo(const wchar_t* s, ostream* os) {
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
*os << "NULL";
|
*os << "NULL";
|
||||||
} else {
|
} else {
|
||||||
*os << implicit_cast<const void*>(s) << " pointing to ";
|
*os << ImplicitCast_<const void*>(s) << " pointing to ";
|
||||||
PrintWideCharsAsStringTo(s, wcslen(s), os);
|
PrintWideCharsAsStringTo(s, wcslen(s), os);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,12 +79,12 @@ class Derived : public Base {
|
||||||
|
|
||||||
TEST(ImplicitCastTest, ConvertsPointers) {
|
TEST(ImplicitCastTest, ConvertsPointers) {
|
||||||
Derived derived(0);
|
Derived derived(0);
|
||||||
EXPECT_TRUE(&derived == ::testing::internal::implicit_cast<Base*>(&derived));
|
EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ImplicitCastTest, CanUseInheritance) {
|
TEST(ImplicitCastTest, CanUseInheritance) {
|
||||||
Derived derived(1);
|
Derived derived(1);
|
||||||
Base base = ::testing::internal::implicit_cast<Base>(derived);
|
Base base = ::testing::internal::ImplicitCast_<Base>(derived);
|
||||||
EXPECT_EQ(derived.member(), base.member());
|
EXPECT_EQ(derived.member(), base.member());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ class Castable {
|
||||||
TEST(ImplicitCastTest, CanUseNonConstCastOperator) {
|
TEST(ImplicitCastTest, CanUseNonConstCastOperator) {
|
||||||
bool converted = false;
|
bool converted = false;
|
||||||
Castable castable(&converted);
|
Castable castable(&converted);
|
||||||
Base base = ::testing::internal::implicit_cast<Base>(castable);
|
Base base = ::testing::internal::ImplicitCast_<Base>(castable);
|
||||||
EXPECT_TRUE(converted);
|
EXPECT_TRUE(converted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ class ConstCastable {
|
||||||
TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {
|
TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {
|
||||||
bool converted = false;
|
bool converted = false;
|
||||||
const ConstCastable const_castable(&converted);
|
const ConstCastable const_castable(&converted);
|
||||||
Base base = ::testing::internal::implicit_cast<Base>(const_castable);
|
Base base = ::testing::internal::ImplicitCast_<Base>(const_castable);
|
||||||
EXPECT_TRUE(converted);
|
EXPECT_TRUE(converted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,14 +148,14 @@ TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) {
|
||||||
bool converted = false;
|
bool converted = false;
|
||||||
bool const_converted = false;
|
bool const_converted = false;
|
||||||
ConstAndNonConstCastable castable(&converted, &const_converted);
|
ConstAndNonConstCastable castable(&converted, &const_converted);
|
||||||
Base base = ::testing::internal::implicit_cast<Base>(castable);
|
Base base = ::testing::internal::ImplicitCast_<Base>(castable);
|
||||||
EXPECT_TRUE(converted);
|
EXPECT_TRUE(converted);
|
||||||
EXPECT_FALSE(const_converted);
|
EXPECT_FALSE(const_converted);
|
||||||
|
|
||||||
converted = false;
|
converted = false;
|
||||||
const_converted = false;
|
const_converted = false;
|
||||||
const ConstAndNonConstCastable const_castable(&converted, &const_converted);
|
const ConstAndNonConstCastable const_castable(&converted, &const_converted);
|
||||||
base = ::testing::internal::implicit_cast<Base>(const_castable);
|
base = ::testing::internal::ImplicitCast_<Base>(const_castable);
|
||||||
EXPECT_FALSE(converted);
|
EXPECT_FALSE(converted);
|
||||||
EXPECT_TRUE(const_converted);
|
EXPECT_TRUE(const_converted);
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ class To {
|
||||||
|
|
||||||
TEST(ImplicitCastTest, CanUseImplicitConstructor) {
|
TEST(ImplicitCastTest, CanUseImplicitConstructor) {
|
||||||
bool converted = false;
|
bool converted = false;
|
||||||
To to = ::testing::internal::implicit_cast<To>(&converted);
|
To to = ::testing::internal::ImplicitCast_<To>(&converted);
|
||||||
(void)to;
|
(void)to;
|
||||||
EXPECT_TRUE(converted);
|
EXPECT_TRUE(converted);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user