17#ifndef ADOBE_FNV_NO_BIGINTS
18#include <boost/multiprecision/cpp_int.hpp>
89constexpr std::size_t rollup(std::size_t n) {
102template <std::
size_t Bits>
103struct fnv_base_traits {};
108struct fnv_base_traits<32> {
109 typedef std::uint32_t value_type;
111 static constexpr std::size_t
size() {
return 32; }
113 static constexpr value_type offset_basis() {
return 0x811c9dc5; }
115 static constexpr value_type prime() {
return 0x1000193; }
121struct fnv_base_traits<64> {
122 typedef std::uint64_t value_type;
124 static constexpr std::size_t
size() {
return 64; }
126 static constexpr value_type offset_basis() {
return 0xcbf29ce484222325; }
128 static constexpr value_type prime() {
return 0x100000001b3; }
132#ifndef ADOBE_FNV_NO_BIGINTS
133using namespace boost::multiprecision::literals;
138struct fnv_base_traits<128> {
139 typedef boost::multiprecision::uint128_t value_type;
141 static constexpr std::size_t
size() {
return 128; }
143 static constexpr value_type offset_basis() {
144 return 0x6C62272E07BB014262B821756295C58D_cppui128;
147 static constexpr value_type prime() {
return 0x1000000000000000000013B_cppui128; }
153struct fnv_base_traits<256> {
154 typedef boost::multiprecision::uint256_t value_type;
156 static constexpr std::size_t
size() {
return 256; }
158 static constexpr value_type offset_basis() {
159 return 0xDD268DBCAAC550362D98C384C4E576CCC8B1536847B6BBB31023B4C8CAEE0535_cppui256;
162 static constexpr value_type prime() {
163 return 0x1000000000000000000000000000000000000000163_cppui256;
170struct fnv_base_traits<512> {
171 typedef boost::multiprecision::uint512_t value_type;
173 static constexpr std::size_t
size() {
return 512; }
175 static constexpr value_type offset_basis() {
176 return 0xB86DB0B1171F4416DCA1E50F309990ACAC87D059C90000000000000000000D21E948F68A34C192F62EA79BC942DBE7CE182036415F56E34BAC982AAC4AFE9FD9_cppui512;
179 static constexpr value_type prime() {
180 return 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000157_cppui512;
187struct fnv_base_traits<1024> {
188 typedef boost::multiprecision::uint1024_t value_type;
190 static constexpr std::size_t
size() {
return 1024; }
192 static constexpr value_type offset_basis() {
193 return 0x5F7A76758ECC4D32E56D5A591028B74B29FC4223FDADA16C3BF34EDA3674DA9A21D9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C6D7EB6E73802734510A555F256CC005AE556BDE8CC9C6A93B21AFF4B16C71EE90B3_cppui1024;
196 static constexpr value_type prime() {
197 return 0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018D_cppui1024;
203template <std::
size_t FromBits, std::
size_t ToBits>
205 template <
typename T>
206 inline static T mask(T value) {
207 return value & ((T(1) << ToBits) - 1);
211template <std::
size_t SameBits>
212struct bitmask<SameBits, SameBits> {
213 template <
typename T>
214 inline static T mask(T value) {
234template <std::
size_t Bits>
235using fnv_traits =
typename detail::fnv_base_traits<detail::rollup(Bits)>;
244template <std::
size_t Bits>
257template <std::
size_t Bits,
typename Iterator,
typename Predicate>
259 static_assert(
sizeof(
typename std::iterator_traits<Iterator>::value_type) == 1,
260 "Iterator value_type must be 1 byte.");
269 return detail::bitmask<fnv_traits<Bits>::size(), Bits>::mask(result);
281template <std::
size_t Bits,
typename Iterator>
283 static_assert(
sizeof(
typename std::iterator_traits<Iterator>::value_type) == 1,
284 "Iterator value_type must be 1 byte.");
290 while (first != last)
293 return detail::bitmask<fnv_traits<Bits>::size(), Bits>::mask(result);
302template <std::
size_t Bits,
typename Container>
fnvtype< Bits > fnv1a(Iterator first, Predicate p)
typename fnv_traits< Bits >::value_type fnvtype
typename detail::fnv_base_traits< detail::rollup(Bits)> fnv_traits
boost::range_size< Selection >::type size(const Selection &x)