/* * Copyright (C) 2008-2018 TrinityCore * * This program 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 2 of the License, or (at your * option) any later version. * * This program 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 this program. If not, see . */ #ifndef TrinityCore_Hash_h__ #define TrinityCore_Hash_h__ #include #include namespace Trinity { template inline void hash_combine(std::size_t& seed, T const& val) { seed ^= std::hash()(val) + 0x9E3779B9 + (seed << 6) + (seed >> 2); } } //! Hash implementation for std::pair to allow using pairs in unordered_set or as key for unordered_map //! Individual types used in pair must be hashable by std::hash namespace std { template struct hash> { public: size_t operator()(std::pair const& p) const { size_t hashVal = 0; Trinity::hash_combine(hashVal, p.first); Trinity::hash_combine(hashVal, p.second); return hashVal; } }; } #endif // TrinityCore_Hash_h__