File indexing completed on 2025-09-17 08:33:42
0001 #ifndef BOOST_HASH2_DETAIL_READ_HPP_INCLUDED
0002 #define BOOST_HASH2_DETAIL_READ_HPP_INCLUDED
0003
0004
0005
0006
0007
0008 #include <boost/hash2/endian.hpp>
0009 #include <boost/hash2/detail/is_constant_evaluated.hpp>
0010 #include <boost/config.hpp>
0011 #include <cstdint>
0012 #include <cstring>
0013
0014 namespace boost
0015 {
0016 namespace hash2
0017 {
0018 namespace detail
0019 {
0020
0021 BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t read32le( unsigned char const * p ) noexcept
0022 {
0023 if( !detail::is_constant_evaluated() && endian::native == endian::little )
0024 {
0025 std::uint32_t v = 0;
0026 std::memcpy( &v, p, sizeof(v) );
0027 return v;
0028 }
0029 else
0030 {
0031 return
0032 static_cast<std::uint32_t>( p[0] ) |
0033 ( static_cast<std::uint32_t>( p[1] ) << 8 ) |
0034 ( static_cast<std::uint32_t>( p[2] ) << 16 ) |
0035 ( static_cast<std::uint32_t>( p[3] ) << 24 );
0036 }
0037 }
0038
0039 BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint64_t read64le( unsigned char const * p ) noexcept
0040 {
0041 if( !detail::is_constant_evaluated() && endian::native == endian::little )
0042 {
0043 std::uint64_t v = 0;
0044 std::memcpy( &v, p, sizeof(v) );
0045 return v;
0046 }
0047 else
0048 {
0049 return
0050 static_cast<std::uint64_t>( p[0] ) |
0051 ( static_cast<std::uint64_t>( p[1] ) << 8 ) |
0052 ( static_cast<std::uint64_t>( p[2] ) << 16 ) |
0053 ( static_cast<std::uint64_t>( p[3] ) << 24 ) |
0054 ( static_cast<std::uint64_t>( p[4] ) << 32 ) |
0055 ( static_cast<std::uint64_t>( p[5] ) << 40 ) |
0056 ( static_cast<std::uint64_t>( p[6] ) << 48 ) |
0057 ( static_cast<std::uint64_t>( p[7] ) << 56 );
0058 }
0059 }
0060
0061 BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t read32be( unsigned char const * p ) noexcept
0062 {
0063 return
0064 static_cast<std::uint32_t>( p[3] ) |
0065 ( static_cast<std::uint32_t>( p[2] ) << 8 ) |
0066 ( static_cast<std::uint32_t>( p[1] ) << 16 ) |
0067 ( static_cast<std::uint32_t>( p[0] ) << 24 );
0068 }
0069
0070 BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint64_t read64be( unsigned char const * p ) noexcept
0071 {
0072 return
0073 static_cast<std::uint64_t>( p[7] ) |
0074 ( static_cast<std::uint64_t>( p[6] ) << 8 ) |
0075 ( static_cast<std::uint64_t>( p[5] ) << 16 ) |
0076 ( static_cast<std::uint64_t>( p[4] ) << 24 ) |
0077 ( static_cast<std::uint64_t>( p[3] ) << 32 ) |
0078 ( static_cast<std::uint64_t>( p[2] ) << 40 ) |
0079 ( static_cast<std::uint64_t>( p[1] ) << 48 ) |
0080 ( static_cast<std::uint64_t>( p[0] ) << 56 );
0081 }
0082
0083 }
0084 }
0085 }
0086
0087 #endif