Skip to content

Commit

Permalink
Merge f10c074 into a556cb1
Browse files Browse the repository at this point in the history
  • Loading branch information
srz-zumix committed May 21, 2020
2 parents a556cb1 + f10c074 commit bb669a5
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 7 deletions.
11 changes: 11 additions & 0 deletions include/internal/iutest_type_traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1093,6 +1093,17 @@ class function_return_type
typedef typename impl< typename remove_cv<T>::type >::type type;
};

#if IUTEST_HAS_CXX_HDR_VARIANT && IUTEST_HAS_VARIADIC_TEMPLATES

template<typename T>
struct is_variant : public false_type {};

template<typename ...T>
struct is_variant< ::std::variant<T...> > : public true_type {};


#endif

#endif // #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)

} // end of namespace iutest_type_traits
Expand Down
56 changes: 49 additions & 7 deletions include/iutest_assertion.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -459,34 +459,81 @@ inline AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2,
* @private
* @{
*/

#define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_BASE_(op_name, op) \
template<typename T1, typename T2> \
bool iuOperator##op_name(const T1& v1, const T2& v2) { \
return v1 op v2; \
}

#if IUTEST_HAS_CXX_HDR_VARIANT && IUTEST_HAS_VARIADIC_TEMPLATES
#define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(op_name, op) \
template<typename ...V1, typename ...V2> \
bool iuOperator##op_name(const ::std::variant<V1...>&& v1, const ::std::variant<V2...>& v2) { \
return v1 op v2; \
} \
template<typename T1, typename ...V> \
bool iuOperator##op_name(const T1& v1, const ::std::variant<V...>& v2 \
, typename detail::enable_if< !detail::is_variant<T1>::value, void>::type*& = detail::enabler::value ) { \
::std::variant<V...> vv1(v1); return vv1 op v2; \
} \
template<typename ...V, typename T2> \
bool iuOperator##op_name(const ::std::variant<V...>& v1, const T2& v2 \
, typename detail::enable_if< !detail::is_variant<T2>::value, void>::type*& = detail::enabler::value ) { \
::std::variant<V...> vv2(v2); return v1 op vv2; \
}
#else
#define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(op_name, op)
#endif

#define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_(op_name, op) \
IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_BASE_(op_name, op) \
IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(op_name, op)

#define IIUT_DECL_COMPARE_HELPER_I_(op_name, op, type1, type2) \
inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelper##op_name( \
const char* expr1, const char* expr2, type1 val1, type2 val2) { \
if( val1 op val2 ) { return AssertionSuccess(); \
if( iuOperator##op_name(val1, val2) ) { return AssertionSuccess(); \
} else { return CmpHelperOpFailure(expr1, expr2, #op, val1, val2); } \
}

#if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)

#define IIUT_DECL_COMPARE_HELPER_(op_name, op) \
IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_(op_name, op) \
template<typename T1, typename T2> \
IIUT_DECL_COMPARE_HELPER_I_(op_name, op, const T1&, const T2&) \
IIUT_DECL_COMPARE_HELPER_I_(op_name, op, BiggestInt, BiggestInt)

#else

#define IIUT_DECL_COMPARE_HELPER_(op_name, op) \
IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_(op_name, op) \
template<typename T1, typename T2> \
IIUT_DECL_COMPARE_HELPER_I_(op_name, op, const T1&, const T2&)

#endif

template<typename T1, typename T2>
bool iuOperatorEQ(const T1& v1, const T2& v2)
{
IUTEST_PRAGMA_WARN_PUSH()
IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
return v1 == v2;
IUTEST_PRAGMA_WARN_POP()
}
IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(EQ, ==)

IIUT_DECL_COMPARE_HELPER_(NE, !=)
IIUT_DECL_COMPARE_HELPER_(LE, <=)
IIUT_DECL_COMPARE_HELPER_(LT, < )
IIUT_DECL_COMPARE_HELPER_(GE, >=)
IIUT_DECL_COMPARE_HELPER_(GT, > )


#undef IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_
#undef IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_BASE
#undef IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT
#undef IIUT_DECL_COMPARE_HELPER_I_
#undef IIUT_DECL_COMPARE_HELPER_

Expand Down Expand Up @@ -563,10 +610,7 @@ template<typename T1, typename T2>
inline AssertionResult CmpHelperEQ(const char* expected_str, const char* actual_str
, const T1& expected, const T2& actual)
{
IUTEST_PRAGMA_WARN_PUSH()
IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()

if( actual == expected )
if( iuOperatorEQ(actual, expected) )
{
return AssertionSuccess();
}
Expand All @@ -575,8 +619,6 @@ IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
, FormatForComparisonFailureMessage(expected, actual)
, FormatForComparisonFailureMessage(actual, expected)
);

IUTEST_PRAGMA_WARN_POP()
}

template<typename T>
Expand Down
87 changes: 87 additions & 0 deletions test/cxx_feature_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,93 @@ IUTEST(Variant, Compare)
}
}

IUTEST(Variant, CompareRawType)
{
::std::variant<int, float, ::std::string> v = 1;
IUTEST_EXPECT_EQ(1, v);
IUTEST_EXPECT_EQ(v, 1);
IUTEST_EXPECT_NE(0, v);
IUTEST_EXPECT_NE(v, 0);
IUTEST_EXPECT_LE(1, v);
IUTEST_EXPECT_LE(v, 1);
IUTEST_EXPECT_LT(0, v);
IUTEST_EXPECT_LT(v, 2);
IUTEST_EXPECT_GE(1, v);
IUTEST_EXPECT_GE(v, 1);
IUTEST_EXPECT_GT(2, v);
IUTEST_EXPECT_GT(v, 0);
}

#if IUTEST_HAS_EXCEPTIONS
struct AlwaysThrow
{
AlwaysThrow() = default;
AlwaysThrow(const AlwaysThrow &)
{
throw std::exception();
}
AlwaysThrow(AlwaysThrow &&)
{
throw std::exception();
}
AlwaysThrow &operator=(const AlwaysThrow &)
{
throw std::exception();
}
AlwaysThrow &operator=(AlwaysThrow &&)
{
throw std::exception();
}
};
#endif

IUTEST(Variant, PrintTo)
{
{
PrintToLogChecker ck("1234");
::std::variant<int, float, ::std::string> v = 1234;
IUTEST_SUCCEED() << ::iutest::PrintToString(v);
}
{
PrintToLogChecker ck("test");
::std::variant<int, float, ::std::string> v("test");
IUTEST_SUCCEED() << ::iutest::PrintToString(v);
}
{
PrintToLogChecker ck("monostate");
::std::variant<std::monostate, int, float, std::string> v;
IUTEST_SUCCEED() << ::iutest::PrintToString(v);
}
#if IUTEST_HAS_EXCEPTIONS
{
PrintToLogChecker ck("valueless_by_exception");
::std::variant<int, float, AlwaysThrow> v = 0.2f;
try
{
struct S { operator int() { throw 42; } };
v.emplace<0>(S());
}
catch(...)
{
IUTEST_INFORM_TRUE(v.valueless_by_exception());
}
if( !v.valueless_by_exception() )
{
try
{
v = AlwaysThrow();
}
catch(...)
{
IUTEST_INFORM_TRUE(v.valueless_by_exception());
}
}

IUTEST_SUCCEED() << ::iutest::PrintToString(v);
}
#endif
}

#endif

#if IUTEST_HAS_CXX_HDR_ARRAY
Expand Down

0 comments on commit bb669a5

Please sign in to comment.