#pragma once #include "numeric.h" #include #include template class TRangeHash { private: template using TBase = std::conditional_t< !std::is_void::value, ElementHash, THash>; public: template size_t operator()(const Range& range) const { size_t accumulated = 0; for (const auto& element : range) { accumulated = CombineHashes(accumulated, TBase()(element)); } return accumulated; } }; using TSimpleRangeHash = TRangeHash<>; template class TContiguousHash { private: template using TBase = std::conditional_t< !std::is_void::value, RegionHash, TRangeHash>; public: template auto operator()(const ContainerType& container) const { return operator()(MakeArrayRef(container)); } template auto operator()(const TArrayRef& data) const { return TBase()(data); } };