#pragma once namespace std { template <> struct hash { constexpr std::size_t operator()(const klotski::group::Group &g) const noexcept { // TODO: perf hash alg return std::hash{}(g.type_id() ^ g.pattern_id() ^ (int)g.toward()); } }; template <> struct hash { constexpr std::size_t operator()(const klotski::group::GroupUnion &gu) const noexcept { return std::hash{}(gu.unwrap()); } }; template <> struct hash { constexpr std::size_t operator()(const klotski::group::CaseInfo &info) const noexcept { // TODO: perf hash alg const auto h1 = std::hash{}(info.group()); const auto h2 = std::hash{}(info.case_id()); return h1 ^ h2; } }; } // namespace std