45class QOffsetStringArray
47 static auto viewType_helper()
50 if constexpr (
sizeof(Char) == 2) {
51 return q20::type_identity<QStringView>();
53 }
else if constexpr (std::is_same_v<Char, char8_t>) {
54 return q20::type_identity<QUtf8StringView>();
57 return q20::type_identity<QByteArrayView>();
62 using Char =
typename StaticString::value_type;
63 using View =
typename decltype(viewType_helper())::type;
65 constexpr QOffsetStringArray(
const StaticString &string,
const OffsetList &offsets)
66 : m_string(string), m_offsets(offsets)
69 constexpr const Char *operator[](
const int index)
const noexcept
71 return m_string.data() + m_offsets[qBound(
int(0), index, count())];
74 constexpr const Char *at(
const int index)
const noexcept
76 return m_string.data() + m_offsets[index];
79 constexpr View viewAt(qsizetype index)
const noexcept
81 return { m_string.data() + m_offsets[index],
82 qsizetype(m_offsets[index + 1]) - qsizetype(m_offsets[index]) - 1 };
85 constexpr int count()
const {
return int(m_offsets.size()) - 1; }
87 bool contains(View needle, Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept
89 for (qsizetype i = 0; i < count(); ++i) {
90 if (viewAt(i).compare(needle, cs) == 0)
97 StaticString m_string;
99 friend tst_QOffsetStringArray;
120 constexpr size_t StringLength = (Nx + ...);
121 using OffsetType =
decltype(QtPrivate::minifyValue<StringLength>());
125 std::array offsetList = {
127 OffsetType(offset += Nx)...
131 std::array<Char, StringLength + 1> staticString = {};
132 const Char *strings[] = { entries... };
133 for (size_t i = 0; i <
std::size(strings); ++i) {
134 size_t length = offsetList[i + 1] - offsetList[i];
135 q20::copy_n(strings[i], length, staticString.begin() + offsetList[i]);
138 return QOffsetStringArray(staticString, offsetList);