/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { template struct GenericTraits { using PeekType = T; static constexpr bool is_trivial() { return false; } static constexpr bool equals(const T& a, const T& b) { return a == b; } }; template struct Traits : public GenericTraits { }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(int i) { return int_hash(i); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(char c) { return int_hash(c); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(i16 i) { return int_hash(i); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(i64 i) { return u64_hash(i); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(unsigned u) { return int_hash(u); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(u8 u) { return int_hash(u); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(u16 u) { return int_hash(u); } }; template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(u64 u) { return u64_hash(u); } }; template struct Traits : public GenericTraits { static unsigned hash(const T* p) { return int_hash((unsigned)(__PTRDIFF_TYPE__)p); } static constexpr bool is_trivial() { return true; } static bool equals(const T* a, const T* b) { return a == b; } }; } using AK::GenericTraits; using AK::Traits;