Skip to content

Commit

Permalink
Googletest export
Browse files Browse the repository at this point in the history
Merge b8ca465 into 90a443f

Closes google#2396

COPYBARA_INTEGRATE_REVIEW=google#2396 from kuzkry:custom-type-traits-true/false_type-and-bool_constant b8ca465
PiperOrigin-RevId: 265064856
  • Loading branch information
kuzkry authored and Xiaoyi Zhang committed Aug 23, 2019
1 parent 46525e1 commit db1b739
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 50 deletions.
30 changes: 13 additions & 17 deletions googlemock/include/gmock/gmock-matchers.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,19 +132,16 @@ class MatcherCastImpl {
// polymorphic_matcher_or_value to Matcher<T> because it won't trigger
// a user-defined conversion from M to T if one exists (assuming M is
// a value).
return CastImpl(
polymorphic_matcher_or_value,
BooleanConstant<
std::is_convertible<M, Matcher<T> >::value>(),
BooleanConstant<
std::is_convertible<M, T>::value>());
return CastImpl(polymorphic_matcher_or_value,
bool_constant<std::is_convertible<M, Matcher<T>>::value>(),
bool_constant<std::is_convertible<M, T>::value>());
}

private:
template <bool Ignore>
static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,
BooleanConstant<true> /* convertible_to_matcher */,
BooleanConstant<Ignore>) {
bool_constant<true> /* convertible_to_matcher */,
bool_constant<Ignore>) {
// M is implicitly convertible to Matcher<T>, which means that either
// M is a polymorphic matcher or Matcher<T> has an implicit constructor
// from M. In both cases using the implicit conversion will produce a
Expand All @@ -159,9 +156,9 @@ class MatcherCastImpl {
// M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
// matcher. It's a value of a type implicitly convertible to T. Use direct
// initialization to create a matcher.
static Matcher<T> CastImpl(
const M& value, BooleanConstant<false> /* convertible_to_matcher */,
BooleanConstant<true> /* convertible_to_T */) {
static Matcher<T> CastImpl(const M& value,
bool_constant<false> /* convertible_to_matcher */,
bool_constant<true> /* convertible_to_T */) {
return Matcher<T>(ImplicitCast_<T>(value));
}

Expand All @@ -175,9 +172,9 @@ class MatcherCastImpl {
// (e.g. std::pair<const int, int> vs. std::pair<int, int>).
//
// We don't define this method inline as we need the declaration of Eq().
static Matcher<T> CastImpl(
const M& value, BooleanConstant<false> /* convertible_to_matcher */,
BooleanConstant<false> /* convertible_to_T */);
static Matcher<T> CastImpl(const M& value,
bool_constant<false> /* convertible_to_matcher */,
bool_constant<false> /* convertible_to_T */);
};

// This more specialized version is used when MatcherCast()'s argument
Expand Down Expand Up @@ -3603,9 +3600,8 @@ inline Matcher<T> An() { return A<T>(); }

template <typename T, typename M>
Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl(
const M& value,
internal::BooleanConstant<false> /* convertible_to_matcher */,
internal::BooleanConstant<false> /* convertible_to_T */) {
const M& value, internal::bool_constant<false> /* convertible_to_matcher */,
internal::bool_constant<false> /* convertible_to_T */) {
return Eq(value);
}

Expand Down
21 changes: 8 additions & 13 deletions googlemock/include/gmock/internal/gmock-internal-utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,27 +170,27 @@ GMOCK_DECLARE_KIND_(long double, kFloatingPoint);
// 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 {};
struct LosslessArithmeticConvertibleImpl : public std::false_type {};

// Converting bool to bool is lossless.
template <>
struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool>
: public true_type {}; // NOLINT
: public std::true_type {};

// Converting bool to any integer type is lossless.
template <typename To>
struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To>
: public true_type {}; // NOLINT
: public std::true_type {};

// Converting bool to any floating-point type is lossless.
template <typename To>
struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To>
: public true_type {}; // NOLINT
: public std::true_type {};

// Converting an integer to bool is lossy.
template <typename From>
struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool>
: public false_type {}; // NOLINT
: public std::false_type {};

// Converting an integer to another non-bool integer is lossless if
// the target type's range encloses the source type's range.
Expand All @@ -211,17 +211,17 @@ struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To>
// 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
: public std::false_type {};

// Converting a floating-point to bool is lossy.
template <typename From>
struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool>
: public false_type {}; // NOLINT
: public std::false_type {};

// Converting a floating-point to an integer is lossy.
template <typename From, typename To>
struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To>
: public false_type {}; // NOLINT
: public std::false_type {};

// Converting a floating-point to another floating-point is lossless
// if the target type is at least as big as the source type.
Expand Down Expand Up @@ -470,11 +470,6 @@ struct RemoveConstFromKey<std::pair<const K, V> > {
typedef std::pair<K, V> type;
};

// Mapping from booleans to types. Similar to boost::bool_<kValue> and
// std::integral_constant<bool, kValue>.
template <bool kValue>
struct BooleanConstant {};

// Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to
// reduce code size.
GTEST_API_ void IllegalDoDefault(const char* file, int line);
Expand Down
15 changes: 5 additions & 10 deletions googlemock/test/gmock-internal-utils_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,20 @@
// This file tests the internal utilities.

#include "gmock/internal/gmock-internal-utils.h"

#include <stdlib.h>

#include <map>
#include <memory>
#include <string>
#include <sstream>
#include <string>
#include <type_traits>
#include <vector>

#include "gmock/gmock.h"
#include "gmock/internal/gmock-port.h"
#include "gtest/gtest.h"
#include "gtest/gtest-spi.h"
#include "gtest/gtest.h"

// Indicates that this translation unit is part of Google Test's
// implementation. It must come before gtest-internal-inl.h is
Expand Down Expand Up @@ -505,14 +508,6 @@ TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {

#endif // GTEST_HAS_STREAM_REDIRECTION

TEST(TypeTraitsTest, true_type) {
EXPECT_TRUE(true_type::value);
}

TEST(TypeTraitsTest, false_type) {
EXPECT_FALSE(false_type::value);
}

TEST(TypeTraitsTest, remove_reference) {
EXPECT_TRUE((std::is_same<char, remove_reference<char&>::type>::value));
EXPECT_TRUE(
Expand Down
2 changes: 1 addition & 1 deletion googletest/include/gtest/internal/gtest-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -946,7 +946,7 @@ template <typename C,
struct IsRecursiveContainerImpl;

template <typename C>
struct IsRecursiveContainerImpl<C, false> : public false_type {};
struct IsRecursiveContainerImpl<C, false> : public std::false_type {};

// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to
// obey the same inconsistencies as the IsContainerTest, namely check if
Expand Down
11 changes: 2 additions & 9 deletions googletest/include/gtest/internal/gtest-port.h
Original file line number Diff line number Diff line change
Expand Up @@ -1898,15 +1898,8 @@ class GTEST_API_ ThreadLocal {
// we cannot detect it.
GTEST_API_ size_t GetThreadCount();

template <bool bool_value>
struct bool_constant {
typedef bool_constant<bool_value> type;
static const bool value = bool_value;
};
template <bool bool_value> const bool bool_constant<bool_value>::value;

typedef bool_constant<false> false_type;
typedef bool_constant<true> true_type;
template <bool B>
using bool_constant = std::integral_constant<bool, B>;

template <typename Iterator>
struct IteratorTraits {
Expand Down

0 comments on commit db1b739

Please sign in to comment.