FastLED 3.9.15
Loading...
Searching...
No Matches
string_interner.cpp.hpp
Go to the documentation of this file.
2#include "fl/stl/singleton.h"
3#include "fl/stl/int.h"
4#include "fl/stl/string.h"
6#include "fl/stl/shared_ptr.h"
9#include "fl/stl/span.h"
10#include "fl/stl/mutex.h"
11#include "fl/stl/noexcept.h"
12
13namespace fl {
14
15// Mutex for global interner only (instance interners are single-threaded)
17 static fl::mutex mtx;
18 return mtx;
19}
20
21// StringInterner member function implementations
22
24
28
30 if (sv.empty()) return fl::string();
31
32 // SSO optimization: strings that fit in the inline buffer don't benefit from interning
33 // because fl::string will store them inline (no heap allocation anyway).
34 // Interning small strings would just add hash overhead with no memory savings.
35 if (sv.size() <= FASTLED_STR_INLINED_SIZE) {
36 return fl::string(sv);
37 }
38
39 // String is large enough to require heap allocation - check if already interned
40 // Try to find existing entry - O(1) average via hash map
41 auto it = mEntries.find(sv);
42 if (it != mEntries.end()) {
43 // Found existing - return fl::string sharing the StringHolder
44 return fl::string(it->second);
45 }
46
47 // Not found - create new StringHolder (heap-allocated)
48 auto holder = fl::make_shared<StringHolder>(sv.data(), sv.size());
49
50 // Create string_view key that points into holder's data
51 // This is safe because StringHolder data is heap-allocated and never moves
52 string_view key(holder->data(), holder->length());
53
54 // Insert into map - key points into value's data (self-referential)
55 mEntries[key] = holder;
56
57 // Return fl::string sharing the StringHolder
58 return fl::string(holder);
59}
60
62 // Convert to string_view and delegate
63 return intern(string_view(str.c_str(), str.size()));
64}
65
67 if (!str) return fl::string();
68 // Convert to string_view and delegate
69 return intern(string_view(str));
70}
71
73 if (sp.empty()) return fl::string();
74 // Convert to string_view and delegate
75 return intern(string_view(sp.data(), sp.size()));
76}
77
79 return mEntries.find(sv) != mEntries.end();
80}
81
82bool StringInterner::contains(const char* str) const {
83 if (!str) return false;
84 return contains(string_view(str));
85}
86
87fl::size StringInterner::size() const {
88 return mEntries.size();
89}
90
92 return mEntries.empty();
93}
94
96 mEntries.clear();
97}
98
99void StringInterner::reserve(fl::size count) {
100 // unordered_map doesn't have reserve(), but we can set the bucket count
101 // This pre-allocates buckets to avoid rehashing
102 if (count > 0) {
103 mEntries.rehash(count);
104 }
105}
106
107// Global string interner singleton implementation
111
112// Convenience functions for global interning (thread-safe via mutex)
114 fl::unique_lock<fl::mutex> lock(global_interner_mutex());
115 return global_interner().intern(sv);
116}
117
119 fl::unique_lock<fl::mutex> lock(global_interner_mutex());
120 return global_interner().intern(str);
121}
122
123fl::string intern(const char* str) {
124 fl::unique_lock<fl::mutex> lock(global_interner_mutex());
125 return global_interner().intern(str);
126}
127
129 fl::unique_lock<fl::mutex> lock(global_interner_mutex());
130 return global_interner().intern(sp);
131}
132
133} // namespace fl
static T & instance() FL_NOEXCEPT
Definition singleton.h:41
void reserve(fl::size count)
fl::string intern(const string_view &sv)
bool contains(const string_view &sv) const
fl::unordered_map< string_view, StringHolderPtr > mEntries
const char * c_str() const FL_NOEXCEPT
fl::size size() const FL_NOEXCEPT
constexpr bool empty() const FL_NOEXCEPT
Definition span.h:510
const T * data() const FL_NOEXCEPT
Definition span.h:461
constexpr fl::size size() const FL_NOEXCEPT
Definition span.h:458
constexpr bool empty() const FL_NOEXCEPT
constexpr fl::size size() const FL_NOEXCEPT
Definition string_view.h:99
constexpr const char * data() const FL_NOEXCEPT
Definition string_view.h:94
Platform-independent mutex interface.
StringInterner & global_interner()
shared_ptr< T > make_shared(Args &&... args) FL_NOEXCEPT
Definition shared_ptr.h:414
fl::platforms::mutex mutex
Definition mutex.h:20
static fl::mutex & global_interner_mutex()
fl::string intern(const string_view &sv)
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT
#define FASTLED_STR_INLINED_SIZE
std::string compatible string class.
Definition string.h:32