https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97773

--- Comment #2 from Janez Zemva <janezz55 at gmail dot com> ---
#include <chrono>

#include <functional>

#include <string_view>

#include <tuple>

#include <type_traits>

#include <unordered_map>

template <typename T>
struct hash : std::hash<T>
{
};

template <>
struct hash<std::chrono::seconds>
{
  auto operator()(std::chrono::seconds const cp) const noexcept
  {
    return std::hash<std::chrono::seconds::rep>()(cp.count());
  }
};

template <>
struct hash<std::chrono::time_point<std::chrono::system_clock>>
{
  auto operator()(std::chrono::time_point<std::chrono::system_clock> const tp)
const noexcept
  {
    return
std::hash<std::chrono::time_point<std::chrono::system_clock>::rep>()(tp.time_since_epoch().count());
  }
};

template <typename ...T>
std::size_t hash_combine(T&& ...v) noexcept(noexcept(
  ((hash<std::remove_cvref_t<T>>()(std::declval<T>())), ...)))
{
  auto seed{672807365};

  (
    (
      seed ^= hash<std::remove_cvref_t<T>>()(std::forward<T>(v)) +
        0x9e3779b9 + (seed << 6) + (seed >> 2)
    ),
    ...
  );

  return seed;
}

template <typename ...T>
struct hash<std::tuple<T...>>
{
  auto operator()(std::tuple<T...> const& t) const
  {
    return std::apply(hash_combine<T const&...>, t);
  }
};

int main()
{
  std::unordered_map<
    std::tuple<std::chrono::seconds,
std::chrono::time_point<std::chrono::system_clock>, std::string_view>,
    int,
    hash<std::tuple<std::chrono::seconds,
std::chrono::time_point<std::chrono::system_clock>, std::string_view>>
  > lol;

  return lol.size();
}

Reply via email to