Index: third_party/libcxx/src/hash.cpp |
=================================================================== |
--- third_party/libcxx/src/hash.cpp (revision 0) |
+++ third_party/libcxx/src/hash.cpp (revision 0) |
@@ -0,0 +1,570 @@ |
+//===-------------------------- hash.cpp ----------------------------------===// |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is dual licensed under the MIT and the University of Illinois Open |
+// Source Licenses. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#include "__hash_table" |
+#include "algorithm" |
+#include "stdexcept" |
+#include "type_traits" |
+ |
+#ifdef __clang__ |
+#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare" |
+#endif |
+ |
+_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 |
+}; |
+ |
+// 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 |
+}; |
+ |
+} |
+ |
+// Returns: If n == 0, returns 0. Else returns the lowest prime number that |
+// is greater than or equal to n. |
+// |
+// The algorithm creates a list of small primes, plus an open-ended list of |
+// potential primes. All prime numbers are potential prime numbers. However |
+// some potential prime numbers are not prime. In an ideal world, all potential |
+// prime numbers would be prime. Candiate prime numbers are chosen as the next |
+// highest potential prime. Then this number is tested for prime by dividing it |
+// by all potential prime numbers less than the sqrt of the candidate. |
+// |
+// This implementation defines potential primes as those numbers not divisible |
+// by 2, 3, 5, and 7. Other (common) implementations define potential primes |
+// as those not divisible by 2. A few other implementations define potential |
+// primes as those not divisible by 2 or 3. By raising the number of small |
+// primes which the potential prime is not divisible by, the set of potential |
+// primes more closely approximates the set of prime numbers. And thus there |
+// are fewer potential primes to search, and fewer potential primes to divide |
+// against. |
+ |
+template <size_t _Sz = sizeof(size_t)> |
+inline _LIBCPP_INLINE_VISIBILITY |
+typename enable_if<_Sz == 4, void>::type |
+__check_for_overflow(size_t N) |
+{ |
+#ifndef _LIBCPP_NO_EXCEPTIONS |
+ if (N > 0xFFFFFFFB) |
+ throw overflow_error("__next_prime overflow"); |
+#else |
+ (void)N; |
+#endif |
+} |
+ |
+template <size_t _Sz = sizeof(size_t)> |
+inline _LIBCPP_INLINE_VISIBILITY |
+typename enable_if<_Sz == 8, void>::type |
+__check_for_overflow(size_t N) |
+{ |
+#ifndef _LIBCPP_NO_EXCEPTIONS |
+ if (N > 0xFFFFFFFFFFFFFFC5ull) |
+ throw overflow_error("__next_prime overflow"); |
+#else |
+ (void)N; |
+#endif |
+} |
+ |
+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 |
+ { |
+ 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 |
Property changes on: third_party/libcxx/src/hash.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |