diff --git a/src/corelib/tools/qoffsetstringarray_p.h b/src/corelib/tools/qoffsetstringarray_p.h index 0a7906a3c5d..42ce2acb19b 100644 --- a/src/corelib/tools/qoffsetstringarray_p.h +++ b/src/corelib/tools/qoffsetstringarray_p.h @@ -84,47 +84,34 @@ struct StaticString { const char data[N]; - constexpr StaticString(const char (&literal)[N]) noexcept - : StaticString(literal, makeIndexSequence {}) - { } - - template - constexpr StaticString(const char (&literal)[N], - IndexesList) noexcept - : data{literal[Idx]...} - { } - - template - constexpr StaticString(const T ... c) noexcept : data{c...} { } - - constexpr char operator[](int i) const noexcept - { - return data[i]; - } - - template - constexpr StaticString operator+(const StaticString &rs) const noexcept - { - return concatenate(rs, makeIndexSequence{}, makeIndexSequence{}); - } - - template - constexpr StaticString concatenate(const StaticString &rs, - IndexesList, - IndexesList) const noexcept - { - return StaticString(data[I1]..., rs[I2]...); - } - - constexpr int size() const noexcept + static constexpr int size() noexcept { return N; } }; + template<> struct StaticString<0> { + static constexpr int size() noexcept + { + return 0; + } +}; + +template +struct StaticStringBuilder; + +template +struct StaticStringBuilder, IndexesList> +{ + template + static constexpr StaticString concatenate( + const char (&ls)[N1], const T2 &rs) noexcept + { + return {ls[I1]..., rs.data[I2]...}; + } }; template @@ -136,7 +123,9 @@ constexpr StaticString<0> staticString() noexcept template constexpr StaticString staticString(const char (&s)[I], const char (&...sx)[Ix]) noexcept { - return StaticString(s) + staticString(sx...); + return StaticStringBuilder< + makeIndexSequence, + makeIndexSequence>::concatenate(s, staticString(sx...)); } } // namespace QtPrivate @@ -146,25 +135,24 @@ class QOffsetStringArray public: using Type = T; - template + template constexpr QOffsetStringArray(const QtPrivate::StaticString &str, - QtPrivate::IndexesList, QtPrivate::IndexesList) noexcept - : m_string{str[Cx]...}, + : m_string{str}, m_offsets{Ox...} { } constexpr inline const char *operator[](const int index) const noexcept { - return m_string + m_offsets[qBound(int(0), index, SizeOffsets - 1)]; + return m_string.data + m_offsets[qBound(int(0), index, SizeOffsets - 1)]; } constexpr inline const char *at(const int index) const noexcept { - return m_string + m_offsets[index]; + return m_string.data + m_offsets[index]; } - constexpr inline const char *str() const { return m_string; } + constexpr inline const char *str() const { return m_string.data; } constexpr inline const T *offsets() const { return m_offsets; } constexpr inline int count() const { return SizeOffsets; }; @@ -172,7 +160,7 @@ public: static constexpr const auto sizeOffsets = SizeOffsets; private: - const char m_string[SizeString]; + QtPrivate::StaticString m_string; const T m_offsets[SizeOffsets]; }; @@ -183,7 +171,6 @@ constexpr QOffsetStringArray qOffsetStringArray( { return QOffsetStringArray( string, - QtPrivate::makeIndexSequence {}, offsets); } @@ -202,7 +189,6 @@ constexpr auto qOffsetStringArray(const char (&...strings)[Nx]) noexcept -> type QtPrivate::staticString(strings...), Offsets{}); } - QT_END_NAMESPACE #endif // QOFFSETSTRINGARRAY_P_H