|
|
|
@ -920,62 +920,14 @@ struct RemoveConst<const T[N]> { |
|
|
|
|
#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ |
|
|
|
|
GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) |
|
|
|
|
|
|
|
|
|
// 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 typename AddReference<From>::type 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: |
|
|
|
|
#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; |
|
|
|
|
GTEST_DISABLE_MSC_WARNINGS_POP_() |
|
|
|
|
#endif // __BORLANDC__
|
|
|
|
|
}; |
|
|
|
|
template <typename From, typename To> |
|
|
|
|
const bool ImplicitlyConvertible<From, To>::value; |
|
|
|
|
|
|
|
|
|
// 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> { |
|
|
|
|
std::is_convertible<const T*, const ::ProtocolMessage*>::value || |
|
|
|
|
std::is_convertible<const T*, const ::proto2::Message*>::value> { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// When the compiler sees expression IsContainerTest<C>(0), if C is an
|
|
|
|
|