summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libcxx/include/iterator12
-rw-r--r--libcxx/include/type_traits24
-rw-r--r--libcxx/src/hash.cpp346
3 files changed, 228 insertions, 154 deletions
diff --git a/libcxx/include/iterator b/libcxx/include/iterator
index b8360909151..cda778f73d7 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -151,7 +151,7 @@ public:
typedef void pointer;
explicit back_insert_iterator(Container& x);
- back_insert_iterator& operator=(typename Container::const_reference value);
+ back_insert_iterator& operator=(const typename _Container::value_type& value);
back_insert_iterator& operator*();
back_insert_iterator& operator++();
back_insert_iterator operator++(int);
@@ -172,7 +172,7 @@ public:
typedef void pointer;
explicit front_insert_iterator(Container& x);
- front_insert_iterator& operator=(typename Container::const_reference value);
+ front_insert_iterator& operator=(const typename _Container::value_type& value);
front_insert_iterator& operator*();
front_insert_iterator& operator++();
front_insert_iterator operator++(int);
@@ -194,7 +194,7 @@ public:
typedef void pointer;
insert_iterator(Container& x, typename Container::iterator i);
- insert_iterator& operator=(typename Container::const_reference value);
+ insert_iterator& operator=(const typename _Container::value_type& value);
insert_iterator& operator*();
insert_iterator& operator++();
insert_iterator& operator++(int);
@@ -624,7 +624,7 @@ public:
typedef _Container container_type;
_LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(&__x) {}
- _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::const_reference __value)
+ _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value)
{container->push_back(__value); return *this;}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value)
@@ -657,7 +657,7 @@ public:
typedef _Container container_type;
_LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(&__x) {}
- _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::const_reference __value)
+ _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value)
{container->push_front(__value); return *this;}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value)
@@ -692,7 +692,7 @@ public:
_LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i)
: container(&__x), iter(__i) {}
- _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::const_reference __value)
+ _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value)
{iter = container->insert(iter, __value); ++iter; return *this;}
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
_LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value)
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits
index 1d1bdc29225..e754a00d790 100644
--- a/libcxx/include/type_traits
+++ b/libcxx/include/type_traits
@@ -1302,6 +1302,28 @@ move(_Tp&& __t)
return static_cast<typename remove_reference<_Tp>::type&&>(__t);
}
+#if 1
+
+template <class _Tp>
+inline _LIBCPP_INLINE_VISIBILITY
+_Tp&&
+forward(typename std::remove_reference<_Tp>::type& __t)
+{
+ return static_cast<_Tp&&>(__t);
+}
+
+template <class _Tp>
+inline _LIBCPP_INLINE_VISIBILITY
+_Tp&&
+forward(typename std::remove_reference<_Tp>::type&& __t)
+{
+ static_assert(!std::is_lvalue_reference<_Tp>::value,
+ "Can not forward an rvalue as an lvalue.");
+ return static_cast<_Tp&&>(__t);
+}
+
+#else
+
template <class _Tp,
class = typename enable_if<
!is_lvalue_reference<_Tp>::value
@@ -1346,6 +1368,8 @@ template <class _Tp,
_Tp
forward(typename remove_reference<_Tp>::type&& __t) = delete;
+#endif
+
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
template <class _Tp>
diff --git a/libcxx/src/hash.cpp b/libcxx/src/hash.cpp
index 1189894f78b..dd4e8e3e1ac 100644
--- a/libcxx/src/hash.cpp
+++ b/libcxx/src/hash.cpp
@@ -157,7 +157,7 @@ __next_prime(size_t n)
// Select first potential prime >= n
// Known a-priori n >= L
size_t k0 = n / L;
- size_t in = std::lower_bound(indices, indices + M, n % L) - indices;
+ size_t in = std::lower_bound(indices, indices + M, n - k0 * L) - indices;
n = L * k0 + indices[in];
while (true)
{
@@ -170,302 +170,352 @@ __next_prime(size_t n)
// small prime.
for (size_t j = 5; j < N - 1; ++j)
{
- if (n % small_primes[j] == 0)
- goto next;
- if (n / small_primes[j] < small_primes[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)
{
- if (n % i == 0)
- break;
- if (n / i < i)
+ std::size_t q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 10;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 8;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 8;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 6;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 4;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 2;
- if (n % i == 0)
- break;
- if (n / i < i)
+ q = n / i;
+ if (q < i)
return n;
+ if (n == q * i)
+ break;
i += 10;
- if (n % i == 0)
- break;
- if (n / i < i)
+ 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;
OpenPOWER on IntegriCloud