Back to home page

EIC code displayed by LXR

 
 

    


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 // Copyright 2017, 2018, 2024 Peter Dimov
0005 // Distributed under the Boost Software License, Version 1.0.
0006 // https://www.boost.org/LICENSE_1_0.txt
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 } // namespace detail
0084 } // namespace hash2
0085 } // namespace boost
0086 
0087 #endif // #ifndef BOOST_HASH2_DETAIL_READ_HPP_INCLUDED