AK: Add the concept of hash-compatible types

This commit is contained in:
Hendiadyoin1 2021-11-07 14:50:41 +01:00 committed by Ali Mohammad Pur
parent 92e824afa1
commit c8bee92fb9
3 changed files with 16 additions and 0 deletions

View file

@ -36,6 +36,9 @@ concept SameAs = IsSame<T, U>;
template<typename T>
concept AnyString = Detail::IsConstructible<StringView, T>;
template<typename T, typename U>
concept HashCompatible = IsHashCompatible<Detail::Decay<T>, Detail::Decay<U>>;
// FIXME: remove once Clang formats these properly.
// clang-format off
template<typename Func, typename... Args>

View file

@ -575,6 +575,12 @@ using Decay = typename __decay<T>::type;
template<typename T, typename U>
inline constexpr bool IsPointerOfType = IsPointer<Decay<U>>&& IsSame<T, RemoveCV<RemovePointer<Decay<U>>>>;
template<typename T, typename U>
inline constexpr bool IsHashCompatible = false;
template<typename T>
inline constexpr bool IsHashCompatible<T, T> = true;
}
using AK::Detail::AddConst;
using AK::Detail::AddLvalueReference;
@ -605,6 +611,7 @@ using AK::Detail::IsEnum;
using AK::Detail::IsFloatingPoint;
using AK::Detail::IsFunction;
using AK::Detail::IsFundamental;
using AK::Detail::IsHashCompatible;
using AK::Detail::IsIntegral;
using AK::Detail::IsLvalueReference;
using AK::Detail::IsMoveAssignable;

View file

@ -7,10 +7,16 @@
#pragma once
#include <AK/Concepts.h>
#include <AK/Forward.h>
namespace AK {
namespace Detail {
template<Concepts::AnyString T, Concepts::AnyString U>
inline constexpr bool IsHashCompatible<T, U> = true;
}
enum class CaseSensitivity {
CaseInsensitive,
CaseSensitive,