15 #include "absl/random/internal/traits.h"
18 #include <type_traits>
20 #include "gtest/gtest.h"
32 void CheckWideningConvertsToSelf() {
34 "Type is not convertible to self!");
37 template <
typename T,
typename Next,
typename...
Args>
38 void CheckWideningConvertsToSelf() {
39 CheckWideningConvertsToSelf<T>();
40 CheckWideningConvertsToSelf<
Next,
Args...>();
50 void CheckNotWideningConvertibleWithSigned() {
54 "Unsigned type is convertible to same-sized signed-type!");
56 "Signed type is convertible to same-sized unsigned-type!");
59 template <
typename T,
typename Next,
typename...
Args>
60 void CheckNotWideningConvertibleWithSigned() {
61 CheckNotWideningConvertibleWithSigned<T>();
62 CheckWideningConvertsToSelf<
Next,
Args...>();
72 template <
typename T,
typename Higher>
73 void CheckWideningConvertsToLargerTypes() {
75 using higher_t = Higher;
79 "Type not embeddable into larger type!");
81 "Type not embeddable into larger signed type!");
83 "Signed type is embeddable into larger unsigned type!");
85 "Signed type not embeddable into larger signed type!");
88 template <
typename T,
typename Higher,
typename Next,
typename...
Args>
89 void CheckWideningConvertsToLargerTypes() {
90 CheckWideningConvertsToLargerTypes<T, Higher>();
91 CheckWideningConvertsToLargerTypes<Higher,
Next,
Args...>();
98 template <
typename T,
typename U,
bool expect = true>
99 void CheckWideningConvertsTo() {
101 "Unexpected result for is_widening_convertible<T, U>!");
104 TEST(TraitsTest, IsWideningConvertibleTest) {
107 CheckWideningConvertsToSelf<
111 CheckNotWideningConvertibleWithSigned<
113 CheckWideningConvertsToLargerTypes<
116 CheckWideningConvertsTo<float, double>();
117 CheckWideningConvertsTo<uint16_t, float>();
118 CheckWideningConvertsTo<uint32_t, double>();
119 CheckWideningConvertsTo<uint64_t, double, kInvalid>();
120 CheckWideningConvertsTo<double, float, kInvalid>();
122 CheckWideningConvertsTo<bool, int>();
123 CheckWideningConvertsTo<bool, float>();