5#ifndef QHASHEDSTRING_P_H
6#define QHASHEDSTRING_P_H
19#include <QtCore/qglobal.h>
20#include <QtCore/qstring.h>
21#include <private/qv4string_p.h>
29class QHashedStringRef;
33 inline QHashedString();
34 inline QHashedString(
const QString &string);
35 inline QHashedString(
const QString &string, quint32);
36 inline QHashedString(
const QHashedString &string);
38 inline QHashedString &operator=(
const QHashedString &string);
39 inline bool operator==(
const QHashedString &string)
const;
40 inline bool operator==(
const QHashedStringRef &string)
const;
42 inline quint32 hash()
const;
43 inline quint32 existingHash()
const;
45 static inline bool compare(
const QChar *lhs,
const char *rhs,
int length);
46 static inline bool compare(
const char *lhs,
const char *rhs,
int length);
48 static inline quint32 stringHash(
const QChar* data,
int length);
49 static inline quint32 stringHash(
const char *data,
int length);
52 friend class QHashedStringRef;
53 friend class QStringHashNode;
55 friend size_t qHash(
const QHashedString &key, size_t seed = 0)
56 {
return size_t{key.hash()} ^ seed; }
58 inline void computeHash()
const;
59 mutable quint32 m_hash = 0;
66 inline QHashedStringRef();
67 inline QHashedStringRef(
const QString &);
68 inline QHashedStringRef(QStringView);
69 inline QHashedStringRef(
const QChar *,
int);
70 inline QHashedStringRef(
const QChar *,
int, quint32);
71 inline QHashedStringRef(
const QHashedString &);
72 inline QHashedStringRef(
const QHashedStringRef &);
73 inline QHashedStringRef &operator=(
const QHashedStringRef &);
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;
79 inline bool operator!=(
const QString &string)
const;
80 inline bool operator!=(
const QHashedString &string)
const;
81 inline bool operator!=(
const QHashedStringRef &string)
const;
82 inline bool operator!=(
const QHashedCStringRef &string)
const;
84 inline quint32 hash()
const;
87 inline const QChar &at(
int)
const;
88 inline const QChar *constData()
const;
89 bool startsWith(
const QString &)
const;
90 bool endsWith(
const QString &)
const;
91 int indexOf(
const QChar &,
int from=0)
const;
92 QHashedStringRef mid(
int,
int)
const;
93 QList<QHashedStringRef> split(
const QChar sep)
const;
95 inline bool isEmpty()
const;
96 inline int length()
const;
97 inline bool startsWithUpper()
const;
99 QString toString()
const;
101 inline bool isLatin1()
const;
104 friend class QHashedString;
106 friend size_t qHash(
const QHashedStringRef &key, size_t seed = 0)
107 {
return size_t{key.hash()} ^ seed; }
109 inline void computeHash()
const;
111 const QChar *m_data =
nullptr;
113 mutable quint32 m_hash = 0;
127 inline int length()
const;
129 Q_AUTOTEST_EXPORT QString
toUtf16()
const;
134 friend class QHashedStringRef;
136 inline void computeHash()
const;
138 const char *m_data =
nullptr;
140 mutable quint32 m_hash = 0;
143QHashedString::QHashedString()
148QHashedString::QHashedString(
const QString &string)
149: QString(string), m_hash(0)
153QHashedString::QHashedString(
const QString &string, quint32 hash)
154: QString(string), m_hash(hash)
158QHashedString::QHashedString(
const QHashedString &string)
159: QString(string), m_hash(string.m_hash)
163QHashedString &QHashedString::operator=(
const QHashedString &string)
165 static_cast<QString &>(*
this) = string;
166 m_hash = string.m_hash;
170bool QHashedString::operator==(
const QHashedString &string)
const
172 return (string.m_hash == m_hash || !string.m_hash || !m_hash) &&
173 static_cast<
const QString &>(*
this) ==
static_cast<
const QString &>(string);
176bool QHashedString::operator==(
const QHashedStringRef &string)
const
178 if (m_hash && string.m_hash && m_hash != string.m_hash)
180 QStringView otherView {string.m_data, string.m_length};
181 return static_cast<
const QString &>(*
this) == otherView;
184quint32 QHashedString::hash()
const
186 if (!m_hash) computeHash();
190quint32 QHashedString::existingHash()
const
195QHashedStringRef::QHashedStringRef()
201QHashedStringRef::QHashedStringRef(
const QString &str)
202: m_data(str.constData()), m_length(
int(str.size())), m_hash(0)
204 Q_ASSERT(str.size() <= std::numeric_limits<
int>::max());
207QHashedStringRef::QHashedStringRef(QStringView str)
208: m_data(str.constData()), m_length(
int(str.size())), m_hash(0)
210 Q_ASSERT(str.size() <= std::numeric_limits<
int>::max());
213QHashedStringRef::QHashedStringRef(
const QChar *data,
int length)
214: m_data(data), m_length(length), m_hash(0)
218QHashedStringRef::QHashedStringRef(
const QChar *data,
int length, quint32 hash)
219: m_data(data), m_length(length), m_hash(hash)
223QHashedStringRef::QHashedStringRef(
const QHashedString &string)
224: m_data(string.constData()), m_length(
int(string.size())), m_hash(string.m_hash)
226 Q_ASSERT(string.size() <= std::numeric_limits<
int>::max());
229QHashedStringRef::QHashedStringRef(
const QHashedStringRef &string)
230: m_data(string.m_data), m_length(string.m_length), m_hash(string.m_hash)
234QHashedStringRef &QHashedStringRef::operator=(
const QHashedStringRef &o)
237 m_length = o.m_length;
242bool QHashedStringRef::operator==(
const QString &string)
const
244 QStringView view {m_data, m_length};
245 return view == string;
248bool QHashedStringRef::operator==(
const QHashedString &string)
const
250 if (m_hash && string.m_hash && m_hash != string.m_hash)
252 QStringView view {m_data, m_length};
253 QStringView otherView {string.constData(), string.size()};
254 return view == otherView;
257bool QHashedStringRef::operator==(
const QHashedStringRef &string)
const
259 if (m_hash && string.m_hash && m_hash != string.m_hash)
261 QStringView view {m_data, m_length};
262 QStringView otherView {string.m_data, string.m_length};
263 return view == otherView;
266bool QHashedStringRef::operator==(
const QHashedCStringRef &string)
const
268 return m_length == string.m_length &&
269 (m_hash == string.m_hash || !m_hash || !string.m_hash) &&
270 QHashedString::compare(m_data, string.m_data, m_length);
273bool QHashedStringRef::operator!=(
const QString &string)
const
275 return !(*
this == string);
278bool QHashedStringRef::operator!=(
const QHashedString &string)
const
280 return !(*
this == string);
283bool QHashedStringRef::operator!=(
const QHashedStringRef &string)
const
285 return !(*
this == string);
288bool QHashedStringRef::operator!=(
const QHashedCStringRef &string)
const
290 return !(*
this == string);
293QChar *QHashedStringRef::data()
295 return const_cast<QChar *>(m_data);
298const QChar &QHashedStringRef::at(
int index)
const
300 Q_ASSERT(index < m_length);
301 return m_data[index];
304const QChar *QHashedStringRef::constData()
const
309bool QHashedStringRef::isEmpty()
const
311 return m_length == 0;
314int QHashedStringRef::length()
const
319bool QHashedStringRef::isLatin1()
const
321 for (
int ii = 0; ii < m_length; ++ii)
322 if (m_data[ii].unicode() > 127)
return false;
326void QHashedStringRef::computeHash()
const
328 m_hash = QHashedString::stringHash(m_data, m_length);
331bool QHashedStringRef::startsWithUpper()
const
333 if (m_length < 1)
return false;
334 return m_data[0].isUpper();
337quint32 QHashedStringRef::hash()
const
339 if (!m_hash) computeHash();
348: m_data(data), m_length(length),
m_hash(0)
364 if (!m_hash) computeHash();
385 writeUtf16((quint16 *)output);
391 const char *d = m_data;
398 m_hash = QHashedString::stringHash(m_data, m_length);
401bool QHashedString::compare(
const QChar *lhs,
const char *rhs,
int length)
403 Q_ASSERT(lhs && rhs);
404 const quint16 *l = (
const quint16*)lhs;
406 if (*l++ != *rhs++)
return false;
410bool QHashedString::compare(
const char *lhs,
const char *rhs,
int length)
412 Q_ASSERT(lhs && rhs);
413 return 0 == ::memcmp(lhs, rhs, length);
417quint32 QHashedString::stringHash(
const QChar *data,
int length)
419 return QV4::String::createHashValue(data, length,
nullptr);
422quint32 QHashedString::stringHash(
const char *data,
int length)
424 return QV4::String::createHashValue(data, length,
nullptr);
427void QHashedString::computeHash()
const
429 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)