16#define ESPHOME_F(string_literal) F(string_literal)
17#define ESPHOME_PGM_P PGM_P
18#define ESPHOME_PSTR(s) PSTR(s)
19#define ESPHOME_strncpy_P strncpy_P
20#define ESPHOME_strncat_P strncat_P
21#define ESPHOME_snprintf_P snprintf_P
22#define ESPHOME_strcmp_P strcmp_P
23#define ESPHOME_strcasecmp_P strcasecmp_P
24#define ESPHOME_strncmp_P strncmp_P
25#define ESPHOME_strncasecmp_P strncasecmp_P
33#ifdef USE_STORE_LOG_STR_IN_FLASH
34#define ESPHOME_PROGMEM_STRING_TABLE_STORAGE PROGMEM
36#define ESPHOME_PROGMEM_STRING_TABLE_STORAGE
39#define ESPHOME_F(string_literal) (string_literal)
40#define ESPHOME_PGM_P const char *
41#define ESPHOME_PSTR(s) (s)
42#define ESPHOME_strncpy_P strncpy
43#define ESPHOME_strncat_P strncat
44#define ESPHOME_snprintf_P snprintf
45#define ESPHOME_strcmp_P strcmp
46#define ESPHOME_strcasecmp_P strcasecmp
47#define ESPHOME_strncmp_P strncmp
48#define ESPHOME_strncasecmp_P strncasecmp
52#define ESPHOME_PROGMEM_STRING_TABLE_STORAGE
61 for (
size_t i = 0; i < N; ++i)
64 constexpr size_t size()
const {
return N - 1; }
76 static constexpr size_t COUNT =
sizeof...(Strs);
77 static constexpr size_t BLOB_SIZE = (0 + ... + (Strs.size() + 1));
81 std::array<char, BLOB_SIZE> result{};
83 auto copy = [&](
const auto &str) {
84 for (
size_t i = 0; i <= str.size(); ++i)
85 result[
pos++] = str.data[i];
93 static_assert(
COUNT > 0,
"PROGMEM_STRING_TABLE must contain at least one string");
94 static_assert(
COUNT <= 255,
"PROGMEM_STRING_TABLE supports at most 255 strings with uint8_t indices");
95 static_assert(
BLOB_SIZE <= 255,
"PROGMEM_STRING_TABLE blob exceeds 255 bytes; use fewer/shorter strings");
96 std::array<uint8_t, COUNT> result{};
97 size_t pos = 0, idx = 0;
98 ((result[idx++] =
static_cast<uint8_t
>(
pos),
pos += Strs.size() + 1), ...);
109#define PROGMEM_STRING_TABLE(Name, ...) \
111 using Table = ::esphome::ProgmemStringTable<__VA_ARGS__>; \
112 static constexpr size_t COUNT = Table::COUNT; \
113 static constexpr uint8_t LAST_INDEX = COUNT - 1; \
114 static constexpr size_t BLOB_SIZE = Table::BLOB_SIZE; \
115 static constexpr auto BLOB ESPHOME_PROGMEM_STRING_TABLE_STORAGE = Table::make_blob(); \
116 static constexpr auto OFFSETS ESPHOME_PROGMEM_STRING_TABLE_STORAGE = Table::make_offsets(); \
117 static const char *get_(uint8_t idx, uint8_t fallback) { \
122 return std::launder(&BLOB[::esphome::progmem_read_byte(&OFFSETS[idx])]); \
124 static ::ProgmemStr get_progmem_str(uint8_t idx, uint8_t fallback) { \
125 return reinterpret_cast<::ProgmemStr>(get_(idx, fallback)); \
127 static const ::esphome::LogString *get_log_str(uint8_t idx, uint8_t fallback) { \
128 return reinterpret_cast<const ::esphome::LogString *>(get_(idx, fallback)); \
const __FlashStringHelper * ProgmemStr
Helper for C++20 string literal template arguments.
constexpr size_t size() const
constexpr FixedString(const char(&str)[N])
Compile-time string table that packs strings into a single blob with offset lookup.
static constexpr size_t COUNT
static constexpr size_t BLOB_SIZE
static constexpr auto make_blob()
Generate packed string blob at compile time.
static constexpr auto make_offsets()
Generate offset table at compile time (uint8_t limits blob to 255 bytes)