FastLED 3.10.8
Loading...
Searching...
No Matches
strstream.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/stl/stdint.h" // IWYU pragma: keep
4#include "fl/stl/string.h"
5#include "crgb.h" // IWYU pragma: keep
6#include "fl/stl/ios.h" // IWYU pragma: keep
8#include "fl/stl/noexcept.h"
9
10
11namespace fl {
12
13class Tile2x2_u8;
14class Tile2x2_u8_wrap; // Forward declaration to support operator<< overload
15template <typename T> struct vec2; // Forward declaration from fl/math/geometry.h
16template <typename T> struct rect; // Forward declaration from fl/math/geometry.h
17template <typename T> class vector; // Forward declaration from fl/vector.h // IWYU pragma: keep
18template <typename T> class Optional; // Forward declaration from fl/stl/optional.h
19template <typename Key, typename Hash, typename KeyEqual> class unordered_set; // Forward declaration from fl/stl/unordered_set.h
20template <typename Key, typename T, typename Hash, typename KeyEqual, int INLINED_COUNT> class unordered_map; // Forward declaration from fl/stl/unordered_map.h
21template <typename Key, typename Value, fl::size N> class unsorted_map_fixed; // Forward declaration from fl/stl/map.h
22template <typename Key, typename Value, typename Less> class flat_map; // Forward declaration from fl/stl/flat_map.h
23template <typename T, fl::size Extent> class span; // Forward declaration from fl/stl/span.h (no default arg to avoid redefinition) // IWYU pragma: keep
24template <typename T1, typename T2> struct pair; // Forward declaration from fl/stl/pair.h
25namespace audio { namespace fft { class Bins; } } // Forward declaration
26template <fl::u32 N> class bitset_fixed;
27class bitset_dynamic; // IWYU pragma: keep
28template <fl::u32 N> class bitset_inlined; // IWYU pragma: keep
29
30// Note: int_cast_detail::cast_target is now defined in fl/stl/type_traits.h
31// and shared between sstream and basic_string for consistent integer formatting
32
33
34class sstream {
35 public:
36 sstream() FL_NO_EXCEPT = default;
37 sstream(const string &str) FL_NO_EXCEPT : mStr(str) {}
38
39 void setTreatCharAsInt(bool treatCharAsInt) FL_NO_EXCEPT {
40 mTreatCharAsInt = treatCharAsInt;
41 }
42
43 string str() const FL_NO_EXCEPT { return mStr; }
44 const char *c_str() const FL_NO_EXCEPT { return mStr.c_str(); }
45
47 mStr.append(rgb);
48 return *this;
49 }
51 mStr.append(strStream.str());
52 return *this;
53 }
54
55 sstream &operator<<(const Tile2x2_u8 &subpixel) FL_NO_EXCEPT;
56 sstream &operator<<(const Tile2x2_u8_wrap &tile) FL_NO_EXCEPT; // New overload for wrapped tiles
57
58 // Bins support - implemented in strstream.cpp.hpp
60
61 // vec2<T> support - format as (x,y)
62 template<typename T>
64 mStr.append("(");
65 mStr.append(v.x);
66 mStr.append(",");
67 mStr.append(v.y);
68 mStr.append(")");
69 return *this;
70 }
71
72 // rect<T> support - format as rect((minx,miny), (maxx,maxy))
73 template<typename T>
75 mStr.append("rect(");
76 (*this) << r.mMin;
77 mStr.append(", ");
78 (*this) << r.mMax;
79 mStr.append(")");
80 return *this;
81 }
82
83 // Optional<T> support - format as nullopt or optional(value)
84 template<typename T>
86 if (!opt.has_value()) {
87 mStr.append("nullopt");
88 } else {
89 mStr.append("optional(");
90 (*this) << *opt;
91 mStr.append(")");
92 }
93 return *this;
94 }
95
96 // vector<T> support - format as [item1, item2, ...]
97 template<typename T>
99 mStr.append("[");
100 for (fl::size i = 0; i < vec.size(); ++i) {
101 if (i > 0) {
102 mStr.append(", ");
103 }
104 (*this) << vec[i];
105 }
106 mStr.append("]");
107 return *this;
108 }
109
110 // unordered_set<Key, Hash, KeyEqual> support - format as {item1, item2, ...}
111 template<typename Key, typename Hash, typename KeyEqual>
113 mStr.append("{");
114 bool first = true;
115 for (auto it = set.begin(); it != set.end(); ++it) {
116 if (!first) {
117 mStr.append(", ");
118 }
119 first = false;
120 (*this) << *it;
121 }
122 mStr.append("}");
123 return *this;
124 }
125
126 // unordered_map<Key, T, Hash, KeyEqual, INLINED_COUNT> support - format as {key1: value1, key2: value2, ...}
127 template<typename Key, typename T, typename Hash, typename KeyEqual, int INLINED_COUNT>
129 mStr.append("{");
130 bool first = true;
131 for (auto it = map.begin(); it != map.end(); ++it) {
132 if (!first) {
133 mStr.append(", ");
134 }
135 first = false;
136 (*this) << it->first;
137 mStr.append(": ");
138 (*this) << it->second;
139 }
140 mStr.append("}");
141 return *this;
142 }
143
144 // unsorted_map_fixed<Key, Value, N> support - format as {key1: value1, key2: value2, ...}
145 template<typename Key, typename Value, fl::size N>
147 mStr.append("{");
148 bool first = true;
149 for (auto it = map.begin(); it != map.end(); ++it) {
150 if (!first) {
151 mStr.append(", ");
152 }
153 first = false;
154 (*this) << it->first;
155 mStr.append(": ");
156 (*this) << it->second;
157 }
158 mStr.append("}");
159 return *this;
160 }
161
162 // flat_map<Key, Value, Less> support - format as {key1: value1, key2: value2, ...}
163 template<typename Key, typename Value, typename Less>
165 mStr.append("{");
166 bool first = true;
167 for (auto it = map.begin(); it != map.end(); ++it) {
168 if (!first) {
169 mStr.append(", ");
170 }
171 first = false;
172 (*this) << it->first;
173 mStr.append(": ");
174 (*this) << it->second;
175 }
176 mStr.append("}");
177 return *this;
178 }
179
180 // span<T, Extent> support - format as span[item1, item2, ...]
181 // Uses same format as vector but with "span" prefix for clarity
182 template<typename T, fl::size Extent>
184 mStr.append("span[");
185 for (fl::size i = 0; i < s.size(); ++i) {
186 if (i > 0) {
187 mStr.append(", ");
188 }
189 (*this) << s[i];
190 }
191 mStr.append("]");
192 return *this;
193 }
194
195 // pair<T1, T2> support - format as (first, second)
196 template<typename T1, typename T2>
198 mStr.append("(");
199 (*this) << p.first;
200 mStr.append(", ");
201 (*this) << p.second;
202 mStr.append(")");
203 return *this;
204 }
205
206 sstream &operator=(const fl::u16 &n) FL_NO_EXCEPT {
207 mStr.clear();
208 (*this) << n;
209 return *this;
210 }
211
213 mStr.clear();
214 (*this) << n;
215 return *this;
216 }
217
219 mStr.clear();
220 (*this) << c;
221 return *this;
222 }
223
224 // << operator section
226 mStr.append(str);
227 return *this;
228 }
229
231 if (str) {
232 mStr.append(str);
233 }
234 return *this;
235 }
236
237 // Pointers print as "0x<hex>", like printf's %p. Without this overload a
238 // non-char pointer converts to bool and prints "true" (#4709).
239 sstream &operator<<(const void *ptr) FL_NO_EXCEPT {
240 mStr.append("0x");
241 mStr.append(fl::to_hex(reinterpret_cast<fl::uptr>(ptr), false)); // ok reinterpret cast
242 return *this;
243 }
244
245 sstream &operator<<(const float &f) FL_NO_EXCEPT {
246 // multiply by 100 and round to get 2 decimal places
247 mStr.append(f);
248 return *this;
249 }
250
251 sstream &operator<<(const double &f) FL_NO_EXCEPT {
252 // multiply by 100 and round to get 2 decimal places
253 mStr.append(f);
254 return *this;
255 }
256
257 // Non-template overload for char - takes by value to ensure priority over templates
259 if (mTreatCharAsInt) {
260 mStr.append(fl::i32(c));
261 } else {
262 mStr.append(c);
263 }
264 return *this;
265 }
266
267 // Non-template overloads for signed/unsigned char to avoid template resolution issues
269 using target_t = typename int_cast_detail::cast_target<signed char>::type;
270 appendFormatted(static_cast<target_t>(n));
271 return *this;
272 }
273
274 sstream &operator<<(unsigned char n) FL_NO_EXCEPT {
276 appendFormatted(static_cast<target_t>(n));
277 return *this;
278 }
279
280 template<fl::size N>
281 sstream &operator<<(const char (&str)[N]) FL_NO_EXCEPT {
282 mStr.append(str);
283 return *this;
284 }
285
286 template<fl::u32 N>
288 // mStr.append(bs);
289 bs.to_string(&mStr);
290 return *this;
291 }
292
294 bs.to_string(&mStr);
295 return *this;
296 }
297
298 template<fl::u32 N>
300 bs.to_string(&mStr);
301 return *this;
302 }
303
304 // bool support - output as "true"/"false" for readability
306 mStr.append(b ? "true" : "false");
307 return *this;
308 }
309
310 //-------------------------------------------------------------------------
311 // Enum support - converts enum class and regular enums to their underlying integer type
312 //-------------------------------------------------------------------------
313 template<typename T>
316 using underlying_t = typename fl::underlying_type<T>::type;
317 return (*this) << static_cast<underlying_t>(e);
318 }
319
320 //-------------------------------------------------------------------------
321 // Generic integer type overload using SFINAE
322 //-------------------------------------------------------------------------
323 // Handles all multi-byte integer types (excludes char types which are handled separately)
324 // Uses is_multi_byte_integer trait to select only non-char integer types
325 template<typename T>
327 operator<<(T val) FL_NO_EXCEPT {
328 using target_t = typename int_cast_detail::cast_target<T>::type;
329 appendFormatted(static_cast<target_t>(val));
330 return *this;
331 }
332
333 //-------------------------------------------------------------------------
334 // Types with to_float() method (e.g., fixed_point types)
335 //-------------------------------------------------------------------------
336 template<typename T>
337 typename fl::enable_if<
338 fl::is_same<decltype(static_cast<const T*>(nullptr)->to_float()), float>::value
341 operator<<(const T &val) FL_NO_EXCEPT {
342 mStr.append(val.to_float());
343 return *this;
344 }
345
346 // assignment operator completely replaces the current string
348 mStr = str;
349 return *this;
350 }
351
353 mStr.clear();
354 mStr.append(str);
355 return *this;
356 }
357
358
359 // crgb
361 mStr.clear();
362 (*this) << rgb;
363 return *this;
364 }
365
366 void clear() FL_NO_EXCEPT { mStr.clear(); }
367
368 // Get current formatting base (10=decimal, 16=hex, 8=octal)
369 int getBase() const FL_NO_EXCEPT { return mBase; }
370
371 // Friend operators for manipulators
372 friend sstream& operator<<(sstream&, const hex_t&) FL_NO_EXCEPT;
373 friend sstream& operator<<(sstream&, const dec_t&) FL_NO_EXCEPT;
374 friend sstream& operator<<(sstream&, const oct_t&) FL_NO_EXCEPT;
375
376 private:
377 string mStr;
378 bool mTreatCharAsInt = false; // Default to ASCII mode for readable text output
379 int mBase = 10; // Default to decimal
380
381 // Helper methods to format integers based on current base
383 void appendFormatted(fl::i16 val) FL_NO_EXCEPT;
384 void appendFormatted(fl::i32 val) FL_NO_EXCEPT;
386 void appendFormatted(fl::u16 val) FL_NO_EXCEPT;
387 void appendFormatted(fl::u32 val) FL_NO_EXCEPT;
389};
390
392 public:
393 sstream_noop &operator<<(const char *) FL_NO_EXCEPT { return *this; }
394
395 template<fl::size N>
396 sstream_noop &operator<<(const char (&)[N]) FL_NO_EXCEPT { return *this; }
397
398 template <typename T> sstream_noop &operator=(const T &) FL_NO_EXCEPT { return *this; }
399
400 sstream_noop &operator<<(const CRGB &) FL_NO_EXCEPT { return *this; }
401 sstream_noop &operator<<(const string &) FL_NO_EXCEPT { return *this; }
402 sstream_noop &operator<<(char) FL_NO_EXCEPT { return *this; }
403 sstream_noop &operator<<(signed char) FL_NO_EXCEPT { return *this; }
404 sstream_noop &operator<<(unsigned char) FL_NO_EXCEPT { return *this; }
405 sstream_noop &operator<<(short) FL_NO_EXCEPT { return *this; }
406 sstream_noop &operator<<(unsigned short) FL_NO_EXCEPT { return *this; }
407
408 // bool support to match sstream interface
409 sstream_noop &operator<<(bool) FL_NO_EXCEPT { return *this; }
410
411 // Enum support to match sstream interface
412 template<typename T>
415
416 sstream_noop &operator<<(float) FL_NO_EXCEPT { return *this; }
417 sstream_noop &operator<<(double) FL_NO_EXCEPT { return *this; }
418
419 //-------------------------------------------------------------------------
420 // Generic integer type overload using SFINAE
421 //-------------------------------------------------------------------------
422 // Mirror sstream's integer handling for API compatibility
423 // Handles all multi-byte integer types (excludes char types which are handled separately)
424 template<typename T>
427
428 // Generic pointer and other type support for compatibility
429 sstream_noop &operator<<(const void*) FL_NO_EXCEPT { return *this; }
430
431 // Support for strings/characters in arrays
432 template<fl::size N>
433 sstream_noop &operator<<(const sstream (&)[N]) FL_NO_EXCEPT { return *this; }
434
435 sstream_noop &operator<<(const sstream &) FL_NO_EXCEPT { return *this; }
436 sstream_noop &operator<<(const Tile2x2_u8 &) FL_NO_EXCEPT { return *this; }
439
440 // Vector support
441 template<typename T>
442 sstream_noop &operator<<(const vec2<T> &) FL_NO_EXCEPT { return *this; }
443
444 // rect support
445 template<typename T>
446 sstream_noop &operator<<(const rect<T> &) FL_NO_EXCEPT { return *this; }
447
448 // Optional support
449 template<typename T>
451
452 // vector support
453 template<typename T>
455
456 // unordered_set support
457 template<typename Key, typename Hash, typename KeyEqual>
459
460 // unordered_map support
461 template<typename Key, typename T, typename Hash, typename KeyEqual, int INLINED_COUNT>
463
464 // unsorted_map_fixed support
465 template<typename Key, typename Value, fl::size N>
467
468 // flat_map support
469 template<typename Key, typename Value, typename Less>
471
472 // span support
473 template<typename T, fl::size Extent>
475
476 // pair support
477 template<typename T1, typename T2>
479
480 // Bitset support
481 template<fl::u32 N>
483
485
486 template<fl::u32 N>
488
489 // Support for hex and dec formatters
490 sstream_noop &operator<<(const hex_t &) FL_NO_EXCEPT { return *this; }
491 sstream_noop &operator<<(const dec_t &) FL_NO_EXCEPT { return *this; }
492 sstream_noop &operator<<(const oct_t &) FL_NO_EXCEPT { return *this; }
493
494 sstream_noop &operator=(const string &) FL_NO_EXCEPT { return *this; }
495 sstream_noop &operator=(const CRGB &) FL_NO_EXCEPT { return *this; }
496 sstream_noop &operator=(char) FL_NO_EXCEPT { return *this; }
497};
498
499
500} // namespace fl
A dynamic bitset implementation that can be resized at runtime.
const_iterator begin() const
Definition set.h:415
const_iterator end() const
Definition set.h:416
Definition set.h:367
sstream_noop & operator<<(const bitset_dynamic &) FL_NO_EXCEPT
Definition strstream.h:484
sstream_noop & operator<<(const Tile2x2_u8_wrap &) FL_NO_EXCEPT
Definition strstream.h:437
sstream_noop & operator<<(const fl::span< T, Extent > &) FL_NO_EXCEPT
Definition strstream.h:474
sstream_noop & operator=(const T &) FL_NO_EXCEPT
Definition strstream.h:398
sstream_noop & operator<<(const oct_t &) FL_NO_EXCEPT
Definition strstream.h:492
sstream_noop & operator<<(const string &) FL_NO_EXCEPT
Definition strstream.h:401
sstream_noop & operator<<(char) FL_NO_EXCEPT
Definition strstream.h:402
sstream_noop & operator<<(const sstream(&)[N]) FL_NO_EXCEPT
Definition strstream.h:433
sstream_noop & operator<<(const Tile2x2_u8 &) FL_NO_EXCEPT
Definition strstream.h:436
sstream_noop & operator<<(const Optional< T > &) FL_NO_EXCEPT
Definition strstream.h:450
sstream_noop & operator<<(const void *) FL_NO_EXCEPT
Definition strstream.h:429
sstream_noop & operator<<(const bitset_fixed< N > &) FL_NO_EXCEPT
Definition strstream.h:482
sstream_noop & operator<<(const dec_t &) FL_NO_EXCEPT
Definition strstream.h:491
sstream_noop & operator<<(bool) FL_NO_EXCEPT
Definition strstream.h:409
sstream_noop & operator<<(const vec2< T > &) FL_NO_EXCEPT
Definition strstream.h:442
sstream_noop & operator=(const string &) FL_NO_EXCEPT
Definition strstream.h:494
sstream_noop & operator<<(const fl::flat_map< Key, Value, Less > &) FL_NO_EXCEPT
Definition strstream.h:470
sstream_noop & operator<<(short) FL_NO_EXCEPT
Definition strstream.h:405
sstream_noop & operator<<(const fl::unsorted_map_fixed< Key, Value, N > &) FL_NO_EXCEPT
Definition strstream.h:466
sstream_noop & operator<<(const char(&)[N]) FL_NO_EXCEPT
Definition strstream.h:396
sstream_noop & operator<<(const fl::pair< T1, T2 > &) FL_NO_EXCEPT
Definition strstream.h:478
sstream_noop & operator<<(const sstream &) FL_NO_EXCEPT
Definition strstream.h:435
sstream_noop & operator<<(float) FL_NO_EXCEPT
Definition strstream.h:416
sstream_noop & operator<<(unsigned short) FL_NO_EXCEPT
Definition strstream.h:406
sstream_noop & operator<<(const CRGB &) FL_NO_EXCEPT
Definition strstream.h:400
sstream_noop & operator<<(signed char) FL_NO_EXCEPT
Definition strstream.h:403
sstream_noop & operator<<(const fl::unordered_map< Key, T, Hash, KeyEqual, INLINED_COUNT > &) FL_NO_EXCEPT
Definition strstream.h:462
sstream_noop & operator<<(const fl::unordered_set< Key, Hash, KeyEqual > &) FL_NO_EXCEPT
Definition strstream.h:458
sstream_noop & operator<<(const rect< T > &) FL_NO_EXCEPT
Definition strstream.h:446
sstream_noop & operator<<(const bitset_inlined< N > &) FL_NO_EXCEPT
Definition strstream.h:487
sstream_noop & operator=(const CRGB &) FL_NO_EXCEPT
Definition strstream.h:495
sstream_noop & operator<<(const fl::vector< T > &) FL_NO_EXCEPT
Definition strstream.h:454
sstream_noop & operator<<(const hex_t &) FL_NO_EXCEPT
Definition strstream.h:490
sstream_noop & operator<<(unsigned char) FL_NO_EXCEPT
Definition strstream.h:404
sstream_noop & operator=(char) FL_NO_EXCEPT
Definition strstream.h:496
sstream_noop & operator<<(const char *) FL_NO_EXCEPT
Definition strstream.h:393
sstream_noop & operator<<(const audio::fft::Bins &) FL_NO_EXCEPT
Definition strstream.h:438
sstream_noop & operator<<(double) FL_NO_EXCEPT
Definition strstream.h:417
sstream & operator<<(const fl::flat_map< Key, Value, Less > &map) FL_NO_EXCEPT
Definition strstream.h:164
sstream & operator<<(const fl::vector< T > &vec) FL_NO_EXCEPT
Definition strstream.h:98
string mStr
Definition strstream.h:377
sstream & operator=(const fl::u16 &n) FL_NO_EXCEPT
Definition strstream.h:206
sstream & operator<<(const double &f) FL_NO_EXCEPT
Definition strstream.h:251
sstream & operator<<(const Optional< T > &opt) FL_NO_EXCEPT
Definition strstream.h:85
sstream & operator<<(const bitset_dynamic &bs) FL_NO_EXCEPT
Definition strstream.h:293
sstream & operator=(const string &str) FL_NO_EXCEPT
Definition strstream.h:347
sstream & operator<<(signed char n) FL_NO_EXCEPT
Definition strstream.h:268
int getBase() const FL_NO_EXCEPT
Definition strstream.h:369
sstream & operator<<(unsigned char n) FL_NO_EXCEPT
Definition strstream.h:274
void appendFormatted(fl::i8 val) FL_NO_EXCEPT
void clear() FL_NO_EXCEPT
Definition strstream.h:366
sstream & operator<<(const char(&str)[N]) FL_NO_EXCEPT
Definition strstream.h:281
sstream & operator<<(const fl::pair< T1, T2 > &p) FL_NO_EXCEPT
Definition strstream.h:197
sstream & operator<<(const bitset_fixed< N > &bs) FL_NO_EXCEPT
Definition strstream.h:287
sstream() FL_NO_EXCEPT=default
void setTreatCharAsInt(bool treatCharAsInt) FL_NO_EXCEPT
Definition strstream.h:39
sstream & operator<<(char c) FL_NO_EXCEPT
Definition strstream.h:258
string str() const FL_NO_EXCEPT
Definition strstream.h:43
sstream & operator<<(const fl::unordered_set< Key, Hash, KeyEqual > &set) FL_NO_EXCEPT
Definition strstream.h:112
sstream & operator<<(const fl::unsorted_map_fixed< Key, Value, N > &map) FL_NO_EXCEPT
Definition strstream.h:146
sstream & operator<<(const bitset_inlined< N > &bs) FL_NO_EXCEPT
Definition strstream.h:299
sstream & operator<<(const float &f) FL_NO_EXCEPT
Definition strstream.h:245
sstream & operator<<(const sstream &strStream) FL_NO_EXCEPT
Definition strstream.h:50
sstream & operator<<(const void *ptr) FL_NO_EXCEPT
Definition strstream.h:239
sstream & operator<<(const char *str) FL_NO_EXCEPT
Definition strstream.h:230
const char * c_str() const FL_NO_EXCEPT
Definition strstream.h:44
sstream & operator<<(const string &str) FL_NO_EXCEPT
Definition strstream.h:225
sstream & operator=(char c) FL_NO_EXCEPT
Definition strstream.h:218
bool mTreatCharAsInt
Definition strstream.h:378
sstream & operator=(const char *str) FL_NO_EXCEPT
Definition strstream.h:352
sstream & operator=(const CRGB &rgb) FL_NO_EXCEPT
Definition strstream.h:360
sstream & operator=(const fl::u8 &n) FL_NO_EXCEPT
Definition strstream.h:212
sstream & operator<<(const fl::span< T, Extent > &s) FL_NO_EXCEPT
Definition strstream.h:183
sstream & operator<<(const CRGB &rgb) FL_NO_EXCEPT
Definition strstream.h:46
sstream & operator<<(const fl::unordered_map< Key, T, Hash, KeyEqual, INLINED_COUNT > &map) FL_NO_EXCEPT
Definition strstream.h:128
sstream & operator<<(const vec2< T > &v) FL_NO_EXCEPT
Definition strstream.h:63
sstream & operator<<(bool b) FL_NO_EXCEPT
Definition strstream.h:305
sstream & operator<<(const rect< T > &r) FL_NO_EXCEPT
Definition strstream.h:74
unsigned char u8
Definition s16x16x4.h:132
signed char i8
Definition s16x16x4.h:131
typename fl::conditional< IsSigned, typename fl::conditional< Size==1, fl::i8, typename fl::conditional< Size==2, fl::i16, typename fl::conditional< Size==4, fl::i32, typename fl::conditional< Size==8, fl::i64, fl::i64 >::type >::type >::type >::type, typename fl::conditional< Size==1, fl::u16, typename fl::conditional< Size==2, fl::u16, typename fl::conditional< Size==4, fl::u32, typename fl::conditional< Size==8, fl::u64, fl::u64 >::type >::type >::type >::type >::type type
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
constexpr int type_rank< T >::value
MapRedBlackTree< Key, T, Compare, fl::allocator_slab< char > > map
Definition map.h:283
fl::string to_hex(T value, bool uppercase=false, bool pad_to_width=false) FL_NO_EXCEPT
Convert an integer value to hexadecimal string representation.
Definition string.h:526
fl::i64 i64
Definition s16x16x4.h:222
fl::u64 u64
Definition s16x16x4.h:221
Base definition for an LED controller.
Representation of an 8-bit RGB pixel (Red, Green, Blue)
Definition crgb.h:38