summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorMikhail Svetkin <mikhail.svetkin@qt.io>2018-08-30 11:49:44 +0200
committerMikhail Svetkin <mikhail.svetkin@qt.io>2018-09-06 13:20:28 +0000
commite8dacba47a59944e4a5ca271c4698e5dfbdbe9d5 (patch)
tree87b2d1d19275b031dcf0f4e4a6001cae368c684c /src/corelib
parentf4d9dadabbee7d32f135ca403f39b3c6ed1c34c8 (diff)
QOffsetStringArray: fix compilation error with MSVC15/17
MSVC 2015/2017 has a bug with constexpr. It is internal compiler error when we are using QtPrivate::IndexSequence with more than 1024 items. Example: template<int ... I> void foo(QtPrivate::IndexSequence<I...>) { } void bar() { foo(QtPrivate::makeIndexSequence<1024>()); // works foo(QtPrivate::makeIndexSequence<1025>()); // error: C1202: recursive type or function dependency context too complex } Workaround: template<typename> struct Foo; template<int ... I> struct Foo<QtPrivate::IndexSequence<I...>>{ static constexpr void call() { } }; void bar() { Foo<QtPrivate::makeIndexSequence<1025>>::call(); // works } Change-Id: Iedbf5291ac4a9f51f8b5f6b76b83baba920c092d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/tools/qoffsetstringarray_p.h70
1 files changed, 28 insertions, 42 deletions
diff --git a/src/corelib/tools/qoffsetstringarray_p.h b/src/corelib/tools/qoffsetstringarray_p.h
index 0a7906a3c5..42ce2acb19 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<N> {})
- { }
-
- template<int ... Idx>
- constexpr StaticString(const char (&literal)[N],
- IndexesList<Idx...>) noexcept
- : data{literal[Idx]...}
- { }
-
- template<typename ... T>
- constexpr StaticString(const T ... c) noexcept : data{c...} { }
-
- constexpr char operator[](int i) const noexcept
+ static constexpr int size() noexcept
{
- return data[i];
- }
-
- template<int N2>
- constexpr StaticString<N + N2> operator+(const StaticString<N2> &rs) const noexcept
- {
- return concatenate(rs, makeIndexSequence<N>{}, makeIndexSequence<N2>{});
+ return N;
}
+};
- template<int N2, int ... I1, int ... I2>
- constexpr StaticString<N + N2> concatenate(const StaticString<N2> &rs,
- IndexesList<I1...>,
- IndexesList<I2...>) const noexcept
- {
- return StaticString<N + N2>(data[I1]..., rs[I2]...);
- }
- constexpr int size() const noexcept
+template<>
+struct StaticString<0>
+{
+ static constexpr int size() noexcept
{
- return N;
+ return 0;
}
};
-template<>
-struct StaticString<0>
+template<typename, typename>
+struct StaticStringBuilder;
+
+template<int ... I1, int ... I2>
+struct StaticStringBuilder<IndexesList<I1...>, IndexesList<I2...>>
{
+ template<int N1, typename T2>
+ static constexpr StaticString<N1 + T2::size()> concatenate(
+ const char (&ls)[N1], const T2 &rs) noexcept
+ {
+ return {ls[I1]..., rs.data[I2]...};
+ }
};
template<int Sum>
@@ -136,7 +123,9 @@ constexpr StaticString<0> staticString() noexcept
template<int Sum, int I, int ... Ix>
constexpr StaticString<Sum> staticString(const char (&s)[I], const char (&...sx)[Ix]) noexcept
{
- return StaticString<I>(s) + staticString<Sum - I>(sx...);
+ return StaticStringBuilder<
+ makeIndexSequence<I>,
+ makeIndexSequence<Sum - I>>::concatenate(s, staticString<Sum - I>(sx...));
}
} // namespace QtPrivate
@@ -146,25 +135,24 @@ class QOffsetStringArray
public:
using Type = T;
- template<int ... Cx, int ... Ox>
+ template<int ... Ox>
constexpr QOffsetStringArray(const QtPrivate::StaticString<SizeString> &str,
- QtPrivate::IndexesList<Cx...>,
QtPrivate::IndexesList<SizeString, Ox...>) 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<SizeString> m_string;
const T m_offsets[SizeOffsets];
};
@@ -183,7 +171,6 @@ constexpr QOffsetStringArray<T, N, sizeof ... (Ox)> qOffsetStringArray(
{
return QOffsetStringArray<T, N, sizeof ... (Ox)>(
string,
- QtPrivate::makeIndexSequence<N> {},
offsets);
}
@@ -202,7 +189,6 @@ constexpr auto qOffsetStringArray(const char (&...strings)[Nx]) noexcept -> type
QtPrivate::staticString<Offsets::Length>(strings...), Offsets{});
}
-
QT_END_NAMESPACE
#endif // QOFFSETSTRINGARRAY_P_H