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 inline void computeHash()
const;
56 mutable quint32 m_hash = 0;
63 inline QHashedStringRef();
64 inline QHashedStringRef(
const QString &);
65 inline QHashedStringRef(QStringView);
66 inline QHashedStringRef(
const QChar *,
int);
67 inline QHashedStringRef(
const QChar *,
int, quint32);
68 inline QHashedStringRef(
const QHashedString &);
69 inline QHashedStringRef(
const QHashedStringRef &);
70 inline QHashedStringRef &operator=(
const QHashedStringRef &);
72 inline bool operator==(
const QString &string)
const;
73 inline bool operator==(
const QHashedString &string)
const;
74 inline bool operator==(
const QHashedStringRef &string)
const;
75 inline bool operator==(
const QHashedCStringRef &string)
const;
76 inline bool operator!=(
const QString &string)
const;
77 inline bool operator!=(
const QHashedString &string)
const;
78 inline bool operator!=(
const QHashedStringRef &string)
const;
79 inline bool operator!=(
const QHashedCStringRef &string)
const;
81 inline quint32 hash()
const;
84 inline const QChar &at(
int)
const;
85 inline const QChar *constData()
const;
86 bool startsWith(
const QString &)
const;
87 bool endsWith(
const QString &)
const;
88 int indexOf(
const QChar &,
int from=0)
const;
89 QHashedStringRef mid(
int,
int)
const;
90 QList<QHashedStringRef> split(
const QChar sep)
const;
92 inline bool isEmpty()
const;
93 inline int length()
const;
94 inline bool startsWithUpper()
const;
96 QString toString()
const;
98 inline bool isLatin1()
const;
101 friend class QHashedString;
103 inline void computeHash()
const;
105 const QChar *m_data =
nullptr;
107 mutable quint32 m_hash = 0;
121 inline int length()
const;
123 Q_AUTOTEST_EXPORT QString
toUtf16()
const;
128 friend class QHashedStringRef;
130 inline void computeHash()
const;
132 const char *m_data =
nullptr;
134 mutable quint32 m_hash = 0;
139 return uint(string.hash());
144 return uint(string.hash());
147QHashedString::QHashedString()
152QHashedString::QHashedString(
const QString &string)
153: QString(string), m_hash(0)
157QHashedString::QHashedString(
const QString &string, quint32 hash)
158: QString(string), m_hash(hash)
162QHashedString::QHashedString(
const QHashedString &string)
163: QString(string), m_hash(string.m_hash)
167QHashedString &QHashedString::operator=(
const QHashedString &string)
169 static_cast<QString &>(*
this) = string;
170 m_hash = string.m_hash;
174bool QHashedString::operator==(
const QHashedString &string)
const
176 return (string.m_hash == m_hash || !string.m_hash || !m_hash) &&
177 static_cast<
const QString &>(*
this) ==
static_cast<
const QString &>(string);
180bool QHashedString::operator==(
const QHashedStringRef &string)
const
182 if (m_hash && string.m_hash && m_hash != string.m_hash)
184 QStringView otherView {string.m_data, string.m_length};
185 return static_cast<
const QString &>(*
this) == otherView;
188quint32 QHashedString::hash()
const
190 if (!m_hash) computeHash();
194quint32 QHashedString::existingHash()
const
199QHashedStringRef::QHashedStringRef()
205QHashedStringRef::QHashedStringRef(
const QString &str)
206: m_data(str.constData()), m_length(
int(str.size())), m_hash(0)
208 Q_ASSERT(str.size() <= std::numeric_limits<
int>::max());
211QHashedStringRef::QHashedStringRef(QStringView str)
212: m_data(str.constData()), m_length(
int(str.size())), m_hash(0)
214 Q_ASSERT(str.size() <= std::numeric_limits<
int>::max());
217QHashedStringRef::QHashedStringRef(
const QChar *data,
int length)
218: m_data(data), m_length(length), m_hash(0)
222QHashedStringRef::QHashedStringRef(
const QChar *data,
int length, quint32 hash)
223: m_data(data), m_length(length), m_hash(hash)
227QHashedStringRef::QHashedStringRef(
const QHashedString &string)
228: m_data(string.constData()), m_length(
int(string.size())), m_hash(string.m_hash)
230 Q_ASSERT(string.size() <= std::numeric_limits<
int>::max());
233QHashedStringRef::QHashedStringRef(
const QHashedStringRef &string)
234: m_data(string.m_data), m_length(string.m_length), m_hash(string.m_hash)
238QHashedStringRef &QHashedStringRef::operator=(
const QHashedStringRef &o)
241 m_length = o.m_length;
246bool QHashedStringRef::operator==(
const QString &string)
const
248 QStringView view {m_data, m_length};
249 return view == string;
252bool QHashedStringRef::operator==(
const QHashedString &string)
const
254 if (m_hash && string.m_hash && m_hash != string.m_hash)
256 QStringView view {m_data, m_length};
257 QStringView otherView {string.constData(), string.size()};
258 return view == otherView;
261bool QHashedStringRef::operator==(
const QHashedStringRef &string)
const
263 if (m_hash && string.m_hash && m_hash != string.m_hash)
265 QStringView view {m_data, m_length};
266 QStringView otherView {string.m_data, string.m_length};
267 return view == otherView;
270bool QHashedStringRef::operator==(
const QHashedCStringRef &string)
const
272 return m_length == string.m_length &&
273 (m_hash == string.m_hash || !m_hash || !string.m_hash) &&
274 QHashedString::compare(m_data, string.m_data, m_length);
277bool QHashedStringRef::operator!=(
const QString &string)
const
279 return !(*
this == string);
282bool QHashedStringRef::operator!=(
const QHashedString &string)
const
284 return !(*
this == string);
287bool QHashedStringRef::operator!=(
const QHashedStringRef &string)
const
289 return !(*
this == string);
292bool QHashedStringRef::operator!=(
const QHashedCStringRef &string)
const
294 return !(*
this == string);
297QChar *QHashedStringRef::data()
299 return const_cast<QChar *>(m_data);
302const QChar &QHashedStringRef::at(
int index)
const
304 Q_ASSERT(index < m_length);
305 return m_data[index];
308const QChar *QHashedStringRef::constData()
const
313bool QHashedStringRef::isEmpty()
const
315 return m_length == 0;
318int QHashedStringRef::length()
const
323bool QHashedStringRef::isLatin1()
const
325 for (
int ii = 0; ii < m_length; ++ii)
326 if (m_data[ii].unicode() > 127)
return false;
330void QHashedStringRef::computeHash()
const
332 m_hash = QHashedString::stringHash(m_data, m_length);
335bool QHashedStringRef::startsWithUpper()
const
337 if (m_length < 1)
return false;
338 return m_data[0].isUpper();
341quint32 QHashedStringRef::hash()
const
343 if (!m_hash) computeHash();
352: m_data(data), m_length(length),
m_hash(0)
368 if (!m_hash) computeHash();
389 writeUtf16((quint16 *)output);
395 const char *d = m_data;
402 m_hash = QHashedString::stringHash(m_data, m_length);
405bool QHashedString::compare(
const QChar *lhs,
const char *rhs,
int length)
407 Q_ASSERT(lhs && rhs);
408 const quint16 *l = (
const quint16*)lhs;
410 if (*l++ != *rhs++)
return false;
414bool QHashedString::compare(
const char *lhs,
const char *rhs,
int length)
416 Q_ASSERT(lhs && rhs);
417 return 0 == ::memcmp(lhs, rhs, length);
421quint32 QHashedString::stringHash(
const QChar *data,
int length)
423 return QV4::String::createHashValue(data, length,
nullptr);
426quint32 QHashedString::stringHash(
const char *data,
int length)
428 return QV4::String::createHashValue(data, length,
nullptr);
431void QHashedString::computeHash()
const
433 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)