diff options
author | robot-contrib <robot-contrib@yandex-team.com> | 2023-08-14 21:00:54 +0300 |
---|---|---|
committer | robot-contrib <robot-contrib@yandex-team.com> | 2023-08-15 02:08:12 +0300 |
commit | e42aaca2003e4874e8ce78872ef177429d376e39 (patch) | |
tree | f0dc1b8bdfc3a72cf4d9836309083015aa1d07d8 /contrib/restricted/boost/core | |
parent | a0614d177962b2b05fb7f8e4e051ed65bb9ce83a (diff) | |
download | ydb-e42aaca2003e4874e8ce78872ef177429d376e39.tar.gz |
Update contrib/restricted/boost/core to 1.83.0
Diffstat (limited to 'contrib/restricted/boost/core')
-rw-r--r-- | contrib/restricted/boost/core/include/boost/core/bit.hpp | 375 | ||||
-rw-r--r-- | contrib/restricted/boost/core/include/boost/core/checked_delete.hpp | 23 | ||||
-rw-r--r-- | contrib/restricted/boost/core/ya.make | 4 |
3 files changed, 366 insertions, 36 deletions
diff --git a/contrib/restricted/boost/core/include/boost/core/bit.hpp b/contrib/restricted/boost/core/include/boost/core/bit.hpp index 5d14685934..a6147e4d44 100644 --- a/contrib/restricted/boost/core/include/boost/core/bit.hpp +++ b/contrib/restricted/boost/core/include/boost/core/bit.hpp @@ -20,6 +20,7 @@ #include <boost/cstdint.hpp> #include <limits> #include <cstring> +#include <cstdlib> #if defined(_MSC_VER) @@ -38,6 +39,20 @@ #endif // defined(_MSC_VER) +#if defined(BOOST_MSVC) && BOOST_MSVC >= 1925 +# define BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL +#endif + +#if defined(__has_builtin) +# if __has_builtin(__builtin_bit_cast) +# define BOOST_CORE_HAS_BUILTIN_BIT_CAST +# endif +#endif + +#if defined(BOOST_MSVC) && BOOST_MSVC >= 1926 +# define BOOST_CORE_HAS_BUILTIN_BIT_CAST +#endif + namespace boost { namespace core @@ -45,6 +60,16 @@ namespace core // bit_cast +#if defined(BOOST_CORE_HAS_BUILTIN_BIT_CAST) + +template<class To, class From> +BOOST_CONSTEXPR To bit_cast( From const & from ) BOOST_NOEXCEPT +{ + return __builtin_bit_cast( To, from ); +} + +#else + template<class To, class From> To bit_cast( From const & from ) BOOST_NOEXCEPT { @@ -55,6 +80,8 @@ To bit_cast( From const & from ) BOOST_NOEXCEPT return to; } +#endif + // countl #if defined(__GNUC__) || defined(__clang__) @@ -102,10 +129,51 @@ BOOST_CONSTEXPR int countl_zero( T x ) BOOST_NOEXCEPT namespace detail { -inline int countl_impl( boost::uint32_t x ) BOOST_NOEXCEPT +#if defined(_MSC_VER) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) + +BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint32_t x ) BOOST_NOEXCEPT { -#if defined(_MSC_VER) + if( __builtin_is_constant_evaluated() ) + { + constexpr unsigned char mod37[ 37 ] = { 32, 31, 6, 30, 9, 5, 0, 29, 16, 8, 2, 4, 21, 0, 19, 28, 25, 15, 0, 7, 10, 1, 17, 3, 22, 20, 26, 0, 11, 18, 23, 27, 12, 24, 13, 14, 0 }; + + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return mod37[ x % 37 ]; + } + else + { + unsigned long r; + + if( _BitScanReverse( &r, x ) ) + { + return 31 - static_cast<int>( r ); + } + else + { + return 32; + } + } +} + +BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 24; +} + +BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 16; +} + +#elif defined(_MSC_VER) + +inline int countl_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ unsigned long r; if( _BitScanReverse( &r, x ) ) @@ -116,9 +184,22 @@ inline int countl_impl( boost::uint32_t x ) BOOST_NOEXCEPT { return 32; } +} + +inline int countl_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 24; +} + +inline int countl_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 16; +} #else +inline int countl_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ static unsigned char const mod37[ 37 ] = { 32, 31, 6, 30, 9, 5, 0, 29, 16, 8, 2, 4, 21, 0, 19, 28, 25, 15, 0, 7, 10, 1, 17, 3, 22, 20, 26, 0, 11, 18, 23, 27, 12, 24, 13, 14, 0 }; x |= x >> 1; @@ -128,14 +209,49 @@ inline int countl_impl( boost::uint32_t x ) BOOST_NOEXCEPT x |= x >> 16; return mod37[ x % 37 ]; +} + +inline int countl_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 24; +} + +inline int countl_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 16; +} #endif + +#if defined(_MSC_VER) && defined(_M_X64) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) + +BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ + if( __builtin_is_constant_evaluated() ) + { + return static_cast<boost::uint32_t>( x >> 32 ) != 0? + boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x >> 32 ) ): + boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) + 32; + } + else + { + unsigned long r; + + if( _BitScanReverse64( &r, x ) ) + { + return 63 - static_cast<int>( r ); + } + else + { + return 64; + } + } } +#elif defined(_MSC_VER) && defined(_M_X64) + inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT { -#if defined(_MSC_VER) && defined(_M_X64) - unsigned long r; if( _BitScanReverse64( &r, x ) ) @@ -146,30 +262,32 @@ inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT { return 64; } +} -#else +#elif defined(_MSC_VER) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) +BOOST_CXX14_CONSTEXPR inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ return static_cast<boost::uint32_t>( x >> 32 ) != 0? boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x >> 32 ) ): boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) + 32; - -#endif } -inline int countl_impl( boost::uint8_t x ) BOOST_NOEXCEPT -{ - return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 24; -} +#else -inline int countl_impl( boost::uint16_t x ) BOOST_NOEXCEPT +inline int countl_impl( boost::uint64_t x ) BOOST_NOEXCEPT { - return boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) - 16; + return static_cast<boost::uint32_t>( x >> 32 ) != 0? + boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x >> 32 ) ): + boost::core::detail::countl_impl( static_cast<boost::uint32_t>( x ) ) + 32; } +#endif + } // namespace detail template<class T> -int countl_zero( T x ) BOOST_NOEXCEPT +BOOST_CXX14_CONSTEXPR int countl_zero( T x ) BOOST_NOEXCEPT { BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed ); @@ -250,10 +368,44 @@ BOOST_CONSTEXPR int countr_zero( T x ) BOOST_NOEXCEPT namespace detail { -inline int countr_impl( boost::uint32_t x ) BOOST_NOEXCEPT +#if defined(_MSC_VER) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) + +BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint32_t x ) BOOST_NOEXCEPT { -#if defined(_MSC_VER) + if( __builtin_is_constant_evaluated() ) + { + constexpr unsigned char mod37[ 37 ] = { 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, 20, 8, 19, 18 }; + return mod37[ ( -(boost::int32_t)x & x ) % 37 ]; + } + else + { + unsigned long r; + + if( _BitScanForward( &r, x ) ) + { + return static_cast<int>( r ); + } + else + { + return 32; + } + } +} +BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x100 ); +} + +BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x10000 ); +} + +#elif defined(_MSC_VER) + +inline int countr_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ unsigned long r; if( _BitScanForward( &r, x ) ) @@ -264,19 +416,67 @@ inline int countr_impl( boost::uint32_t x ) BOOST_NOEXCEPT { return 32; } +} + +inline int countr_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x100 ); +} + +inline int countr_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x10000 ); +} #else +inline int countr_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ static unsigned char const mod37[ 37 ] = { 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, 20, 8, 19, 18 }; return mod37[ ( -(boost::int32_t)x & x ) % 37 ]; +} + +inline int countr_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x100 ); +} + +inline int countr_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x10000 ); +} #endif + +#if defined(_MSC_VER) && defined(_M_X64) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) + +BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ + if( __builtin_is_constant_evaluated() ) + { + return static_cast<boost::uint32_t>( x ) != 0? + boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) ): + boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x >> 32 ) ) + 32; + } + else + { + unsigned long r; + + if( _BitScanForward64( &r, x ) ) + { + return static_cast<int>( r ); + } + else + { + return 64; + } + } } +#elif defined(_MSC_VER) && defined(_M_X64) + inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT { -#if defined(_MSC_VER) && defined(_M_X64) - unsigned long r; if( _BitScanForward64( &r, x ) ) @@ -287,30 +487,32 @@ inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT { return 64; } +} -#else +#elif defined(_MSC_VER) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) +BOOST_CXX14_CONSTEXPR inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ return static_cast<boost::uint32_t>( x ) != 0? boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) ): boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x >> 32 ) ) + 32; - -#endif } -inline int countr_impl( boost::uint8_t x ) BOOST_NOEXCEPT -{ - return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x100 ); -} +#else -inline int countr_impl( boost::uint16_t x ) BOOST_NOEXCEPT +inline int countr_impl( boost::uint64_t x ) BOOST_NOEXCEPT { - return boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) | 0x10000 ); + return static_cast<boost::uint32_t>( x ) != 0? + boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x ) ): + boost::core::detail::countr_impl( static_cast<boost::uint32_t>( x >> 32 ) ) + 32; } +#endif + } // namespace detail template<class T> -int countr_zero( T x ) BOOST_NOEXCEPT +BOOST_CXX14_CONSTEXPR int countr_zero( T x ) BOOST_NOEXCEPT { BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed ); @@ -446,7 +648,7 @@ BOOST_CXX14_CONSTEXPR T rotl( T x, int s ) BOOST_NOEXCEPT BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed ); unsigned const mask = std::numeric_limits<T>::digits - 1; - return x << (s & mask) | x >> ((-s) & mask); + return static_cast<T>( x << (static_cast<unsigned>( s ) & mask) | x >> (static_cast<unsigned>( -s ) & mask) ); } template<class T> @@ -455,7 +657,7 @@ BOOST_CXX14_CONSTEXPR T rotr( T x, int s ) BOOST_NOEXCEPT BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed ); unsigned const mask = std::numeric_limits<T>::digits - 1; - return x >> (s & mask) | x << ((-s) & mask); + return static_cast<T>( x >> (static_cast<unsigned>( s ) & mask) | x << (static_cast<unsigned>( -s ) & mask) ); } // integral powers of 2 @@ -484,7 +686,7 @@ BOOST_CONSTEXPR T bit_floor( T x ) BOOST_NOEXCEPT { BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed ); - return x == 0? 0: T(1) << ( boost::core::bit_width( x ) - 1 ); + return x == 0? T(0): static_cast<T>( T(1) << ( boost::core::bit_width( x ) - 1 ) ); } namespace detail @@ -613,6 +815,117 @@ typedef endian::type endian_type; #undef BOOST_CORE_BIT_NATIVE_INITIALIZER +// byteswap + +namespace detail +{ + +BOOST_CONSTEXPR inline boost::uint8_t byteswap_impl( boost::uint8_t x ) BOOST_NOEXCEPT +{ + return x; +} + +BOOST_CONSTEXPR inline boost::uint16_t byteswap_impl( boost::uint16_t x ) BOOST_NOEXCEPT +{ + return static_cast<boost::uint16_t>( x << 8 | x >> 8 ); +} + +#if defined(__GNUC__) || defined(__clang__) + +BOOST_CXX14_CONSTEXPR inline boost::uint32_t byteswap_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ + return __builtin_bswap32( x ); +} + +BOOST_CXX14_CONSTEXPR inline boost::uint64_t byteswap_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ + return __builtin_bswap64( x ); +} + +#elif defined(_MSC_VER) && defined(BOOST_CORE_HAS_BUILTIN_ISCONSTEVAL) + +BOOST_CXX14_CONSTEXPR inline boost::uint32_t byteswap_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ + if( __builtin_is_constant_evaluated() ) + { + boost::uint32_t step16 = x << 16 | x >> 16; + return ((step16 << 8) & 0xff00ff00) | ((step16 >> 8) & 0x00ff00ff); + } + else + { + return _byteswap_ulong( x ); + } +} + +BOOST_CXX14_CONSTEXPR inline boost::uint64_t byteswap_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ + if( __builtin_is_constant_evaluated() ) + { + boost::uint64_t step32 = x << 32 | x >> 32; + boost::uint64_t step16 = (step32 & 0x0000FFFF0000FFFFULL) << 16 | (step32 & 0xFFFF0000FFFF0000ULL) >> 16; + return (step16 & 0x00FF00FF00FF00FFULL) << 8 | (step16 & 0xFF00FF00FF00FF00ULL) >> 8; + } + else + { + return _byteswap_uint64( x ); + } +} + +#elif defined(_MSC_VER) + +inline boost::uint32_t byteswap_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ + return _byteswap_ulong( x ); +} + +inline boost::uint64_t byteswap_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ + return _byteswap_uint64( x ); +} + +#else + +BOOST_CXX14_CONSTEXPR inline boost::uint32_t byteswap_impl( boost::uint32_t x ) BOOST_NOEXCEPT +{ + boost::uint32_t step16 = x << 16 | x >> 16; + return ((step16 << 8) & 0xff00ff00) | ((step16 >> 8) & 0x00ff00ff); +} + +BOOST_CXX14_CONSTEXPR inline boost::uint64_t byteswap_impl( boost::uint64_t x ) BOOST_NOEXCEPT +{ + boost::uint64_t step32 = x << 32 | x >> 32; + boost::uint64_t step16 = (step32 & 0x0000FFFF0000FFFFULL) << 16 | (step32 & 0xFFFF0000FFFF0000ULL) >> 16; + return (step16 & 0x00FF00FF00FF00FFULL) << 8 | (step16 & 0xFF00FF00FF00FF00ULL) >> 8; +} + +#endif + +} // namespace detail + +template<class T> BOOST_CXX14_CONSTEXPR T byteswap( T x ) BOOST_NOEXCEPT +{ + BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer ); + + BOOST_STATIC_ASSERT( sizeof(T) == sizeof(boost::uint8_t) || sizeof(T) == sizeof(boost::uint16_t) || sizeof(T) == sizeof(boost::uint32_t) || sizeof(T) == sizeof(boost::uint64_t) ); + + BOOST_IF_CONSTEXPR ( sizeof(T) == sizeof(boost::uint8_t) ) + { + return static_cast<T>( boost::core::detail::byteswap_impl( static_cast<boost::uint8_t>( x ) ) ); + } + else BOOST_IF_CONSTEXPR ( sizeof(T) == sizeof(boost::uint16_t) ) + { + return static_cast<T>( boost::core::detail::byteswap_impl( static_cast<boost::uint16_t>( x ) ) ); + } + else BOOST_IF_CONSTEXPR ( sizeof(T) == sizeof(boost::uint32_t) ) + { + return static_cast<T>( boost::core::detail::byteswap_impl( static_cast<boost::uint32_t>( x ) ) ); + } + else + { + return static_cast<T>( boost::core::detail::byteswap_impl( static_cast<boost::uint64_t>( x ) ) ); + } +} + } // namespace core } // namespace boost diff --git a/contrib/restricted/boost/core/include/boost/core/checked_delete.hpp b/contrib/restricted/boost/core/include/boost/core/checked_delete.hpp index 6af5c14119..b74a43afab 100644 --- a/contrib/restricted/boost/core/include/boost/core/checked_delete.hpp +++ b/contrib/restricted/boost/core/include/boost/core/checked_delete.hpp @@ -30,16 +30,33 @@ namespace boost template<class T> inline void checked_delete(T * x) BOOST_NOEXCEPT { - // intentionally complex - simplification causes regressions - typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; +#if defined(__cpp_static_assert) && __cpp_static_assert >= 200410L + + static_assert( sizeof(T) != 0, "Type must be complete" ); + +#else + + typedef char type_must_be_complete[ sizeof(T) ]; (void) sizeof(type_must_be_complete); + +#endif + delete x; } template<class T> inline void checked_array_delete(T * x) BOOST_NOEXCEPT { - typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; +#if defined(__cpp_static_assert) && __cpp_static_assert >= 200410L + + static_assert( sizeof(T) != 0, "Type must be complete" ); + +#else + + typedef char type_must_be_complete[ sizeof(T) ]; (void) sizeof(type_must_be_complete); + +#endif + delete [] x; } diff --git a/contrib/restricted/boost/core/ya.make b/contrib/restricted/boost/core/ya.make index d3b77e1637..126af6a736 100644 --- a/contrib/restricted/boost/core/ya.make +++ b/contrib/restricted/boost/core/ya.make @@ -9,9 +9,9 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -VERSION(1.82.0) +VERSION(1.83.0) -ORIGINAL_SOURCE(https://github.com/boostorg/core/archive/boost-1.82.0.tar.gz) +ORIGINAL_SOURCE(https://github.com/boostorg/core/archive/boost-1.83.0.tar.gz) PEERDIR( contrib/restricted/boost/assert |