/* This file is part of Fennix Kernel. Fennix Kernel is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Fennix Kernel is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Fennix Kernel. If not, see . */ #pragma once namespace std { template struct equal_to { bool operator()(const T &lhs, const T &rhs) const { return lhs == rhs; } }; template struct hash { size_t operator()(const Key &key) const { #if defined(a64) static_assert(sizeof(uintptr_t) == sizeof(uint64_t)); const uint64_t FNV_OFFSET_BASIS = 14695981039346656037ull; const uint64_t FNV_PRIME = 1099511628211ull; #elif defined(a32) static_assert(sizeof(uintptr_t) == sizeof(uint32_t)); const uint32_t FNV_OFFSET_BASIS = 2166136261u; const uint32_t FNV_PRIME = 16777619u; #else #error "Unsupported architecture" #endif const uint8_t *data = reinterpret_cast(&key); const size_t size = sizeof(Key); uintptr_t hash = FNV_OFFSET_BASIS; for (size_t i = 0; i < size; ++i) { hash ^= static_cast(data[i]); hash *= FNV_PRIME; } return static_cast(hash); } }; }