FastLED 3.9.15
Loading...
Searching...
No Matches

◆ operator[]()

template<typename Key, typename T, typename Hash = Hash<Key>, typename KeyEqual = EqualTo<Key>, int INLINED_COUNT = FASTLED_HASHMAP_INLINED_COUNT>
T & fl::unordered_map< Key, T, Hash, KeyEqual, INLINED_COUNT >::operator[] ( const Key & key)
inline

Definition at line 682 of file unordered_map.h.

682 {
684 bool is_new;
685
687 idx = p.first;
688 is_new = p.second;
689
690 // Check if find_slot failed to find a valid slot (unordered_map is full)
691 if (idx == npos()) {
692 // Need to resize to make room
693 if (needs_rehash()) {
694 // if half the buckets are tombstones, rehash inline to prevent
695 // memory growth. Otherwise, double the size.
696 if (_tombstones >= _buckets.size() / 2) {
698 } else {
699 rehash_internal(_buckets.size() * 2);
700 }
701 } else {
702 // Force a rehash with double size if needs_rehash() doesn't detect the issue
703 rehash_internal(_buckets.size() * 2);
704 }
705
706 // Try find_slot again after resize
707 p = find_slot(key);
708 idx = p.first;
709 is_new = p.second;
710
711 // If still npos() after resize, allocation failed catastrophically
712 if (idx == npos()) {
713 // This should never happen after a successful resize
714 static T default_value{};
715 FASTLED_ASSERT(false, "unordered_map::operator[]: Failed to allocate after rehash");
716 return default_value;
717 }
718 }
719
720 if (is_new) {
721 _buckets[idx].key = key;
722 _buckets[idx].value = T{};
724 ++_size;
725 }
726 return _buckets[idx].value;
727 }
static fl::size npos()
void mark_occupied(fl::size idx)
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_NULL_DEREFERENCE void rehash_inline_no_resize()
fl::vector_inlined< Entry, INLINED_COUNT > _buckets
pair< fl::size, bool > find_slot(const Key &key) const
bool needs_rehash() const
void rehash_internal(fl::size new_cap)