1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
// Copyright 2017, 2018, 2024, 2025 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/hash2/get_integral_result.hpp>
#include <boost/hash2/fnv1a.hpp>
#include <boost/core/lightweight_test.hpp>
#include <cstdint>
using boost::hash2::fnv1a_64;
using boost::hash2::get_integral_result;
template<class R> struct fnv1a_x: private fnv1a_64
{
using result_type = R;
result_type result()
{
return get_integral_result<R>( static_cast<fnv1a_64&>( *this ) );
}
};
int main()
{
// 1 -> 2
{
fnv1a_x<std::uint8_t> h1;
std::uint16_t r1 = get_integral_result<std::int16_t>( h1 );
fnv1a_x<std::uint8_t> h2;
std::uint16_t r2 = 0;
r2 += static_cast<std::uint16_t>( h2.result() ) << 0;
r2 += static_cast<std::uint16_t>( h2.result() ) << 8;
BOOST_TEST_EQ( static_cast<std::uint16_t>( r1 ), r2 );
}
// 1 -> 4
{
fnv1a_x<std::uint8_t> h1;
std::uint32_t r1 = get_integral_result<std::int32_t>( h1 );
fnv1a_x<std::uint8_t> h2;
std::uint32_t r2 = 0;
r2 += static_cast<std::uint32_t>( h2.result() ) << 0;
r2 += static_cast<std::uint32_t>( h2.result() ) << 8;
r2 += static_cast<std::uint32_t>( h2.result() ) << 16;
r2 += static_cast<std::uint32_t>( h2.result() ) << 24;
BOOST_TEST_EQ( static_cast<std::uint32_t>( r1 ), r2 );
}
// 1 -> 8
{
fnv1a_x<std::uint8_t> h1;
std::uint64_t r1 = get_integral_result<std::int64_t>( h1 );
fnv1a_x<std::uint8_t> h2;
std::uint64_t r2 = 0;
r2 += static_cast<std::uint64_t>( h2.result() ) << 0;
r2 += static_cast<std::uint64_t>( h2.result() ) << 8;
r2 += static_cast<std::uint64_t>( h2.result() ) << 16;
r2 += static_cast<std::uint64_t>( h2.result() ) << 24;
r2 += static_cast<std::uint64_t>( h2.result() ) << 32;
r2 += static_cast<std::uint64_t>( h2.result() ) << 40;
r2 += static_cast<std::uint64_t>( h2.result() ) << 48;
r2 += static_cast<std::uint64_t>( h2.result() ) << 56;
BOOST_TEST_EQ( static_cast<std::uint64_t>( r1 ), r2 );
}
// 2 -> 4
{
fnv1a_x<std::uint16_t> h1;
std::uint32_t r1 = get_integral_result<std::int32_t>( h1 );
fnv1a_x<std::uint16_t> h2;
std::uint32_t r2 = 0;
r2 += static_cast<std::uint32_t>( h2.result() ) << 0;
r2 += static_cast<std::uint32_t>( h2.result() ) << 16;
BOOST_TEST_EQ( static_cast<std::uint32_t>( r1 ), r2 );
}
// 2 -> 8
{
fnv1a_x<std::uint16_t> h1;
std::uint64_t r1 = get_integral_result<std::int64_t>( h1 );
fnv1a_x<std::uint16_t> h2;
std::uint64_t r2 = 0;
r2 += static_cast<std::uint64_t>( h2.result() ) << 0;
r2 += static_cast<std::uint64_t>( h2.result() ) << 16;
r2 += static_cast<std::uint64_t>( h2.result() ) << 32;
r2 += static_cast<std::uint64_t>( h2.result() ) << 48;
BOOST_TEST_EQ( static_cast<std::uint64_t>( r1 ), r2 );
}
// 4 -> 8
{
fnv1a_x<std::uint32_t> h1;
std::uint64_t r1 = get_integral_result<std::int64_t>( h1 );
fnv1a_x<std::uint32_t> h2;
std::uint64_t r2 = 0;
r2 += static_cast<std::uint64_t>( h2.result() ) << 0;
r2 += static_cast<std::uint64_t>( h2.result() ) << 32;
BOOST_TEST_EQ( static_cast<std::uint64_t>( r1 ), r2 );
}
return boost::report_errors();
}
|