1414
1515LIBASSERT_BEGIN_NAMESPACE
1616namespace 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