summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2010-04-15 19:12:34 (GMT)
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2010-04-15 20:16:33 (GMT)
commit2c0f13ccfe750241eb7ddedf6412da380a146975 (patch)
treeff75556c7c677d10114b7d4f95f5a8fe65fa306c /tools
parent32aadef3a6621843fe065c3a5f2834a528a7d6fb (diff)
downloadQt-2c0f13ccfe750241eb7ddedf6412da380a146975.zip
Qt-2c0f13ccfe750241eb7ddedf6412da380a146975.tar.gz
Qt-2c0f13ccfe750241eb7ddedf6412da380a146975.tar.bz2
make HashString and HashStringList objects smaller
qHash(QString) has only 28 bits, so we can use the upper bits for flagging whether the hash is valid. size effect: LP32: align(4, 4 + 4 + 1) = 12 vs. align(4, 4 + 4) = 8 LP64: align(8, 8 + 8 + 1) = 24 vs. align(8, 8 + 8) = 16 P64: align(8, 8 + 4 + 1) = 16 vs. align(8, 8 + 4) = 16
Diffstat (limited to 'tools')
-rw-r--r--tools/linguist/lupdate/cpp.cpp23
1 files changed, 10 insertions, 13 deletions
diff --git a/tools/linguist/lupdate/cpp.cpp b/tools/linguist/lupdate/cpp.cpp
index 66a079a..3422212 100644
--- a/tools/linguist/lupdate/cpp.cpp
+++ b/tools/linguist/lupdate/cpp.cpp
@@ -65,47 +65,44 @@ static QString MagicComment(QLatin1String("TRANSLATOR"));
class HashString {
public:
- HashString() : m_hashed(false) {}
- explicit HashString(const QString &str) : m_str(str), m_hashed(false) {}
- void setValue(const QString &str) { m_str = str; m_hashed = false; }
+ HashString() : m_hash(0x80000000) {}
+ explicit HashString(const QString &str) : m_str(str), m_hash(0x80000000) {}
+ void setValue(const QString &str) { m_str = str; m_hash = 0x80000000; }
const QString &value() const { return m_str; }
bool operator==(const HashString &other) const { return m_str == other.m_str; }
private:
QString m_str;
+ // qHash() of a QString is only 28 bits wide, so we can use
+ // the highest bit(s) as the "hash valid" flag.
mutable uint m_hash;
- mutable bool m_hashed;
friend uint qHash(const HashString &str);
};
uint qHash(const HashString &str)
{
- if (!str.m_hashed) {
- str.m_hashed = true;
+ if (str.m_hash & 0x80000000)
str.m_hash = qHash(str.m_str);
- }
return str.m_hash;
}
class HashStringList {
public:
- explicit HashStringList(const QList<HashString> &list) : m_list(list), m_hashed(false) {}
+ explicit HashStringList(const QList<HashString> &list) : m_list(list), m_hash(0x80000000) {}
const QList<HashString> &value() const { return m_list; }
bool operator==(const HashStringList &other) const { return m_list == other.m_list; }
private:
QList<HashString> m_list;
mutable uint m_hash;
- mutable bool m_hashed;
friend uint qHash(const HashStringList &list);
};
uint qHash(const HashStringList &list)
{
- if (!list.m_hashed) {
- list.m_hashed = true;
+ if (list.m_hash & 0x80000000) {
uint hash = 0;
foreach (const HashString &qs, list.m_list) {
- hash ^= qHash(qs) ^ 0xa09df22f;
- hash = (hash << 13) | (hash >> 19);
+ hash ^= qHash(qs) ^ 0x0ad9f526;
+ hash = ((hash << 13) & 0x0fffffff) | (hash >> 15);
}
list.m_hash = hash;
}