diff options
author | mikhnenko <mikhnenko@yandex-team.com> | 2024-12-18 19:08:08 +0300 |
---|---|---|
committer | mikhnenko <mikhnenko@yandex-team.com> | 2024-12-18 19:29:26 +0300 |
commit | 7ed76959e6c06dbc4c249ce0f3b930463a6b65db (patch) | |
tree | 0e9528cb7261812a5ae7ed177048721eaebf8ed0 /contrib/libs/cxxsupp/libcxx/src/hash.cpp | |
parent | 4c8e7f015711b5175d63e1a87cbd40c49ce7aa70 (diff) | |
download | ydb-7ed76959e6c06dbc4c249ce0f3b930463a6b65db.tar.gz |
libc++: Run clang-format from upstream and update to 9783f28cbb155e4a8d49c12e1c60ce14dcfaf0c7
commit_hash:ca4954fe054e5a7190ad11ab71bfc7ca0965bca2
Diffstat (limited to 'contrib/libs/cxxsupp/libcxx/src/hash.cpp')
-rw-r--r-- | contrib/libs/cxxsupp/libcxx/src/hash.cpp | 899 |
1 files changed, 396 insertions, 503 deletions
diff --git a/contrib/libs/cxxsupp/libcxx/src/hash.cpp b/contrib/libs/cxxsupp/libcxx/src/hash.cpp index f5bd3e9684..34b02b8eaf 100644 --- a/contrib/libs/cxxsupp/libcxx/src/hash.cpp +++ b/contrib/libs/cxxsupp/libcxx/src/hash.cpp @@ -18,114 +18,20 @@ _LIBCPP_BEGIN_NAMESPACE_STD namespace { // handle all next_prime(i) for i in [1, 210), special case 0 -const unsigned small_primes[] = -{ - 0, - 2, - 3, - 5, - 7, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59, - 61, - 67, - 71, - 73, - 79, - 83, - 89, - 97, - 101, - 103, - 107, - 109, - 113, - 127, - 131, - 137, - 139, - 149, - 151, - 157, - 163, - 167, - 173, - 179, - 181, - 191, - 193, - 197, - 199, - 211 -}; +const unsigned small_primes[] = { + 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, + 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, + 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211}; // potential primes = 210*k + indices[i], k >= 1 // these numbers are not divisible by 2, 3, 5 or 7 // (or any integer 2 <= j <= 10 for that matter). -const unsigned indices[] = -{ - 1, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59, - 61, - 67, - 71, - 73, - 79, - 83, - 89, - 97, - 101, - 103, - 107, - 109, - 113, - 121, - 127, - 131, - 137, - 139, - 143, - 149, - 151, - 157, - 163, - 167, - 169, - 173, - 179, - 181, - 187, - 191, - 193, - 197, - 199, - 209 -}; +const unsigned indices[] = { + 1, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, + 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 121, 127, 131, 137, 139, + 143, 149, 151, 157, 163, 167, 169, 173, 179, 181, 187, 191, 193, 197, 199, 209}; -} +} // namespace // Returns: If n == 0, returns 0. Else returns the lowest prime number that // is greater than or equal to n. @@ -147,413 +53,400 @@ const unsigned indices[] = // against. template <size_t _Sz = sizeof(size_t)> -inline _LIBCPP_HIDE_FROM_ABI -typename enable_if<_Sz == 4, void>::type -__check_for_overflow(size_t N) -{ - if (N > 0xFFFFFFFB) - __throw_overflow_error("__next_prime overflow"); +inline _LIBCPP_HIDE_FROM_ABI typename enable_if<_Sz == 4, void>::type __check_for_overflow(size_t N) { + if (N > 0xFFFFFFFB) + __throw_overflow_error("__next_prime overflow"); } template <size_t _Sz = sizeof(size_t)> -inline _LIBCPP_HIDE_FROM_ABI -typename enable_if<_Sz == 8, void>::type -__check_for_overflow(size_t N) -{ - if (N > 0xFFFFFFFFFFFFFFC5ull) - __throw_overflow_error("__next_prime overflow"); +inline _LIBCPP_HIDE_FROM_ABI typename enable_if<_Sz == 8, void>::type __check_for_overflow(size_t N) { + if (N > 0xFFFFFFFFFFFFFFC5ull) + __throw_overflow_error("__next_prime overflow"); } -size_t -__next_prime(size_t n) -{ - const size_t L = 210; - const size_t N = sizeof(small_primes) / sizeof(small_primes[0]); - // If n is small enough, search in small_primes - if (n <= small_primes[N-1]) - return *std::lower_bound(small_primes, small_primes + N, n); - // Else n > largest small_primes - // Check for overflow - __check_for_overflow(n); - // Start searching list of potential primes: L * k0 + indices[in] - const size_t M = sizeof(indices) / sizeof(indices[0]); - // Select first potential prime >= n - // Known a-priori n >= L - size_t k0 = n / L; - size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) - - indices); - n = L * k0 + indices[in]; - while (true) +size_t __next_prime(size_t n) { + const size_t L = 210; + const size_t N = sizeof(small_primes) / sizeof(small_primes[0]); + // If n is small enough, search in small_primes + if (n <= small_primes[N - 1]) + return *std::lower_bound(small_primes, small_primes + N, n); + // Else n > largest small_primes + // Check for overflow + __check_for_overflow(n); + // Start searching list of potential primes: L * k0 + indices[in] + const size_t M = sizeof(indices) / sizeof(indices[0]); + // Select first potential prime >= n + // Known a-priori n >= L + size_t k0 = n / L; + size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) - indices); + n = L * k0 + indices[in]; + while (true) { + // Divide n by all primes or potential primes (i) until: + // 1. The division is even, so try next potential prime. + // 2. The i > sqrt(n), in which case n is prime. + // It is known a-priori that n is not divisible by 2, 3, 5 or 7, + // so don't test those (j == 5 -> divide by 11 first). And the + // potential primes start with 211, so don't test against the last + // small prime. + for (size_t j = 5; j < N - 1; ++j) { + const std::size_t p = small_primes[j]; + const std::size_t q = n / p; + if (q < p) + return n; + if (n == q * p) + goto next; + } + // n wasn't divisible by small primes, try potential primes { - // Divide n by all primes or potential primes (i) until: - // 1. The division is even, so try next potential prime. - // 2. The i > sqrt(n), in which case n is prime. - // It is known a-priori that n is not divisible by 2, 3, 5 or 7, - // so don't test those (j == 5 -> divide by 11 first). And the - // potential primes start with 211, so don't test against the last - // small prime. - for (size_t j = 5; j < N - 1; ++j) - { - const std::size_t p = small_primes[j]; - const std::size_t q = n / p; - if (q < p) - return n; - if (n == q * p) - goto next; - } - // n wasn't divisible by small primes, try potential primes - { - size_t i = 211; - while (true) - { - std::size_t q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 10; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 8; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 8; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 6; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 4; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 2; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - i += 10; - q = n / i; - if (q < i) - return n; - if (n == q * i) - break; - - // This will loop i to the next "plane" of potential primes - i += 2; - } - } -next: - // n is not prime. Increment n to next potential prime. - if (++in == M) - { - ++k0; - in = 0; - } - n = L * k0 + indices[in]; + size_t i = 211; + while (true) { + std::size_t q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 10; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 8; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 8; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 10; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + // This will loop i to the next "plane" of potential primes + i += 2; + } } + next: + // n is not prime. Increment n to next potential prime. + if (++in == M) { + ++k0; + in = 0; + } + n = L * k0 + indices[in]; + } } _LIBCPP_END_NAMESPACE_STD |