boost icon indicating copy to clipboard operation
boost copied to clipboard

BOOST_UNLIKELY and boost::system::error_code

Open ujos opened this issue 1 year ago • 1 comments

Could you please modify the BOOST_LIKELY and BOOST_UNLIKELY macros in the following way:

#define BOOST_LIKELY(x)   (__builtin_expect(!!(x), 1))
#define BOOST_UNLIKELY(x) (__builtin_expect(!!(x), 0))

  1. I cannot easily use BOOST_UNLIKELY with boost::system::error_code. Compiler complains
error: cannot convert ‘boost::system::error_code’ to ‘long int’ for argument ‘1’ to ‘long int __builtin_expect(long int, long int)’
[build]      if (BOOST_UNLIKELY (ec)) {
[build]          ^ 

To workaround the problem I should use macro like following:

if (BOOST_UNLIKELY (!!ec))

... which looks weird and causes unwanted questions during the code review.

  1. I have to add extra braces:
if (BOOST_UNLIKELY (!!ec))
   ^ -- here             ^ --- and here

... instead of:

if BOOST_UNLIKELY (ec)
{
}

ujos avatar Jun 04 '24 10:06 ujos

To modify the BOOST_LIKELY and BOOST_UNLIKELY macros to handle boost::system::error_code, you can redefine them to ensure compatibility without needing additional braces. Here's the updated version:

#define BOOST_UNLIKELY(x) (__builtin_expect(static_cast<bool>(x), 0))

This approach uses static_cast<bool>(x) to explicitly cast the condition to a boolean type, making it compatible with boost::system::error_code and similar types. This allows you to use the macros as follows:

    // Handle error
}

This change ensures the macros work correctly without needing extra braces.

Vasco0x4 avatar Jun 19 '24 16:06 Vasco0x4