A :cpp:class:`FSTR::Vector` is an array of Object pointers.
A key use for this is the construction of string tables.
Inline Strings are not supported, so the content has to be defined first:
DEFINE_FSTR_LOCAL(str1, "Test string #1");
DEFINE_FSTR_LOCAL(str2, "Test string #2");
IMPORT_FSTR_LOCAL(str3, PROJECT_DIR "/files/somedata.json");
Now we can define the Vector:
#include <FlashString/Vector.hpp>
DEFINE_FSTR_VECTOR(myTable, FlashString,
&str1,
&str2,
nullptr,
&str3
);
Note the use of nullptr
to indicate an invalid vector entry, as distinct from an empty String.
Now we can access the data using Vector methods:
debugf("table.length() = %u", table.length());
debugf("fstr1 = '%s'", String(table[0]).c_str());
debugf("fstr2.length() = %u", table[1].length());
debugf("fstr3.length() = %u", table[2].length());
You can share Vectors between translation units by declaring it in a header:
DECLARE_FSTR_VECTOR(table);
To search a Vector:
int i = table.indexOf("TEST STRING #1");
Note
By default, searches in Vector<String> are not case-sensitive.
The indexOf
method has an extra ignoreCase
parameter, which defaults to true
.
The above example generates a structure like this:
constexpr const struct {
Vector<String*> object;
String* entries[4];
} __fstr__myTable PROGMEM = {
{16},
&str1,
&str2,
nullptr,
&str3,
};
const Vector<String>& myTable PROGMEM = __fstr__myTable.object;
Note: FSTR::
namespace qualifier omitted for clarity.
.. doxygengroup:: fstr_vector
:content-only:
.. doxygenclass:: FSTR::Vector
:members: