xref: /freebsd-12.1/contrib/libc++/src/hash.cpp (revision d72607e9)
17a984708SDavid Chisnall //===-------------------------- hash.cpp ----------------------------------===//
27a984708SDavid Chisnall //
37a984708SDavid Chisnall //                     The LLVM Compiler Infrastructure
47a984708SDavid Chisnall //
57a984708SDavid Chisnall // This file is dual licensed under the MIT and the University of Illinois Open
67a984708SDavid Chisnall // Source Licenses. See LICENSE.TXT for details.
77a984708SDavid Chisnall //
87a984708SDavid Chisnall //===----------------------------------------------------------------------===//
97a984708SDavid Chisnall 
107a984708SDavid Chisnall #include "__hash_table"
117a984708SDavid Chisnall #include "algorithm"
127a984708SDavid Chisnall #include "stdexcept"
13cfdf2879SDavid Chisnall #include "type_traits"
14cfdf2879SDavid Chisnall 
15cfdf2879SDavid Chisnall #ifdef __clang__
16cfdf2879SDavid Chisnall #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
17cfdf2879SDavid Chisnall #endif
187a984708SDavid Chisnall 
197a984708SDavid Chisnall _LIBCPP_BEGIN_NAMESPACE_STD
207a984708SDavid Chisnall 
217a984708SDavid Chisnall namespace {
227a984708SDavid Chisnall 
237a984708SDavid Chisnall // handle all next_prime(i) for i in [1, 210), special case 0
247a984708SDavid Chisnall const unsigned small_primes[] =
257a984708SDavid Chisnall {
267a984708SDavid Chisnall     0,
277a984708SDavid Chisnall     2,
287a984708SDavid Chisnall     3,
297a984708SDavid Chisnall     5,
307a984708SDavid Chisnall     7,
317a984708SDavid Chisnall     11,
327a984708SDavid Chisnall     13,
337a984708SDavid Chisnall     17,
347a984708SDavid Chisnall     19,
357a984708SDavid Chisnall     23,
367a984708SDavid Chisnall     29,
377a984708SDavid Chisnall     31,
387a984708SDavid Chisnall     37,
397a984708SDavid Chisnall     41,
407a984708SDavid Chisnall     43,
417a984708SDavid Chisnall     47,
427a984708SDavid Chisnall     53,
437a984708SDavid Chisnall     59,
447a984708SDavid Chisnall     61,
457a984708SDavid Chisnall     67,
467a984708SDavid Chisnall     71,
477a984708SDavid Chisnall     73,
487a984708SDavid Chisnall     79,
497a984708SDavid Chisnall     83,
507a984708SDavid Chisnall     89,
517a984708SDavid Chisnall     97,
527a984708SDavid Chisnall     101,
537a984708SDavid Chisnall     103,
547a984708SDavid Chisnall     107,
557a984708SDavid Chisnall     109,
567a984708SDavid Chisnall     113,
577a984708SDavid Chisnall     127,
587a984708SDavid Chisnall     131,
597a984708SDavid Chisnall     137,
607a984708SDavid Chisnall     139,
617a984708SDavid Chisnall     149,
627a984708SDavid Chisnall     151,
637a984708SDavid Chisnall     157,
647a984708SDavid Chisnall     163,
657a984708SDavid Chisnall     167,
667a984708SDavid Chisnall     173,
677a984708SDavid Chisnall     179,
687a984708SDavid Chisnall     181,
697a984708SDavid Chisnall     191,
707a984708SDavid Chisnall     193,
717a984708SDavid Chisnall     197,
727a984708SDavid Chisnall     199,
737a984708SDavid Chisnall     211
747a984708SDavid Chisnall };
757a984708SDavid Chisnall 
767a984708SDavid Chisnall // potential primes = 210*k + indices[i], k >= 1
777a984708SDavid Chisnall //   these numbers are not divisible by 2, 3, 5 or 7
787a984708SDavid Chisnall //   (or any integer 2 <= j <= 10 for that matter).
797a984708SDavid Chisnall const unsigned indices[] =
807a984708SDavid Chisnall {
817a984708SDavid Chisnall     1,
827a984708SDavid Chisnall     11,
837a984708SDavid Chisnall     13,
847a984708SDavid Chisnall     17,
857a984708SDavid Chisnall     19,
867a984708SDavid Chisnall     23,
877a984708SDavid Chisnall     29,
887a984708SDavid Chisnall     31,
897a984708SDavid Chisnall     37,
907a984708SDavid Chisnall     41,
917a984708SDavid Chisnall     43,
927a984708SDavid Chisnall     47,
937a984708SDavid Chisnall     53,
947a984708SDavid Chisnall     59,
957a984708SDavid Chisnall     61,
967a984708SDavid Chisnall     67,
977a984708SDavid Chisnall     71,
987a984708SDavid Chisnall     73,
997a984708SDavid Chisnall     79,
1007a984708SDavid Chisnall     83,
1017a984708SDavid Chisnall     89,
1027a984708SDavid Chisnall     97,
1037a984708SDavid Chisnall     101,
1047a984708SDavid Chisnall     103,
1057a984708SDavid Chisnall     107,
1067a984708SDavid Chisnall     109,
1077a984708SDavid Chisnall     113,
1087a984708SDavid Chisnall     121,
1097a984708SDavid Chisnall     127,
1107a984708SDavid Chisnall     131,
1117a984708SDavid Chisnall     137,
1127a984708SDavid Chisnall     139,
1137a984708SDavid Chisnall     143,
1147a984708SDavid Chisnall     149,
1157a984708SDavid Chisnall     151,
1167a984708SDavid Chisnall     157,
1177a984708SDavid Chisnall     163,
1187a984708SDavid Chisnall     167,
1197a984708SDavid Chisnall     169,
1207a984708SDavid Chisnall     173,
1217a984708SDavid Chisnall     179,
1227a984708SDavid Chisnall     181,
1237a984708SDavid Chisnall     187,
1247a984708SDavid Chisnall     191,
1257a984708SDavid Chisnall     193,
1267a984708SDavid Chisnall     197,
1277a984708SDavid Chisnall     199,
1287a984708SDavid Chisnall     209
1297a984708SDavid Chisnall };
1307a984708SDavid Chisnall 
1317a984708SDavid Chisnall }
1327a984708SDavid Chisnall 
1337a984708SDavid Chisnall // Returns:  If n == 0, returns 0.  Else returns the lowest prime number that
1347a984708SDavid Chisnall // is greater than or equal to n.
1357a984708SDavid Chisnall //
1367a984708SDavid Chisnall // The algorithm creates a list of small primes, plus an open-ended list of
1377a984708SDavid Chisnall // potential primes.  All prime numbers are potential prime numbers.  However
1387a984708SDavid Chisnall // some potential prime numbers are not prime.  In an ideal world, all potential
139*d72607e9SDimitry Andric // prime numbers would be prime.  Candidate prime numbers are chosen as the next
1407a984708SDavid Chisnall // highest potential prime.  Then this number is tested for prime by dividing it
1417a984708SDavid Chisnall // by all potential prime numbers less than the sqrt of the candidate.
1427a984708SDavid Chisnall //
1437a984708SDavid Chisnall // This implementation defines potential primes as those numbers not divisible
1447a984708SDavid Chisnall // by 2, 3, 5, and 7.  Other (common) implementations define potential primes
1457a984708SDavid Chisnall // as those not divisible by 2.  A few other implementations define potential
1467a984708SDavid Chisnall // primes as those not divisible by 2 or 3.  By raising the number of small
1477a984708SDavid Chisnall // primes which the potential prime is not divisible by, the set of potential
1487a984708SDavid Chisnall // primes more closely approximates the set of prime numbers.  And thus there
1497a984708SDavid Chisnall // are fewer potential primes to search, and fewer potential primes to divide
1507a984708SDavid Chisnall // against.
1517a984708SDavid Chisnall 
152cfdf2879SDavid Chisnall template <size_t _Sz = sizeof(size_t)>
1537a984708SDavid Chisnall inline _LIBCPP_INLINE_VISIBILITY
154cfdf2879SDavid Chisnall typename enable_if<_Sz == 4, void>::type
__check_for_overflow(size_t N)155cfdf2879SDavid Chisnall __check_for_overflow(size_t N)
1567a984708SDavid Chisnall {
1577a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
1587a984708SDavid Chisnall     if (N > 0xFFFFFFFB)
1597a984708SDavid Chisnall         throw overflow_error("__next_prime overflow");
1601bf9f7c1SDimitry Andric #else
1611bf9f7c1SDimitry Andric     (void)N;
1627a984708SDavid Chisnall #endif
1637a984708SDavid Chisnall }
1647a984708SDavid Chisnall 
165cfdf2879SDavid Chisnall template <size_t _Sz = sizeof(size_t)>
1667a984708SDavid Chisnall inline _LIBCPP_INLINE_VISIBILITY
167cfdf2879SDavid Chisnall typename enable_if<_Sz == 8, void>::type
__check_for_overflow(size_t N)168cfdf2879SDavid Chisnall __check_for_overflow(size_t N)
1697a984708SDavid Chisnall {
1707a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
1717a984708SDavid Chisnall     if (N > 0xFFFFFFFFFFFFFFC5ull)
1727a984708SDavid Chisnall         throw overflow_error("__next_prime overflow");
1731bf9f7c1SDimitry Andric #else
1741bf9f7c1SDimitry Andric     (void)N;
1757a984708SDavid Chisnall #endif
1767a984708SDavid Chisnall }
1777a984708SDavid Chisnall 
1787a984708SDavid Chisnall size_t
__next_prime(size_t n)1797a984708SDavid Chisnall __next_prime(size_t n)
1807a984708SDavid Chisnall {
1817a984708SDavid Chisnall     const size_t L = 210;
1827a984708SDavid Chisnall     const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
1837a984708SDavid Chisnall     // If n is small enough, search in small_primes
1847a984708SDavid Chisnall     if (n <= small_primes[N-1])
1857a984708SDavid Chisnall         return *std::lower_bound(small_primes, small_primes + N, n);
1867a984708SDavid Chisnall     // Else n > largest small_primes
1877a984708SDavid Chisnall     // Check for overflow
188cfdf2879SDavid Chisnall     __check_for_overflow(n);
1897a984708SDavid Chisnall     // Start searching list of potential primes: L * k0 + indices[in]
1907a984708SDavid Chisnall     const size_t M = sizeof(indices) / sizeof(indices[0]);
1917a984708SDavid Chisnall     // Select first potential prime >= n
1927a984708SDavid Chisnall     //   Known a-priori n >= L
1937a984708SDavid Chisnall     size_t k0 = n / L;
19494e3ee44SDavid Chisnall     size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
19594e3ee44SDavid Chisnall                                     - indices);
1967a984708SDavid Chisnall     n = L * k0 + indices[in];
1977a984708SDavid Chisnall     while (true)
1987a984708SDavid Chisnall     {
1997a984708SDavid Chisnall         // Divide n by all primes or potential primes (i) until:
2007a984708SDavid Chisnall         //    1.  The division is even, so try next potential prime.
2017a984708SDavid Chisnall         //    2.  The i > sqrt(n), in which case n is prime.
2027a984708SDavid Chisnall         // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
2037a984708SDavid Chisnall         //    so don't test those (j == 5 ->  divide by 11 first).  And the
2047a984708SDavid Chisnall         //    potential primes start with 211, so don't test against the last
2057a984708SDavid Chisnall         //    small prime.
2067a984708SDavid Chisnall         for (size_t j = 5; j < N - 1; ++j)
2077a984708SDavid Chisnall         {
2087a984708SDavid Chisnall             const std::size_t p = small_primes[j];
2097a984708SDavid Chisnall             const std::size_t q = n / p;
2107a984708SDavid Chisnall             if (q < p)
2117a984708SDavid Chisnall                 return n;
2127a984708SDavid Chisnall             if (n == q * p)
2137a984708SDavid Chisnall                 goto next;
2147a984708SDavid Chisnall         }
2157a984708SDavid Chisnall         // n wasn't divisible by small primes, try potential primes
2167a984708SDavid Chisnall         {
2177a984708SDavid Chisnall             size_t i = 211;
2187a984708SDavid Chisnall             while (true)
2197a984708SDavid Chisnall             {
2207a984708SDavid Chisnall                 std::size_t q = n / i;
2217a984708SDavid Chisnall                 if (q < i)
2227a984708SDavid Chisnall                     return n;
2237a984708SDavid Chisnall                 if (n == q * i)
2247a984708SDavid Chisnall                     break;
2257a984708SDavid Chisnall 
2267a984708SDavid Chisnall                 i += 10;
2277a984708SDavid Chisnall                 q = n / i;
2287a984708SDavid Chisnall                 if (q < i)
2297a984708SDavid Chisnall                     return n;
2307a984708SDavid Chisnall                 if (n == q * i)
2317a984708SDavid Chisnall                     break;
2327a984708SDavid Chisnall 
2337a984708SDavid Chisnall                 i += 2;
2347a984708SDavid Chisnall                 q = n / i;
2357a984708SDavid Chisnall                 if (q < i)
2367a984708SDavid Chisnall                     return n;
2377a984708SDavid Chisnall                 if (n == q * i)
2387a984708SDavid Chisnall                     break;
2397a984708SDavid Chisnall 
2407a984708SDavid Chisnall                 i += 4;
2417a984708SDavid Chisnall                 q = n / i;
2427a984708SDavid Chisnall                 if (q < i)
2437a984708SDavid Chisnall                     return n;
2447a984708SDavid Chisnall                 if (n == q * i)
2457a984708SDavid Chisnall                     break;
2467a984708SDavid Chisnall 
2477a984708SDavid Chisnall                 i += 2;
2487a984708SDavid Chisnall                 q = n / i;
2497a984708SDavid Chisnall                 if (q < i)
2507a984708SDavid Chisnall                     return n;
2517a984708SDavid Chisnall                 if (n == q * i)
2527a984708SDavid Chisnall                     break;
2537a984708SDavid Chisnall 
2547a984708SDavid Chisnall                 i += 4;
2557a984708SDavid Chisnall                 q = n / i;
2567a984708SDavid Chisnall                 if (q < i)
2577a984708SDavid Chisnall                     return n;
2587a984708SDavid Chisnall                 if (n == q * i)
2597a984708SDavid Chisnall                     break;
2607a984708SDavid Chisnall 
2617a984708SDavid Chisnall                 i += 6;
2627a984708SDavid Chisnall                 q = n / i;
2637a984708SDavid Chisnall                 if (q < i)
2647a984708SDavid Chisnall                     return n;
2657a984708SDavid Chisnall                 if (n == q * i)
2667a984708SDavid Chisnall                     break;
2677a984708SDavid Chisnall 
2687a984708SDavid Chisnall                 i += 2;
2697a984708SDavid Chisnall                 q = n / i;
2707a984708SDavid Chisnall                 if (q < i)
2717a984708SDavid Chisnall                     return n;
2727a984708SDavid Chisnall                 if (n == q * i)
2737a984708SDavid Chisnall                     break;
2747a984708SDavid Chisnall 
2757a984708SDavid Chisnall                 i += 6;
2767a984708SDavid Chisnall                 q = n / i;
2777a984708SDavid Chisnall                 if (q < i)
2787a984708SDavid Chisnall                     return n;
2797a984708SDavid Chisnall                 if (n == q * i)
2807a984708SDavid Chisnall                     break;
2817a984708SDavid Chisnall 
2827a984708SDavid Chisnall                 i += 4;
2837a984708SDavid Chisnall                 q = n / i;
2847a984708SDavid Chisnall                 if (q < i)
2857a984708SDavid Chisnall                     return n;
2867a984708SDavid Chisnall                 if (n == q * i)
2877a984708SDavid Chisnall                     break;
2887a984708SDavid Chisnall 
2897a984708SDavid Chisnall                 i += 2;
2907a984708SDavid Chisnall                 q = n / i;
2917a984708SDavid Chisnall                 if (q < i)
2927a984708SDavid Chisnall                     return n;
2937a984708SDavid Chisnall                 if (n == q * i)
2947a984708SDavid Chisnall                     break;
2957a984708SDavid Chisnall 
2967a984708SDavid Chisnall                 i += 4;
2977a984708SDavid Chisnall                 q = n / i;
2987a984708SDavid Chisnall                 if (q < i)
2997a984708SDavid Chisnall                     return n;
3007a984708SDavid Chisnall                 if (n == q * i)
3017a984708SDavid Chisnall                     break;
3027a984708SDavid Chisnall 
3037a984708SDavid Chisnall                 i += 6;
3047a984708SDavid Chisnall                 q = n / i;
3057a984708SDavid Chisnall                 if (q < i)
3067a984708SDavid Chisnall                     return n;
3077a984708SDavid Chisnall                 if (n == q * i)
3087a984708SDavid Chisnall                     break;
3097a984708SDavid Chisnall 
3107a984708SDavid Chisnall                 i += 6;
3117a984708SDavid Chisnall                 q = n / i;
3127a984708SDavid Chisnall                 if (q < i)
3137a984708SDavid Chisnall                     return n;
3147a984708SDavid Chisnall                 if (n == q * i)
3157a984708SDavid Chisnall                     break;
3167a984708SDavid Chisnall 
3177a984708SDavid Chisnall                 i += 2;
3187a984708SDavid Chisnall                 q = n / i;
3197a984708SDavid Chisnall                 if (q < i)
3207a984708SDavid Chisnall                     return n;
3217a984708SDavid Chisnall                 if (n == q * i)
3227a984708SDavid Chisnall                     break;
3237a984708SDavid Chisnall 
3247a984708SDavid Chisnall                 i += 6;
3257a984708SDavid Chisnall                 q = n / i;
3267a984708SDavid Chisnall                 if (q < i)
3277a984708SDavid Chisnall                     return n;
3287a984708SDavid Chisnall                 if (n == q * i)
3297a984708SDavid Chisnall                     break;
3307a984708SDavid Chisnall 
3317a984708SDavid Chisnall                 i += 4;
3327a984708SDavid Chisnall                 q = n / i;
3337a984708SDavid Chisnall                 if (q < i)
3347a984708SDavid Chisnall                     return n;
3357a984708SDavid Chisnall                 if (n == q * i)
3367a984708SDavid Chisnall                     break;
3377a984708SDavid Chisnall 
3387a984708SDavid Chisnall                 i += 2;
3397a984708SDavid Chisnall                 q = n / i;
3407a984708SDavid Chisnall                 if (q < i)
3417a984708SDavid Chisnall                     return n;
3427a984708SDavid Chisnall                 if (n == q * i)
3437a984708SDavid Chisnall                     break;
3447a984708SDavid Chisnall 
3457a984708SDavid Chisnall                 i += 6;
3467a984708SDavid Chisnall                 q = n / i;
3477a984708SDavid Chisnall                 if (q < i)
3487a984708SDavid Chisnall                     return n;
3497a984708SDavid Chisnall                 if (n == q * i)
3507a984708SDavid Chisnall                     break;
3517a984708SDavid Chisnall 
3527a984708SDavid Chisnall                 i += 4;
3537a984708SDavid Chisnall                 q = n / i;
3547a984708SDavid Chisnall                 if (q < i)
3557a984708SDavid Chisnall                     return n;
3567a984708SDavid Chisnall                 if (n == q * i)
3577a984708SDavid Chisnall                     break;
3587a984708SDavid Chisnall 
3597a984708SDavid Chisnall                 i += 6;
3607a984708SDavid Chisnall                 q = n / i;
3617a984708SDavid Chisnall                 if (q < i)
3627a984708SDavid Chisnall                     return n;
3637a984708SDavid Chisnall                 if (n == q * i)
3647a984708SDavid Chisnall                     break;
3657a984708SDavid Chisnall 
3667a984708SDavid Chisnall                 i += 8;
3677a984708SDavid Chisnall                 q = n / i;
3687a984708SDavid Chisnall                 if (q < i)
3697a984708SDavid Chisnall                     return n;
3707a984708SDavid Chisnall                 if (n == q * i)
3717a984708SDavid Chisnall                     break;
3727a984708SDavid Chisnall 
3737a984708SDavid Chisnall                 i += 4;
3747a984708SDavid Chisnall                 q = n / i;
3757a984708SDavid Chisnall                 if (q < i)
3767a984708SDavid Chisnall                     return n;
3777a984708SDavid Chisnall                 if (n == q * i)
3787a984708SDavid Chisnall                     break;
3797a984708SDavid Chisnall 
3807a984708SDavid Chisnall                 i += 2;
3817a984708SDavid Chisnall                 q = n / i;
3827a984708SDavid Chisnall                 if (q < i)
3837a984708SDavid Chisnall                     return n;
3847a984708SDavid Chisnall                 if (n == q * i)
3857a984708SDavid Chisnall                     break;
3867a984708SDavid Chisnall 
3877a984708SDavid Chisnall                 i += 4;
3887a984708SDavid Chisnall                 q = n / i;
3897a984708SDavid Chisnall                 if (q < i)
3907a984708SDavid Chisnall                     return n;
3917a984708SDavid Chisnall                 if (n == q * i)
3927a984708SDavid Chisnall                     break;
3937a984708SDavid Chisnall 
3947a984708SDavid Chisnall                 i += 2;
3957a984708SDavid Chisnall                 q = n / i;
3967a984708SDavid Chisnall                 if (q < i)
3977a984708SDavid Chisnall                     return n;
3987a984708SDavid Chisnall                 if (n == q * i)
3997a984708SDavid Chisnall                     break;
4007a984708SDavid Chisnall 
4017a984708SDavid Chisnall                 i += 4;
4027a984708SDavid Chisnall                 q = n / i;
4037a984708SDavid Chisnall                 if (q < i)
4047a984708SDavid Chisnall                     return n;
4057a984708SDavid Chisnall                 if (n == q * i)
4067a984708SDavid Chisnall                     break;
4077a984708SDavid Chisnall 
4087a984708SDavid Chisnall                 i += 8;
4097a984708SDavid Chisnall                 q = n / i;
4107a984708SDavid Chisnall                 if (q < i)
4117a984708SDavid Chisnall                     return n;
4127a984708SDavid Chisnall                 if (n == q * i)
4137a984708SDavid Chisnall                     break;
4147a984708SDavid Chisnall 
4157a984708SDavid Chisnall                 i += 6;
4167a984708SDavid Chisnall                 q = n / i;
4177a984708SDavid Chisnall                 if (q < i)
4187a984708SDavid Chisnall                     return n;
4197a984708SDavid Chisnall                 if (n == q * i)
4207a984708SDavid Chisnall                     break;
4217a984708SDavid Chisnall 
4227a984708SDavid Chisnall                 i += 4;
4237a984708SDavid Chisnall                 q = n / i;
4247a984708SDavid Chisnall                 if (q < i)
4257a984708SDavid Chisnall                     return n;
4267a984708SDavid Chisnall                 if (n == q * i)
4277a984708SDavid Chisnall                     break;
4287a984708SDavid Chisnall 
4297a984708SDavid Chisnall                 i += 6;
4307a984708SDavid Chisnall                 q = n / i;
4317a984708SDavid Chisnall                 if (q < i)
4327a984708SDavid Chisnall                     return n;
4337a984708SDavid Chisnall                 if (n == q * i)
4347a984708SDavid Chisnall                     break;
4357a984708SDavid Chisnall 
4367a984708SDavid Chisnall                 i += 2;
4377a984708SDavid Chisnall                 q = n / i;
4387a984708SDavid Chisnall                 if (q < i)
4397a984708SDavid Chisnall                     return n;
4407a984708SDavid Chisnall                 if (n == q * i)
4417a984708SDavid Chisnall                     break;
4427a984708SDavid Chisnall 
4437a984708SDavid Chisnall                 i += 4;
4447a984708SDavid Chisnall                 q = n / i;
4457a984708SDavid Chisnall                 if (q < i)
4467a984708SDavid Chisnall                     return n;
4477a984708SDavid Chisnall                 if (n == q * i)
4487a984708SDavid Chisnall                     break;
4497a984708SDavid Chisnall 
4507a984708SDavid Chisnall                 i += 6;
4517a984708SDavid Chisnall                 q = n / i;
4527a984708SDavid Chisnall                 if (q < i)
4537a984708SDavid Chisnall                     return n;
4547a984708SDavid Chisnall                 if (n == q * i)
4557a984708SDavid Chisnall                     break;
4567a984708SDavid Chisnall 
4577a984708SDavid Chisnall                 i += 2;
4587a984708SDavid Chisnall                 q = n / i;
4597a984708SDavid Chisnall                 if (q < i)
4607a984708SDavid Chisnall                     return n;
4617a984708SDavid Chisnall                 if (n == q * i)
4627a984708SDavid Chisnall                     break;
4637a984708SDavid Chisnall 
4647a984708SDavid Chisnall                 i += 6;
4657a984708SDavid Chisnall                 q = n / i;
4667a984708SDavid Chisnall                 if (q < i)
4677a984708SDavid Chisnall                     return n;
4687a984708SDavid Chisnall                 if (n == q * i)
4697a984708SDavid Chisnall                     break;
4707a984708SDavid Chisnall 
4717a984708SDavid Chisnall                 i += 6;
4727a984708SDavid Chisnall                 q = n / i;
4737a984708SDavid Chisnall                 if (q < i)
4747a984708SDavid Chisnall                     return n;
4757a984708SDavid Chisnall                 if (n == q * i)
4767a984708SDavid Chisnall                     break;
4777a984708SDavid Chisnall 
4787a984708SDavid Chisnall                 i += 4;
4797a984708SDavid Chisnall                 q = n / i;
4807a984708SDavid Chisnall                 if (q < i)
4817a984708SDavid Chisnall                     return n;
4827a984708SDavid Chisnall                 if (n == q * i)
4837a984708SDavid Chisnall                     break;
4847a984708SDavid Chisnall 
4857a984708SDavid Chisnall                 i += 2;
4867a984708SDavid Chisnall                 q = n / i;
4877a984708SDavid Chisnall                 if (q < i)
4887a984708SDavid Chisnall                     return n;
4897a984708SDavid Chisnall                 if (n == q * i)
4907a984708SDavid Chisnall                     break;
4917a984708SDavid Chisnall 
4927a984708SDavid Chisnall                 i += 4;
4937a984708SDavid Chisnall                 q = n / i;
4947a984708SDavid Chisnall                 if (q < i)
4957a984708SDavid Chisnall                     return n;
4967a984708SDavid Chisnall                 if (n == q * i)
4977a984708SDavid Chisnall                     break;
4987a984708SDavid Chisnall 
4997a984708SDavid Chisnall                 i += 6;
5007a984708SDavid Chisnall                 q = n / i;
5017a984708SDavid Chisnall                 if (q < i)
5027a984708SDavid Chisnall                     return n;
5037a984708SDavid Chisnall                 if (n == q * i)
5047a984708SDavid Chisnall                     break;
5057a984708SDavid Chisnall 
5067a984708SDavid Chisnall                 i += 2;
5077a984708SDavid Chisnall                 q = n / i;
5087a984708SDavid Chisnall                 if (q < i)
5097a984708SDavid Chisnall                     return n;
5107a984708SDavid Chisnall                 if (n == q * i)
5117a984708SDavid Chisnall                     break;
5127a984708SDavid Chisnall 
5137a984708SDavid Chisnall                 i += 6;
5147a984708SDavid Chisnall                 q = n / i;
5157a984708SDavid Chisnall                 if (q < i)
5167a984708SDavid Chisnall                     return n;
5177a984708SDavid Chisnall                 if (n == q * i)
5187a984708SDavid Chisnall                     break;
5197a984708SDavid Chisnall 
5207a984708SDavid Chisnall                 i += 4;
5217a984708SDavid Chisnall                 q = n / i;
5227a984708SDavid Chisnall                 if (q < i)
5237a984708SDavid Chisnall                     return n;
5247a984708SDavid Chisnall                 if (n == q * i)
5257a984708SDavid Chisnall                     break;
5267a984708SDavid Chisnall 
5277a984708SDavid Chisnall                 i += 2;
5287a984708SDavid Chisnall                 q = n / i;
5297a984708SDavid Chisnall                 if (q < i)
5307a984708SDavid Chisnall                     return n;
5317a984708SDavid Chisnall                 if (n == q * i)
5327a984708SDavid Chisnall                     break;
5337a984708SDavid Chisnall 
5347a984708SDavid Chisnall                 i += 4;
5357a984708SDavid Chisnall                 q = n / i;
5367a984708SDavid Chisnall                 if (q < i)
5377a984708SDavid Chisnall                     return n;
5387a984708SDavid Chisnall                 if (n == q * i)
5397a984708SDavid Chisnall                     break;
5407a984708SDavid Chisnall 
5417a984708SDavid Chisnall                 i += 2;
5427a984708SDavid Chisnall                 q = n / i;
5437a984708SDavid Chisnall                 if (q < i)
5447a984708SDavid Chisnall                     return n;
5457a984708SDavid Chisnall                 if (n == q * i)
5467a984708SDavid Chisnall                     break;
5477a984708SDavid Chisnall 
5487a984708SDavid Chisnall                 i += 10;
5497a984708SDavid Chisnall                 q = n / i;
5507a984708SDavid Chisnall                 if (q < i)
5517a984708SDavid Chisnall                     return n;
5527a984708SDavid Chisnall                 if (n == q * i)
5537a984708SDavid Chisnall                     break;
5547a984708SDavid Chisnall 
5557a984708SDavid Chisnall                 // This will loop i to the next "plane" of potential primes
5567a984708SDavid Chisnall                 i += 2;
5577a984708SDavid Chisnall             }
5587a984708SDavid Chisnall         }
5597a984708SDavid Chisnall next:
5607a984708SDavid Chisnall         // n is not prime.  Increment n to next potential prime.
5617a984708SDavid Chisnall         if (++in == M)
5627a984708SDavid Chisnall         {
5637a984708SDavid Chisnall             ++k0;
5647a984708SDavid Chisnall             in = 0;
5657a984708SDavid Chisnall         }
5667a984708SDavid Chisnall         n = L * k0 + indices[in];
5677a984708SDavid Chisnall     }
5687a984708SDavid Chisnall }
5697a984708SDavid Chisnall 
5707a984708SDavid Chisnall _LIBCPP_END_NAMESPACE_STD
571