6#ifndef QHASHFUNCTIONS_H
7#define QHASHFUNCTIONS_H
9#include <QtCore/qstring.h>
10#include <QtCore/qstringfwd.h>
21#pragma qt_class(QHashFunctions)
25#pragma warning( push )
26#pragma warning( disable : 4311 )
27#pragma warning( disable : 4127 )
34#if QT_DEPRECATED_SINCE(6,6)
36Q_CORE_EXPORT
int qGlobalQHashSeed();
38Q_CORE_EXPORT
void qSetGlobalQHashSeed(
int newSeed);
44 constexpr operator size_t() const noexcept {
return data; }
61#ifndef Q_PROCESSOR_ARM
73 if constexpr (
sizeof(size_t) == 4) {
75 key *= UINT32_C(0x45d9f3b);
77 key *= UINT32_C(0x45d9f3b);
83 key64 *= UINT64_C(0xd6e8feb86659fd93);
85 key64 *= UINT64_C(0xd6e8feb86659fd93);
91template <
typename T1,
typename T2>
static constexpr bool noexceptPairHash();
97template <typename T1, typename T2> inline
size_t qHash(const
std::pair<T1, T2> &
key,
size_t seed = 0)
121 if constexpr (
sizeof(
quint64) >
sizeof(
size_t))
127 if constexpr (
sizeof(
qint64) >
sizeof(
size_t)) {
136 signmask = QT_VERSION_MAJOR > 6 ? signmask : 0;
137 low ^= signmask ^ high;
142#if QT_SUPPORTS_INT128
147constexpr size_t qHash(qint128
key,
size_t seed = 0) noexcept
154 low += signmask ^ high;
163 memcpy(&k, &
key,
sizeof(
float));
178template <
class T>
inline size_t qHash(
const T *
key,
size_t seed = 0) noexcept
186template <
class Enum, std::enable_if_t<std::is_enum_v<Enum>,
bool> = true>
193#if QT_CORE_REMOVED_SINCE(6, 4)
206#ifndef QT_BOOTSTRAPPED
214template <typename
Enum>
220#if (QT_VERSION < QT_VERSION_CHECK(7, 0, 0))
225template <
typename T,
typename =
void>
226constexpr inline bool HasQHashSingleArgOverload =
false;
229constexpr inline bool HasQHashSingleArgOverload<T, std::enable_if_t<
230 std::is_convertible_v<decltype(qHash(std::declval<const T &>())),
size_t>
234template <
typename T, std::enable_if_t<QHashPrivate::HasQHashSingleArgOverload<T> && !std::is_enum_v<T>,
bool> = true>
241template <
typename Key,
typename T>
concept HeterogeneouslySearchableWithHelper =
243 !std::is_same_v<Key, T>
245 && std::equality_comparable_with<Key, T>
261template <
typename T1,
typename T2>
262std::enable_if_t<QHashPrivate::HeterogeneouslySearchableWith<T1, T2>,
bool>
273 template <
typename T>
287 template <
typename T>
292template <
typename... T>
294 std::declval< std::enable_if_t<(
sizeof...(T) > 0)> >(),
295 (
qHash(std::declval<const T &>()), ...),
304template <
typename T,
typename Enable =
void>
315template <
typename... T>
323 noexcept(std::conjunction_v<QtPrivate::QNothrowHashable<T>...>)
329template <
typename... T>
337 noexcept(std::conjunction_v<QtPrivate::QNothrowHashable<T>...>)
343template <
typename InputIterator>
350template <
typename InputIterator>
361 return noexcept(
qHash(std::declval<T1>(),
seed)) &&
noexcept(
qHash(std::declval<T2>(),
seed));
365template <
typename T1,
typename T2>
inline size_t qHash(
const std::pair<T1, T2> &
key,
size_t seed)
366 noexcept(QHashPrivate::noexceptPairHash<T1, T2>())
371#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, Arguments) \
372 QT_BEGIN_INCLUDE_NAMESPACE \
375 struct hash< QT_PREPEND_NAMESPACE(Class) > { \
376 using argument_type = QT_PREPEND_NAMESPACE(Class); \
377 using result_type = size_t; \
378 size_t operator()(Arguments s) const \
379 noexcept(QT_PREPEND_NAMESPACE( \
380 QtPrivate::QNothrowHashable_v)<argument_type>) \
386 using QT_PREPEND_NAMESPACE(qHash); \
387 return qHash(s, qHash(std::hash<int>{}(0))); \
391 QT_END_INCLUDE_NAMESPACE \
394#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(Class) \
395 QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, const argument_type &)
396#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(Class) \
397 QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, argument_type)
404#ifndef QT_BOOTSTRAPPED
410#if defined(Q_CC_MSVC)
411#pragma warning( pop )
\macro QT_RESTRICTED_CAST_FROM_ASCII
QHash< int, QWidget * > hash
[35multi]
Q_DECL_CONST_FUNCTION constexpr size_t hash(size_t key, size_t seed) noexcept
constexpr bool HeterogeneouslySearchableWith
static constexpr bool noexceptPairHash()
Combined button and popup list for selecting options.
decltype( std::declval< std::enable_if_t<(sizeof...(T) > 0)> >(),(qHash(std::declval< const T & >()),...), size_t{}) QHashMultiReturnType
constexpr bool QNothrowHashableHelper_v
constexpr bool QNothrowHashable_v
std::remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
QByteArrayView qToByteArrayViewIgnoringNull(const QByteArrayLike &b) noexcept
#define Q_DECL_PURE_FUNCTION
#define Q_DECL_CONST_FUNCTION
size_t qHash(const QFileSystemWatcherPathKey &key, size_t seed=0)
#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(Class)
bool qHashEquals(const T &a, const T &b)
size_t qHash(const std::pair< T1, T2 > &key, size_t seed=0) noexcept(QHashPrivate::noexceptPairHash< T1, T2 >())
#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(Class)
size_t qHashRange(InputIterator first, InputIterator last, size_t seed=0) noexcept(noexcept(qHash(*first)))
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHashBits(const void *p, size_t size, size_t seed=0) noexcept
constexpr QtPrivate::QHashMultiReturnType< T... > qHashMultiCommutative(size_t seed, const T &... args) noexcept(std::conjunction_v< QtPrivate::QNothrowHashable< T >... >)
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qt_hash(QStringView key, uint chained=0) noexcept
size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed=0) noexcept(noexcept(qHash(*first)))
constexpr QtPrivate::QHashMultiReturnType< T... > qHashMulti(size_t seed, const T &... args) noexcept(std::conjunction_v< QtPrivate::QNothrowHashable< T >... >)
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
#define QT_DEPRECATED_VERSION_X_6_6(text)
QT_BEGIN_NAMESPACE constexpr std::underlying_type_t< Enum > qToUnderlying(Enum e) noexcept
#define QT6_DECL_NEW_OVERLOAD_TAIL
unsigned long long quint64
static Q_CORE_EXPORT void setDeterministicGlobalSeed()
\threadsafe
static Q_CORE_EXPORT void resetRandomGlobalSeed()
\threadsafe
constexpr QHashSeed(size_t d=0)
Constructs a new QHashSeed object using data as the seed.
static Q_CORE_EXPORT QHashSeed globalSeed() noexcept
\threadsafe
constexpr result_type operator()(size_t seed, const T &t) const noexcept(noexcept(qHash(t)))
constexpr result_type operator()(size_t seed, const T &t) const noexcept(noexcept(qHash(t)))