Skip to content

Commit 0f3377e

Browse files
committed
Update expression-decomposition.hpp
1 parent 15fdd9a commit 0f3377e

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

include/libassert/expression-decomposition.hpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
LIBASSERT_BEGIN_NAMESPACE
1616
namespace detail {
17+
template<typename T>
18+
inline constexpr bool is_pointer_or_member_pointer = std::is_pointer_v<strip<T>> || std::is_member_pointer_v<strip<T>>;
1719
// Lots of boilerplate
1820
// std:: implementations don't allow two separate types for lhs/rhs
1921
// Note: is this macro potentially bad when it comes to debugging(?)
@@ -168,7 +170,7 @@ namespace detail {
168170
struct expression_decomposer<nothing, nothing, nothing> {
169171
explicit constexpr expression_decomposer() = default;
170172
#define LIBASSERT_GEN_BITFIELD_BOILERPLATE(type)\
171-
template<typename Delay = type>[[nodiscard]] constexpr auto operator<<(const type& operand)&& {\
173+
template<typename Delay = type>[[nodiscard]] constexpr auto operator<<(type operand)&& {\
172174
return expression_decomposer<Delay, nothing, nothing>(operand);\
173175
}
174176

@@ -188,7 +190,7 @@ namespace detail {
188190
#undef LIBASSERT_GEN_BITFIELD_BOILERPLATE
189191

190192

191-
template<typename O> [[nodiscard]] constexpr auto operator<<(O&& operand) && {
193+
template<typename O,std::enable_if_t<!std::is_integral_v<strip<O>>,int> = 0> [[nodiscard]] constexpr auto operator<<(O&& operand) && {
192194
return expression_decomposer<O, nothing, nothing>(std::forward<O>(operand));
193195
}
194196
};
@@ -262,38 +264,36 @@ namespace detail {
262264
// and rvalues as rvalues.
263265
return std::forward<A>(a);
264266
}
265-
template<typename Depend = std::remove_reference_t<A>,std::enable_if_t<
266-
std::is_member_pointer_v<Depend> || std::is_pointer_v<Depend>,int> = 0
267-
>
268-
constexpr auto operator==(decltype(NULL)) &&
267+
template<typename Null,std::enable_if_t<
268+
std::is_integral_v<Null> && is_pointer_or_member_pointer<A>,int> = 0>
269+
constexpr auto operator==(Null) &&
269270
{
270271
return expression_decomposer<A, std::nullptr_t, ops::eq>(std::forward<A>(a), nullptr);
271272
}
272273

273-
template<typename Depend = A, std::enable_if_t<isa<Depend,decltype(NULL)>, int> = 0
274-
,typename Pointer>
275-
constexpr auto operator==(Pointer* pointer)&&
274+
template<typename Pointer, std::enable_if_t<
275+
is_pointer_or_member_pointer<Pointer> && std::is_integral_v<strip<A>>, int> = 0>
276+
constexpr auto operator==(Pointer&& pointer) &&
276277
{
277-
return expression_decomposer<std::nullptr_t , Pointer*, ops::eq > (nullptr, pointer);
278+
return expression_decomposer<std::nullptr_t , Pointer, ops::eq > (nullptr, std::forward<Pointer>(pointer));
278279
}
279280

280-
template<typename Depend = std::remove_reference_t<A>, std::enable_if_t<
281-
std::is_member_pointer_v<Depend> || std::is_pointer_v<Depend>, int> = 0
282-
>
283-
constexpr auto operator!=(decltype(NULL))&&
281+
template<typename Null, std::enable_if_t<std::is_integral_v<Null> && is_pointer_or_member_pointer<A>, int> = 0>
282+
constexpr auto operator!=(Null) &&
284283
{
285284
return expression_decomposer<A, std::nullptr_t, ops::neq>(std::forward<A>(a), nullptr);
286285
}
287286

288-
template<typename Depend = A, std::enable_if_t<isa<Depend, decltype(NULL)>, int> = 0
289-
, typename Pointer>
290-
constexpr auto operator!=(Pointer* pointer)&&
287+
template<typename Pointer, std::enable_if_t<
288+
is_pointer_or_member_pointer<Pointer> &&
289+
std::is_integral_v<strip<A>>,int> = 0>
290+
constexpr auto operator!=(Pointer&& pointer) &&
291291
{
292-
return expression_decomposer<std::nullptr_t, Pointer*, ops::neq>(nullptr, pointer);
292+
return expression_decomposer<std::nullptr_t, Pointer, ops::neq>(nullptr, std::forward<Pointer>(pointer));
293293
}
294-
294+
295295
#define LIBASSERT_GEN_OP_BOILERPLATE(functor, op) \
296-
template<typename O> [[nodiscard]] constexpr auto operator op(O&& operand) && { \
296+
template<typename O,std::enable_if_t<!((std::is_integral_v<strip<O>> && is_pointer_or_member_pointer<A>) || (std::is_integral_v<strip<A>> && is_pointer_or_member_pointer<O>)),int> = 0> [[nodiscard]] constexpr auto operator op(O&& operand) && { \
297297
return expression_decomposer<A, O, functor>(std::forward<A>(a), std::forward<O>(operand)); \
298298
}
299299
LIBASSERT_DO_GEN_OP_BOILERPLATE

0 commit comments

Comments
 (0)