boostorg / boost

Super-project for modularized Boost
https://github.com/boostorg/wiki/wiki/Getting-Started%3A-Overview
Boost Software License 1.0
6.97k stars 1.72k forks source link

BOOST_UNLIKELY and boost::system::error_code #918

Open ujos opened 2 months ago

ujos commented 2 months ago

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)
{
}
Vasco0x4 commented 2 months ago

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.