From 610a2e468d47fe593036e8654d424cd8963aaecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sat, 18 Nov 2023 10:50:42 -0800 Subject: [PATCH] Added find first set. --- include/bx/inline/uint32_t.inl | 7 +++++++ include/bx/uint32_t.h | 5 +++++ tests/uint32_test.cpp | 13 +++++++++++++ 3 files changed, 25 insertions(+) diff --git a/include/bx/inline/uint32_t.inl b/include/bx/inline/uint32_t.inl index d5c9e49..092be1f 100644 --- a/include/bx/inline/uint32_t.inl +++ b/include/bx/inline/uint32_t.inl @@ -453,6 +453,13 @@ namespace bx template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(int32_t _val) { return uint32_cnttz(_val); } template<> inline BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(int64_t _val) { return uint32_cnttz(_val); } + template + inline BX_CONSTEXPR_FUNC uint32_t uint32_ffs(Ty _x) + { + return Ty(0) == _x ? uint32_t(0) : uint32_cnttz(_x) + 1; + } + + inline BX_CONSTEXPR_FUNC uint32_t uint32_part1by1(uint32_t _a) { // shuffle: diff --git a/include/bx/uint32_t.h b/include/bx/uint32_t.h index f1195c4..f40c089 100644 --- a/include/bx/uint32_t.h +++ b/include/bx/uint32_t.h @@ -162,6 +162,11 @@ namespace bx template BX_CONSTEXPR_FUNC uint32_t uint32_cnttz(Ty _val); + /// Find first set. + /// + template + BX_CONSTEXPR_FUNC uint32_t uint32_ffs(Ty _val); + /// BX_CONSTEXPR_FUNC uint32_t uint32_part1by1(uint32_t _a); diff --git a/tests/uint32_test.cpp b/tests/uint32_test.cpp index 5d5fb6b..51f4001 100644 --- a/tests/uint32_test.cpp +++ b/tests/uint32_test.cpp @@ -53,6 +53,19 @@ TEST_CASE("uint32_cnt", "[uint32_t]") REQUIRE(63 == bx::uint32_cntlz(1) ); REQUIRE(64 == bx::uint32_cntlz(0) ); + REQUIRE( 1 == bx::uint32_ffs(1) ); + REQUIRE( 8 == bx::uint32_ffs(1<<7) ); + REQUIRE( 0 == bx::uint32_ffs(0) ); + REQUIRE( 2 == bx::uint32_ffs(0x3e) ); + REQUIRE( 1 == bx::uint32_ffs(1) ); + REQUIRE(16 == bx::uint32_ffs(1<<15) ); + REQUIRE( 0 == bx::uint32_ffs(0) ); + REQUIRE( 1 == bx::uint32_ffs(1) ); + REQUIRE( 0 == bx::uint32_ffs(0) ); + REQUIRE(32 == bx::uint32_ffs(1u<<31) ); + REQUIRE( 1 == bx::uint32_ffs(1) ); + REQUIRE( 0 == bx::uint32_ffs(0) ); + REQUIRE( 0 == bx::uint32_cntbits(0) ); REQUIRE( 1 == bx::uint32_cntbits(1) );