From 92a812e154157ff83168bd9af4fd214831571d96 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 22 Oct 2025 08:30:17 -1000 Subject: [PATCH] optimize --- esphome/core/enum_bitmask.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/esphome/core/enum_bitmask.h b/esphome/core/enum_bitmask.h index f9cda7ca2d..e1840a3ac0 100644 --- a/esphome/core/enum_bitmask.h +++ b/esphome/core/enum_bitmask.h @@ -92,6 +92,7 @@ template class EnumBitmask { /// Iterator support for range-based for loops and API encoding /// Iterates over set bits and converts bit positions to enum values + /// Optimization: removes bits from mask as we iterate class Iterator { public: using iterator_category = std::forward_iterator_tag; @@ -100,29 +101,29 @@ template class EnumBitmask { using pointer = const EnumType *; using reference = EnumType; - constexpr Iterator(bitmask_t mask, int bit) : mask_(mask), bit_(bit) { advance_to_next_set_bit_(); } + constexpr explicit Iterator(bitmask_t mask) : mask_(mask) {} - constexpr EnumType operator*() const { return bit_to_enum(bit_); } + constexpr EnumType operator*() const { + // Return enum for the first set bit + return bit_to_enum(find_next_set_bit(mask_, 0)); + } constexpr Iterator &operator++() { - ++bit_; - advance_to_next_set_bit_(); + // Clear the lowest set bit (Brian Kernighan's algorithm) + mask_ &= mask_ - 1; return *this; } - constexpr bool operator==(const Iterator &other) const { return bit_ == other.bit_; } + constexpr bool operator==(const Iterator &other) const { return mask_ == other.mask_; } constexpr bool operator!=(const Iterator &other) const { return !(*this == other); } private: - constexpr void advance_to_next_set_bit_() { bit_ = find_next_set_bit(mask_, bit_); } - bitmask_t mask_; - int bit_; }; - constexpr Iterator begin() const { return Iterator(mask_, 0); } - constexpr Iterator end() const { return Iterator(mask_, MaxBits); } + constexpr Iterator begin() const { return Iterator(mask_); } + constexpr Iterator end() const { return Iterator(0); } /// Get the raw bitmask value for optimized operations constexpr bitmask_t get_mask() const { return this->mask_; }