// Copyright 2017, 2018, 2024 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include template void test_identity() { using boost::hash2::get_integral_result; using R = T; for( unsigned i = 0; i <= std::numeric_limits::max(); ++i ) { R r = static_cast( i ); T t = get_integral_result( r ); BOOST_TEST_EQ( t, r ); } } template std::size_t test_permutation( int shift ) { using boost::hash2::get_integral_result; std::set dist; for( unsigned i = 0; i <= std::numeric_limits::max(); ++i ) { R r = static_cast( i << shift ); T t = get_integral_result( r ); dist.insert( t ); } return dist.size(); } template std::size_t test_roundtrip() { using boost::hash2::get_integral_result; std::set dist; for( unsigned i = 0; i <= std::numeric_limits::max(); ++i ) { T t1 = static_cast( i ); R r = get_integral_result( t1 ); T t2 = get_integral_result( r ); dist.insert( t2 ); } return dist.size(); } int main() { // 1 -> 1 test_identity(); // 1 -> 2 BOOST_TEST_EQ( (test_permutation( 0 )), 256u ); BOOST_TEST_EQ( (test_permutation( 8 )), 256u ); BOOST_TEST_GE( (test_roundtrip()), 255u ); // ! // 1 -> 4 BOOST_TEST_EQ( (test_permutation( 0 )), 256u ); BOOST_TEST_EQ( (test_permutation( 8 )), 256u ); BOOST_TEST_GE( (test_permutation( 16 )), 255u ); // ! BOOST_TEST_EQ( (test_permutation( 24 )), 256u ); BOOST_TEST_EQ( (test_roundtrip()), 256u ); // 1 -> 8 BOOST_TEST_EQ( (test_permutation( 0 )), 256u ); BOOST_TEST_EQ( (test_permutation( 8 )), 256u ); BOOST_TEST_EQ( (test_permutation( 16 )), 256u ); BOOST_TEST_EQ( (test_permutation( 24 )), 256u ); BOOST_TEST_EQ( (test_permutation( 32 )), 256u ); BOOST_TEST_EQ( (test_permutation( 40 )), 256u ); BOOST_TEST_EQ( (test_permutation( 48 )), 256u ); BOOST_TEST_EQ( (test_permutation( 56 )), 256u ); BOOST_TEST_EQ( (test_roundtrip()), 256u ); // 2 -> 2 test_identity(); // 2 -> 4 BOOST_TEST_EQ( (test_permutation( 0 )), 65536u ); BOOST_TEST_EQ( (test_permutation( 16 )), 65536u ); BOOST_TEST_GE( (test_roundtrip()), 65535u ); // ! // 2 -> 8 BOOST_TEST_EQ( (test_permutation( 0 )), 65536u ); BOOST_TEST_EQ( (test_permutation( 16 )), 65536u ); BOOST_TEST_EQ( (test_permutation( 32 )), 65536u ); BOOST_TEST_EQ( (test_permutation( 48 )), 65536u ); BOOST_TEST_EQ( (test_roundtrip()), 65536u ); // return boost::report_errors(); }