qt5base-lts/tests/auto/corelib
Marc Mutz 4469e36d72 qhashfunctions.h: add specializations of std::hash for some Qt types
We have a problem. Our types don't play well with the std unordered
containers, because they do not specialize std::hash. We therefore
force our users to come up with an implementation, hindering
interoperability, since any two developers are unlikely to come up
with compatible implementations. So combining libraries written by
different developers will result in ODR violations.

Now that we depend on C++11, and thus the presence of std::hash, we
still face the problem that the standard does not provide us with a
means to compose new hash functions out of old ones. In particular, we
cannot, yet, depend on C++17's std::hash<std::string_view> to
implement std::hash<QByteArray>, say. There's also no std::hash for
std::tuple, which would allow easy composition by using std::tie().

So piggy-back on the work we have done over the years on qHash()
functions, and implement the std::hash specializations for Qt types
using the existing qHash() functions, with a twist: The standard
allows implementations to provide means against predictable hash
values. Qt has this, too, but the seed is managed by the container and
passed to the qHash() function as a separate argument. The standard
does not have this explicit seed, so any protection must be implicit
in the normal use of std::hash.

To reap whatever protection that std library has on offer, if any, we
calculate a seed value by hashing int(0). This will be subject to
constant folding if there's no actual seed, but will produce a value
dependent on the seed if there is one.

Add some tests.

A question that remains is how to document the specialization. Can we
have a \stdhashable QDoc macro that does everything for us?

Task-number: QTBUG-33428
Change-Id: Idfe775f1661f8489587353c4b148d76611ac76f3
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2019-05-29 11:22:20 +02:00
..
animation Extend blacklisting of tst_qparallelanimationgroup tests to macOS 10.13 2018-09-24 21:13:30 +00:00
codecs Add tests for decoding too-short UTF-8 sequences 2018-09-25 22:14:07 +00:00
global Merge remote-tracking branch 'origin/5.13' into dev 2019-05-27 15:34:10 +02:00
io Merge "Merge remote-tracking branch 'origin/5.13' into dev" 2019-05-27 15:34:10 +02:00
itemmodels Tests: Fix some warnings about deprecated functions not under test 2019-05-27 15:29:16 +02:00
kernel tst_QVariant: Fix warnings about deprecated functions not under test — 2019-05-24 10:35:17 +02:00
mimetypes Remove handling of missing Q_COMPILER_RVALUE_REFS 2019-05-01 20:24:45 +00:00
plugin moc: Add a standard way of specifying a URI as part of Q_PLUGIN_METADATA 2019-04-11 14:43:27 +00:00
serialization Merge remote-tracking branch 'origin/5.13' into dev 2019-05-15 07:11:41 +02:00
statemachine QStateMachine: handle parallel child mode for state machines 2019-05-16 16:51:42 +02:00
thread Replace qMove with std::move 2019-04-06 11:00:38 +00:00
tools qhashfunctions.h: add specializations of std::hash for some Qt types 2019-05-29 11:22:20 +02:00
corelib.pro Create corelib/serialization and move existing file formats into it 2018-01-26 20:59:50 +00:00