Hi Howard,<br><br>I find strange to use `const typename Container::value_type&` instead of `typename Container::const_reference` for the insert iterators: it prevents the user from using a proxy instead of a plain reference (as it would prevent her to use a smart pointer instead of a plain pointer were you to use `const typename Container::value_type*` instead of `typename Container::const_pointer`).<br>
<br>Also, there seems to be a discrepancy (for the insert iterators) between the parameter of the template `Container` and the value you used as a replacement `_Container` (note the leading underscore) on the lines 154, 175 and 197. It is fine on the other lines because the template parameter is indeed `_Container` later on.<br>
<br>Matthieu<br><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
Author: hhinnant<br>
Date: Sun Sep 12 20:43:27 2010<br>
New Revision: 113731<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=113731&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=113731&view=rev</a><br>
Log:<br>
Experimenting with a new forward fomulation (kudos Daniel Kruegler), updated insert iterators to work better with pproxies, and doubled the speed of __next_prime.<br>
<br>
Modified:<br>
    libcxx/trunk/include/iterator<br>
    libcxx/trunk/include/type_traits<br>
    libcxx/trunk/src/hash.cpp<br>
<br>
Modified: libcxx/trunk/include/iterator<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=113731&r1=113730&r2=113731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=113731&r1=113730&r2=113731&view=diff</a><br>

==============================================================================<br>
--- libcxx/trunk/include/iterator (original)<br>
+++ libcxx/trunk/include/iterator Sun Sep 12 20:43:27 2010<br>
@@ -151,7 +151,7 @@<br>
     typedef void                        pointer;<br>
<br>
     explicit back_insert_iterator(Container& x);<br>
-    back_insert_iterator& operator=(typename Container::const_reference value);<br>
+    back_insert_iterator& operator=(const typename _Container::value_type& value);<br>
     back_insert_iterator& operator*();<br>
     back_insert_iterator& operator++();<br>
     back_insert_iterator  operator++(int);<br>
@@ -172,7 +172,7 @@<br>
     typedef void                         pointer;<br>
<br>
     explicit front_insert_iterator(Container& x);<br>
-    front_insert_iterator& operator=(typename Container::const_reference value);<br>
+    front_insert_iterator& operator=(const typename _Container::value_type& value);<br>
     front_insert_iterator& operator*();<br>
     front_insert_iterator& operator++();<br>
     front_insert_iterator  operator++(int);<br>
@@ -194,7 +194,7 @@<br>
     typedef void                   pointer;<br>
<br>
     insert_iterator(Container& x, typename Container::iterator i);<br>
-    insert_iterator& operator=(typename Container::const_reference value);<br>
+    insert_iterator& operator=(const typename _Container::value_type& value);<br>
     insert_iterator& operator*();<br>
     insert_iterator& operator++();<br>
     insert_iterator& operator++(int);<br>
@@ -624,7 +624,7 @@<br>
     typedef _Container container_type;<br>
<br>
     _LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(&__x) {}<br>
-    _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::const_reference __value)<br>
+    _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value)<br>
         {container->push_back(__value); return *this;}<br>
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value)<br>
@@ -657,7 +657,7 @@<br>
     typedef _Container container_type;<br>
<br>
     _LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(&__x) {}<br>
-    _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::const_reference __value)<br>
+    _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value)<br>
         {container->push_front(__value); return *this;}<br>
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value)<br>
@@ -692,7 +692,7 @@<br>
<br>
     _LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i)<br>
         : container(&__x), iter(__i) {}<br>
-    _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::const_reference __value)<br>
+    _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value)<br>
         {iter = container->insert(iter, __value); ++iter; return *this;}<br>
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value)<br>
<br></blockquote></div>