5#ifndef QHASHFUNCTIONS_H
6#define QHASHFUNCTIONS_H
8#include <QtCore/qstring.h>
9#include <QtCore/qstringfwd.h>
10#include <QtCore/qpair.h>
16#pragma qt_class(QHashFunctions)
20#pragma warning( push )
21#pragma warning( disable : 4311 )
22#pragma warning( disable : 4127 )
29#if QT_DEPRECATED_SINCE(6,6)
31Q_CORE_EXPORT
int qGlobalQHashSeed();
33Q_CORE_EXPORT
void qSetGlobalQHashSeed(
int newSeed);
39 constexpr operator size_t() const noexcept {
return data; }
53 if constexpr (
sizeof(size_t) == 4) {
55 key *= UINT32_C(0x45d9f3b);
57 key *= UINT32_C(0x45d9f3b);
63 key64 *= UINT64_C(0xd6e8feb86659fd93);
65 key64 *= UINT64_C(0xd6e8feb86659fd93);
71template <
typename T1,
typename T2>
static constexpr bool noexceptPairHash();
77template <typename T1, typename T2> inline
size_t qHash(const
std::pair<T1, T2> &
key,
size_t seed = 0)
101 if constexpr (
sizeof(
quint64) >
sizeof(
size_t))
111 memcpy(&k, &
key,
sizeof(
float));
115#if !defined(Q_OS_DARWIN) || defined(Q_QDOC)
128template <
class T>
inline size_t qHash(
const T *
key,
size_t seed = 0) noexcept
136template <
class Enum, std::enable_if_t<std::is_enum_v<Enum>,
bool> = true>
143#if QT_CORE_REMOVED_SINCE(6, 4)
162template <typename Enum>
168#if (QT_VERSION < QT_VERSION_CHECK(7, 0, 0))
173template <
typename T,
typename =
void>
174constexpr inline bool HasQHashSingleArgOverload =
false;
177constexpr inline bool HasQHashSingleArgOverload<T, std::enable_if_t<
178 std::is_convertible_v<decltype(qHash(std::declval<const T &>())),
size_t>
182template <
typename T, std::enable_if_t<QHashPrivate::HasQHashSingleArgOverload<T> && !std::is_enum_v<T>,
bool> = true>
198 template <
typename T>
212 template <
typename T>
217template <
typename... T>
219 std::declval< std::enable_if_t<(
sizeof...(T) > 0)> >(),
220 (
qHash(std::declval<const T &>()), ...),
229template <
typename T,
typename Enable =
void>
240template <
typename... T>
248 noexcept(std::conjunction_v<QtPrivate::QNothrowHashable<T>...>)
254template <
typename... T>
262 noexcept(std::conjunction_v<QtPrivate::QNothrowHashable<T>...>)
268template <
typename InputIterator>
275template <
typename InputIterator>
286 return noexcept(
qHash(std::declval<T1>(),
seed)) &&
noexcept(
qHash(std::declval<T2>(),
seed));
290template <
typename T1,
typename T2>
inline size_t qHash(
const std::pair<T1, T2> &
key,
size_t seed)
291 noexcept(QHashPrivate::noexceptPairHash<T1, T2>())
296#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, Arguments) \
297 QT_BEGIN_INCLUDE_NAMESPACE \
300 struct hash< QT_PREPEND_NAMESPACE(Class) > { \
301 using argument_type = QT_PREPEND_NAMESPACE(Class); \
302 using result_type = size_t; \
303 size_t operator()(Arguments s) const \
304 noexcept(QT_PREPEND_NAMESPACE( \
305 QtPrivate::QNothrowHashable_v)<argument_type>) \
311 using QT_PREPEND_NAMESPACE(qHash); \
312 return qHash(s, qHash(std::hash<int>{}(0))); \
316 QT_END_INCLUDE_NAMESPACE \
319#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(Class) \
320 QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, const argument_type &)
321#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(Class) \
322 QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, argument_type)
333#if defined(Q_CC_MSVC)
334#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
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
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)
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)))