16 #ifndef ADOBE_FNV_NO_BIGINTS
17 #include <boost/multiprecision/cpp_int.hpp>
20 #include <adobe/functional/operator.hpp>
88 constexpr std::size_t rollup(std::size_t n) {
89 return n == 0 ? 0 : n <= 32 ? 32 : n <= 64 ? 64 : n <= 128 ? 128 : n <= 256
99 template <std::
size_t Bits>
100 struct fnv_base_traits {};
105 struct fnv_base_traits<32> {
106 typedef std::uint32_t value_type;
108 static constexpr std::size_t size() {
return 32; }
110 static constexpr value_type offset_basis() {
return 0x811c9dc5; }
112 static constexpr value_type prime() {
return 0x1000193; }
118 struct fnv_base_traits<64> {
119 typedef std::uint64_t value_type;
121 static constexpr std::size_t size() {
return 64; }
123 static constexpr value_type offset_basis() {
return 0xcbf29ce484222325; }
125 static constexpr value_type prime() {
return 0x100000001b3; }
129 #ifndef ADOBE_FNV_NO_BIGINTS
130 using namespace boost::multiprecision::literals;
135 struct fnv_base_traits<128> {
136 typedef boost::multiprecision::uint128_t value_type;
138 static constexpr std::size_t size() {
return 128; }
140 static constexpr value_type offset_basis() {
141 return 0x6C62272E07BB014262B821756295C58D_cppui128;
144 static constexpr value_type prime() {
return 0x1000000000000000000013B_cppui128; }
150 struct fnv_base_traits<256> {
151 typedef boost::multiprecision::uint256_t value_type;
153 static constexpr std::size_t size() {
return 256; }
155 static constexpr value_type offset_basis() {
156 return 0xDD268DBCAAC550362D98C384C4E576CCC8B1536847B6BBB31023B4C8CAEE0535_cppui256;
159 static constexpr value_type prime() {
160 return 0x1000000000000000000000000000000000000000163_cppui256;
167 struct fnv_base_traits<512> {
168 typedef boost::multiprecision::uint512_t value_type;
170 static constexpr std::size_t size() {
return 512; }
172 static constexpr value_type offset_basis() {
173 return 0xB86DB0B1171F4416DCA1E50F309990ACAC87D059C90000000000000000000D21E948F68A34C192F62EA79BC942DBE7CE182036415F56E34BAC982AAC4AFE9FD9_cppui512;
176 static constexpr value_type prime() {
177 return 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000157_cppui512;
184 struct fnv_base_traits<1024> {
185 typedef boost::multiprecision::uint1024_t value_type;
187 static constexpr std::size_t size() {
return 1024; }
189 static constexpr value_type offset_basis() {
190 return 0x5F7A76758ECC4D32E56D5A591028B74B29FC4223FDADA16C3BF34EDA3674DA9A21D9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C6D7EB6E73802734510A555F256CC005AE556BDE8CC9C6A93B21AFF4B16C71EE90B3_cppui1024;
193 static constexpr value_type prime() {
194 return 0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018D_cppui1024;
200 template <std::
size_t FromBits, std::
size_t ToBits>
202 template <
typename T>
203 inline static T mask(T value) {
204 return value & ((T(1) << ToBits) - 1);
208 template <std::
size_t SameBits>
209 struct bitmask<SameBits, SameBits> {
210 template <
typename T>
211 inline static T mask(T value) {
231 template <std::
size_t Bits>
232 using fnv_traits =
typename detail::fnv_base_traits<detail::rollup(Bits)>;
241 template <std::
size_t Bits>
254 template <std::
size_t Bits,
typename Iterator,
typename Predicate>
256 static_assert(
sizeof(
typename std::iterator_traits<Iterator>::value_type) == 1,
257 "Iterator value_type must be 1 byte.");
266 return detail::bitmask<fnv_traits<Bits>::size(), Bits>::template mask(result);
278 template <std::
size_t Bits,
typename Iterator>
280 static_assert(
sizeof(
typename std::iterator_traits<Iterator>::value_type) == 1,
281 "Iterator value_type must be 1 byte.");
287 while (first != last)
290 return detail::bitmask<fnv_traits<Bits>::size(), Bits>::template mask(result);
299 template <std::
size_t Bits,
typename Container>
301 return fnv1a<Bits>(begin(c), end(c));
fnvtype< Bits > fnv1a(Iterator first, Predicate p)
typename fnv_traits< Bits >::value_type fnvtype
typename detail::fnv_base_traits< detail::rollup(Bits)> fnv_traits