| Message ID | 20260106165754.1759831-6-barnabas.pocze@ideasonboard.com |
|---|---|
| State | New |
| Headers | show |
| Series |
|
| Related | show |
Hi Barnabás On Tue, Jan 06, 2026 at 05:57:37PM +0100, Barnabás Pőcze wrote: > `has_single_bit()` checks if the given unsigned integer has a single > bit set, that is, whether the number is a power of two or not. > > Not all requirements of the C++20 standard are implemented. > > See https://en.cppreference.com/w/cpp/numeric/has_single_bit > > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> > Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Do you think we can switch to c++20 and then re-apply the series on top to remove these patches ? > --- > include/libcamera/base/internal/cxx20.h | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/include/libcamera/base/internal/cxx20.h b/include/libcamera/base/internal/cxx20.h > index 1f4caf56f..d47168a70 100644 > --- a/include/libcamera/base/internal/cxx20.h > +++ b/include/libcamera/base/internal/cxx20.h > @@ -7,6 +7,8 @@ > > #pragma once > > +#include <type_traits> > + > /** > * \internal > * \file cxx20.h > @@ -39,4 +41,18 @@ template<typename T> struct type_identity { > */ > template<typename T> using type_identity_t = typename type_identity<T>::type; > > +/** > + * \internal > + * \brief std::has_single_bit() > + * > + * Implementation of std::has_single_bit() for C++17. > + */ > +template<typename T> > +constexpr bool has_single_bit(T x) noexcept > +{ > + static_assert(std::is_unsigned_v<T>); > + > + return x != 0 && (x & (x - 1)) == 0; > +} > + > } /* namespace libcamera::internal::cxx20 */ > -- > 2.52.0 >
diff --git a/include/libcamera/base/internal/cxx20.h b/include/libcamera/base/internal/cxx20.h index 1f4caf56f..d47168a70 100644 --- a/include/libcamera/base/internal/cxx20.h +++ b/include/libcamera/base/internal/cxx20.h @@ -7,6 +7,8 @@ #pragma once +#include <type_traits> + /** * \internal * \file cxx20.h @@ -39,4 +41,18 @@ template<typename T> struct type_identity { */ template<typename T> using type_identity_t = typename type_identity<T>::type; +/** + * \internal + * \brief std::has_single_bit() + * + * Implementation of std::has_single_bit() for C++17. + */ +template<typename T> +constexpr bool has_single_bit(T x) noexcept +{ + static_assert(std::is_unsigned_v<T>); + + return x != 0 && (x & (x - 1)) == 0; +} + } /* namespace libcamera::internal::cxx20 */