1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-29 14:13:51 +00:00
This commit is contained in:
J. Nick Koston
2025-10-21 22:30:27 -10:00

View File

@@ -23,9 +23,12 @@ namespace esphome {
/// Example usage: /// Example usage:
/// using ClimateModeMask = EnumBitmask<ClimateMode, 8>; /// using ClimateModeMask = EnumBitmask<ClimateMode, 8>;
/// ClimateModeMask modes({CLIMATE_MODE_HEAT, CLIMATE_MODE_COOL}); /// ClimateModeMask modes({CLIMATE_MODE_HEAT, CLIMATE_MODE_COOL});
/// if (modes.contains(CLIMATE_MODE_HEAT)) { ... } /// if (modes.count(CLIMATE_MODE_HEAT)) { ... }
/// for (auto mode : modes) { ... } // Iterate over set bits /// for (auto mode : modes) { ... } // Iterate over set bits
/// ///
/// For complete usage examples with template specializations, see:
/// - esphome/components/light/color_mode.h (ColorMode example)
///
/// Design notes: /// Design notes:
/// - Uses compile-time type selection for optimal size (uint8_t/uint16_t/uint32_t) /// - Uses compile-time type selection for optimal size (uint8_t/uint16_t/uint32_t)
/// - Iterator converts bit positions to actual enum values during traversal /// - Iterator converts bit positions to actual enum values during traversal
@@ -45,29 +48,30 @@ template<typename EnumType, int MaxBits = 16> class EnumBitmask {
/// Construct from initializer list: {VALUE1, VALUE2, ...} /// Construct from initializer list: {VALUE1, VALUE2, ...}
constexpr EnumBitmask(std::initializer_list<EnumType> values) { constexpr EnumBitmask(std::initializer_list<EnumType> values) {
for (auto value : values) { for (auto value : values) {
this->add(value); this->insert(value);
} }
} }
/// Add a single enum value to the set /// Add a single enum value to the set (std::set compatibility)
constexpr void add(EnumType value) { this->mask_ |= (static_cast<bitmask_t>(1) << enum_to_bit(value)); } constexpr void insert(EnumType value) { this->mask_ |= (static_cast<bitmask_t>(1) << enum_to_bit(value)); }
/// Add multiple enum values from initializer list /// Add multiple enum values from initializer list
constexpr void add(std::initializer_list<EnumType> values) { constexpr void insert(std::initializer_list<EnumType> values) {
for (auto value : values) { for (auto value : values) {
this->add(value); this->insert(value);
} }
} }
/// Remove an enum value from the set /// Remove an enum value from the set (std::set compatibility)
constexpr void remove(EnumType value) { this->mask_ &= ~(static_cast<bitmask_t>(1) << enum_to_bit(value)); } constexpr void erase(EnumType value) { this->mask_ &= ~(static_cast<bitmask_t>(1) << enum_to_bit(value)); }
/// Clear all values from the set /// Clear all values from the set
constexpr void clear() { this->mask_ = 0; } constexpr void clear() { this->mask_ = 0; }
/// Check if the set contains a specific enum value /// Check if the set contains a specific enum value (std::set compatibility)
constexpr bool contains(EnumType value) const { /// Returns 1 if present, 0 if not (same as std::set for unique elements)
return (this->mask_ & (static_cast<bitmask_t>(1) << enum_to_bit(value))) != 0; constexpr size_t count(EnumType value) const {
return (this->mask_ & (static_cast<bitmask_t>(1) << enum_to_bit(value))) != 0 ? 1 : 0;
} }
/// Count the number of enum values in the set /// Count the number of enum values in the set