40class QOffsetStringArray
42 static auto viewType_helper()
45 if constexpr (
sizeof(Char) == 2) {
46 return q20::type_identity<QStringView>();
48 }
else if constexpr (std::is_same_v<Char, char8_t>) {
49 return q20::type_identity<QUtf8StringView>();
52 return q20::type_identity<QByteArrayView>();
57 using Char =
typename StaticString::value_type;
58 using View =
typename decltype(viewType_helper())::type;
59 static constexpr typename OffsetList::value_type MaxElementLength = LongestElement;
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 int LongestElement =
std::max({ Nx... }) - 1;
117 constexpr size_t StringLength = (Nx + ...);
118 using OffsetType =
decltype(QtPrivate::minifyValue<StringLength>());
122 std::array offsetList = {
124 OffsetType(offset += Nx)...
128 std::array<Char, StringLength + 1> staticString = {};
129 const Char *strings[] = { entries... };
130 for (size_t i = 0; i <
std::size(strings); ++i) {
131 size_t length = offsetList[i + 1] - offsetList[i];
132 q20::copy_n(strings[i], length, staticString.begin() + offsetList[i]);
135 using StaticString =
decltype(staticString);
136 using OffsetList =
decltype(offsetList);
137 using R = QOffsetStringArray<StaticString, OffsetList, LongestElement>;
138 return R(staticString, offsetList);