read.hpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef BOOST_HASH2_DETAIL_READ_HPP_INCLUDED
  2. #define BOOST_HASH2_DETAIL_READ_HPP_INCLUDED
  3. // Copyright 2017, 2018, 2024 Peter Dimov
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // https://www.boost.org/LICENSE_1_0.txt
  6. #include <boost/hash2/endian.hpp>
  7. #include <boost/hash2/detail/is_constant_evaluated.hpp>
  8. #include <boost/config.hpp>
  9. #include <cstdint>
  10. #include <cstring>
  11. namespace boost
  12. {
  13. namespace hash2
  14. {
  15. namespace detail
  16. {
  17. BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t read32le( unsigned char const * p ) noexcept
  18. {
  19. if( !detail::is_constant_evaluated() && endian::native == endian::little )
  20. {
  21. std::uint32_t v = 0;
  22. std::memcpy( &v, p, sizeof(v) );
  23. return v;
  24. }
  25. else
  26. {
  27. return
  28. static_cast<std::uint32_t>( p[0] ) |
  29. ( static_cast<std::uint32_t>( p[1] ) << 8 ) |
  30. ( static_cast<std::uint32_t>( p[2] ) << 16 ) |
  31. ( static_cast<std::uint32_t>( p[3] ) << 24 );
  32. }
  33. }
  34. BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint64_t read64le( unsigned char const * p ) noexcept
  35. {
  36. if( !detail::is_constant_evaluated() && endian::native == endian::little )
  37. {
  38. std::uint64_t v = 0;
  39. std::memcpy( &v, p, sizeof(v) );
  40. return v;
  41. }
  42. else
  43. {
  44. return
  45. static_cast<std::uint64_t>( p[0] ) |
  46. ( static_cast<std::uint64_t>( p[1] ) << 8 ) |
  47. ( static_cast<std::uint64_t>( p[2] ) << 16 ) |
  48. ( static_cast<std::uint64_t>( p[3] ) << 24 ) |
  49. ( static_cast<std::uint64_t>( p[4] ) << 32 ) |
  50. ( static_cast<std::uint64_t>( p[5] ) << 40 ) |
  51. ( static_cast<std::uint64_t>( p[6] ) << 48 ) |
  52. ( static_cast<std::uint64_t>( p[7] ) << 56 );
  53. }
  54. }
  55. BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t read32be( unsigned char const * p ) noexcept
  56. {
  57. return
  58. static_cast<std::uint32_t>( p[3] ) |
  59. ( static_cast<std::uint32_t>( p[2] ) << 8 ) |
  60. ( static_cast<std::uint32_t>( p[1] ) << 16 ) |
  61. ( static_cast<std::uint32_t>( p[0] ) << 24 );
  62. }
  63. BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint64_t read64be( unsigned char const * p ) noexcept
  64. {
  65. return
  66. static_cast<std::uint64_t>( p[7] ) |
  67. ( static_cast<std::uint64_t>( p[6] ) << 8 ) |
  68. ( static_cast<std::uint64_t>( p[5] ) << 16 ) |
  69. ( static_cast<std::uint64_t>( p[4] ) << 24 ) |
  70. ( static_cast<std::uint64_t>( p[3] ) << 32 ) |
  71. ( static_cast<std::uint64_t>( p[2] ) << 40 ) |
  72. ( static_cast<std::uint64_t>( p[1] ) << 48 ) |
  73. ( static_cast<std::uint64_t>( p[0] ) << 56 );
  74. }
  75. } // namespace detail
  76. } // namespace hash2
  77. } // namespace boost
  78. #endif // #ifndef BOOST_HASH2_DETAIL_READ_HPP_INCLUDED