41class QOffsetStringArray
43 static auto viewType_helper()
46 if constexpr (
sizeof(Char) == 2) {
47 return q20::type_identity<QStringView>();
49 }
else if constexpr (std::is_same_v<Char, char8_t>) {
50 return q20::type_identity<QUtf8StringView>();
53 return q20::type_identity<QByteArrayView>();
58 using Char =
typename StaticString::value_type;
59 using View =
typename decltype(viewType_helper())::type;
61 constexpr QOffsetStringArray(
const StaticString &string,
const OffsetList &offsets)
62 : m_string(string), m_offsets(offsets)
65 constexpr const Char *operator[](
const int index)
const noexcept
67 return m_string.data() + m_offsets[qBound(
int(0), index, count())];
70 constexpr const Char *at(
const int index)
const noexcept
72 return m_string.data() + m_offsets[index];
75 constexpr View viewAt(qsizetype index)
const noexcept
77 return { m_string.data() + m_offsets[index],
78 qsizetype(m_offsets[index + 1]) - qsizetype(m_offsets[index]) - 1 };
81 constexpr int count()
const {
return int(m_offsets.size()) - 1; }
83 bool contains(View needle, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
85 for (qsizetype i = 0; i < count(); ++i) {
86 if (viewAt(i).compare(needle, cs) == 0)
93 StaticString m_string;
95 friend tst_QOffsetStringArray;
116 constexpr size_t StringLength = (Nx + ...);
117 using OffsetType =
decltype(QtPrivate::minifyValue<StringLength>());
121 std::array offsetList = {
123 OffsetType(offset += Nx)...
127 std::array<Char, StringLength + 1> staticString = {};
128 const Char *strings[] = { entries... };
129 for (size_t i = 0; i <
std::size(strings); ++i) {
130 size_t length = offsetList[i + 1] - offsetList[i];
131 q20::copy_n(strings[i], length, staticString.begin() + offsetList[i]);
134 return QOffsetStringArray(staticString, offsetList);