4#ifndef QHASHEDSTRING_P_H
5#define QHASHEDSTRING_P_H
18#include <QtCore/qglobal.h>
19#include <QtCore/qstring.h>
20#include <private/qv4string_p.h>
28class QHashedStringRef;
32 inline QHashedString();
33 inline QHashedString(
const QString &string);
34 inline QHashedString(
const QString &string, quint32);
35 inline QHashedString(
const QHashedString &string);
37 inline QHashedString &operator=(
const QHashedString &string);
38 inline bool operator==(
const QHashedString &string)
const;
39 inline bool operator==(
const QHashedStringRef &string)
const;
41 inline quint32 hash()
const;
42 inline quint32 existingHash()
const;
44 static inline bool compare(
const QChar *lhs,
const char *rhs,
int length);
45 static inline bool compare(
const char *lhs,
const char *rhs,
int length);
47 static inline quint32 stringHash(
const QChar* data,
int length);
48 static inline quint32 stringHash(
const char *data,
int length);
51 friend class QHashedStringRef;
52 friend class QStringHashNode;
54 inline void computeHash()
const;
55 mutable quint32 m_hash = 0;
62 inline QHashedStringRef();
63 inline QHashedStringRef(
const QString &);
64 inline QHashedStringRef(QStringView);
65 inline QHashedStringRef(
const QChar *,
int);
66 inline QHashedStringRef(
const QChar *,
int, quint32);
67 inline QHashedStringRef(
const QHashedString &);
68 inline QHashedStringRef(
const QHashedStringRef &);
69 inline QHashedStringRef &operator=(
const QHashedStringRef &);
71 inline bool operator==(
const QString &string)
const;
72 inline bool operator==(
const QHashedString &string)
const;
73 inline bool operator==(
const QHashedStringRef &string)
const;
74 inline bool operator==(
const QHashedCStringRef &string)
const;
75 inline bool operator!=(
const QString &string)
const;
76 inline bool operator!=(
const QHashedString &string)
const;
77 inline bool operator!=(
const QHashedStringRef &string)
const;
78 inline bool operator!=(
const QHashedCStringRef &string)
const;
80 inline quint32 hash()
const;
83 inline const QChar &at(
int)
const;
84 inline const QChar *constData()
const;
85 bool startsWith(
const QString &)
const;
86 bool endsWith(
const QString &)
const;
87 int indexOf(
const QChar &,
int from=0)
const;
88 QHashedStringRef mid(
int,
int)
const;
89 QVector<QHashedStringRef> split(
const QChar sep)
const;
91 inline bool isEmpty()
const;
92 inline int length()
const;
93 inline bool startsWithUpper()
const;
95 QString toString()
const;
97 inline bool isLatin1()
const;
100 friend class QHashedString;
102 inline void computeHash()
const;
104 const QChar *m_data =
nullptr;
106 mutable quint32 m_hash = 0;
120 inline int length()
const;
122 Q_AUTOTEST_EXPORT QString
toUtf16()
const;
127 friend class QHashedStringRef;
129 inline void computeHash()
const;
131 const char *m_data =
nullptr;
133 mutable quint32 m_hash = 0;
138 return uint(string.hash());
143 return uint(string.hash());
146QHashedString::QHashedString()
151QHashedString::QHashedString(
const QString &string)
152: QString(string), m_hash(0)
156QHashedString::QHashedString(
const QString &string, quint32 hash)
157: QString(string), m_hash(hash)
161QHashedString::QHashedString(
const QHashedString &string)
162: QString(string), m_hash(string.m_hash)
166QHashedString &QHashedString::operator=(
const QHashedString &string)
168 static_cast<QString &>(*
this) = string;
169 m_hash = string.m_hash;
173bool QHashedString::operator==(
const QHashedString &string)
const
175 return (string.m_hash == m_hash || !string.m_hash || !m_hash) &&
176 static_cast<
const QString &>(*
this) ==
static_cast<
const QString &>(string);
179bool QHashedString::operator==(
const QHashedStringRef &string)
const
181 if (m_hash && string.m_hash && m_hash != string.m_hash)
183 QStringView otherView {string.m_data, string.m_length};
184 return static_cast<
const QString &>(*
this) == otherView;
187quint32 QHashedString::hash()
const
189 if (!m_hash) computeHash();
193quint32 QHashedString::existingHash()
const
198QHashedStringRef::QHashedStringRef()
204QHashedStringRef::QHashedStringRef(
const QString &str)
205: m_data(str.constData()), m_length(
int(str.size())), m_hash(0)
207 Q_ASSERT(str.size() <= std::numeric_limits<
int>::max());
210QHashedStringRef::QHashedStringRef(QStringView str)
211: m_data(str.constData()), m_length(
int(str.size())), m_hash(0)
213 Q_ASSERT(str.size() <= std::numeric_limits<
int>::max());
216QHashedStringRef::QHashedStringRef(
const QChar *data,
int length)
217: m_data(data), m_length(length), m_hash(0)
221QHashedStringRef::QHashedStringRef(
const QChar *data,
int length, quint32 hash)
222: m_data(data), m_length(length), m_hash(hash)
226QHashedStringRef::QHashedStringRef(
const QHashedString &string)
227: m_data(string.constData()), m_length(
int(string.size())), m_hash(string.m_hash)
229 Q_ASSERT(string.size() <= std::numeric_limits<
int>::max());
232QHashedStringRef::QHashedStringRef(
const QHashedStringRef &string)
233: m_data(string.m_data), m_length(string.m_length), m_hash(string.m_hash)
237QHashedStringRef &QHashedStringRef::operator=(
const QHashedStringRef &o)
240 m_length = o.m_length;
245bool QHashedStringRef::operator==(
const QString &string)
const
247 QStringView view {m_data, m_length};
248 return view == string;
251bool QHashedStringRef::operator==(
const QHashedString &string)
const
253 if (m_hash && string.m_hash && m_hash != string.m_hash)
255 QStringView view {m_data, m_length};
256 QStringView otherView {string.constData(), string.size()};
257 return view == otherView;
260bool QHashedStringRef::operator==(
const QHashedStringRef &string)
const
262 if (m_hash && string.m_hash && m_hash != string.m_hash)
264 QStringView view {m_data, m_length};
265 QStringView otherView {string.m_data, string.m_length};
266 return view == otherView;
269bool QHashedStringRef::operator==(
const QHashedCStringRef &string)
const
271 return m_length == string.m_length &&
272 (m_hash == string.m_hash || !m_hash || !string.m_hash) &&
273 QHashedString::compare(m_data, string.m_data, m_length);
276bool QHashedStringRef::operator!=(
const QString &string)
const
278 return !(*
this == string);
281bool QHashedStringRef::operator!=(
const QHashedString &string)
const
283 return !(*
this == string);
286bool QHashedStringRef::operator!=(
const QHashedStringRef &string)
const
288 return !(*
this == string);
291bool QHashedStringRef::operator!=(
const QHashedCStringRef &string)
const
293 return !(*
this == string);
296QChar *QHashedStringRef::data()
298 return const_cast<QChar *>(m_data);
301const QChar &QHashedStringRef::at(
int index)
const
303 Q_ASSERT(index < m_length);
304 return m_data[index];
307const QChar *QHashedStringRef::constData()
const
312bool QHashedStringRef::isEmpty()
const
314 return m_length == 0;
317int QHashedStringRef::length()
const
322bool QHashedStringRef::isLatin1()
const
324 for (
int ii = 0; ii < m_length; ++ii)
325 if (m_data[ii].unicode() > 127)
return false;
329void QHashedStringRef::computeHash()
const
331 m_hash = QHashedString::stringHash(m_data, m_length);
334bool QHashedStringRef::startsWithUpper()
const
336 if (m_length < 1)
return false;
337 return m_data[0].isUpper();
340quint32 QHashedStringRef::hash()
const
342 if (!m_hash) computeHash();
351: m_data(data), m_length(length),
m_hash(0)
367 if (!m_hash) computeHash();
388 writeUtf16((quint16 *)output);
394 const char *d = m_data;
401 m_hash = QHashedString::stringHash(m_data, m_length);
404bool QHashedString::compare(
const QChar *lhs,
const char *rhs,
int length)
406 Q_ASSERT(lhs && rhs);
407 const quint16 *l = (
const quint16*)lhs;
409 if (*l++ != *rhs++)
return false;
413bool QHashedString::compare(
const char *lhs,
const char *rhs,
int length)
415 Q_ASSERT(lhs && rhs);
416 return 0 == ::memcmp(lhs, rhs, length);
420quint32 QHashedString::stringHash(
const QChar *data,
int length)
422 return QV4::String::createHashValue(data, length,
nullptr);
425quint32 QHashedString::stringHash(
const char *data,
int length)
427 return QV4::String::createHashValue(data, length,
nullptr);
430void QHashedString::computeHash()
const
432 m_hash = stringHash(constData(),
int(size()));
QHashedCStringRef(const QHashedCStringRef &)
const char * constData() const
void writeUtf16(QChar *) const
QHashedCStringRef(const char *, int, quint32)
QHashedCStringRef(const char *, int)
Combined button and popup list for selecting options.
QString asString(const QHashedStringRef &ref)
QString asString(const QHashedCStringRef &ref)
size_t qHash(const QHashedString &string)
size_t qHash(const QHashedStringRef &string)