aboutsummaryrefslogtreecommitdiff
path: root/include/openvic-dataloader/detail/PointerHash.hpp
blob: c0d28bc4e9bca61b820d52c5386ea6e015242f0a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once

#include <cstdint>

namespace ovdl::detail {
   /* hash any pointer */
   template<typename T>
   struct PointerHash {
      using type = T;
      using ptr_type = T*;
      using const_type = const T;
      using const_ptr_type = const T*;
      using const_ptr_const_type = const const_ptr_type;
      constexpr std::size_t operator()(const_ptr_const_type pointer) const {
         auto addr = reinterpret_cast<uintptr_t>(pointer);
#if SIZE_MAX < UINTPTR_MAX
         /* size_t is not large enough to hold the pointer’s memory address */
         addr %= SIZE_MAX; /* truncate the address so it is small enough to fit in a size_t */
#endif
         return addr;
      }
   };
}