Re: container method call shortcuts

2016-06-15 Thread Jonathan Wakely

On 14/06/16 22:04 +0200, François Dumont wrote:

Hi

   Here is the patch to limit burden on compiler in finding out what 
is the right method to call eventually when we already know it.


Very nice, OK for trunk, thanks.


container method call shortcuts

2016-06-14 Thread François Dumont

Hi

Here is the patch to limit burden on compiler in finding out what 
is the right method to call eventually when we already know it.


This patch doesn't show all indentation fixes I will also commit.

* include/bits/stl_deque.h
(std::deque<>::operator=): Call _M_assign_aux.
(std::deque<>::assign(initializer_list<>)): Likewise.
(std::deque<>::resize(size_t, const value_type&)): Call _M_fill_insert.
(std::deque<>::insert(const_iterator, initializer_list<>)):
Call _M_range_insert_aux.
(std::deque<>::_M_assign_aux(It, It, std::forward_iterator_tag):
Likewise.
(std::deque<>::_M_fill_assign): Call _M_fill_insert.
(std::deque<>::_M_move_assign2): Call _M_assign_aux.
* include/bits/deque.tcc
(std::deque<>::operator=): Call _M_range_insert_aux.
(std::deque<>::_M_assign_aux(It, It, std::input_iterator_tag)):
Likewise.
* include/bits/stl_vector.h
(std::vector<>::operator=): Call _M_assign_aux.
(std::vector<>::assign(initializer_list<>)): Likewise.
(std::vector<>::resize(size_t, const value_type&)): Call 
_M_fill_insert.

(std::vector<>::insert(const_iterator, initializer_list<>)):
Call _M_range_insert.
* include/bits/vector.tcc (std::vector<>::_M_assign_aux): Likewise.

Tested under Linux x86_64.

François
diff --git a/libstdc++-v3/include/bits/deque.tcc b/libstdc++-v3/include/bits/deque.tcc
index b1dab64..96ec9f8 100644
--- a/libstdc++-v3/include/bits/deque.tcc
+++ b/libstdc++-v3/include/bits/deque.tcc
@@ -119,7 +119,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	{
 	  const_iterator __mid = __x.begin() + difference_type(__len);
 	  std::copy(__x.begin(), __mid, this->_M_impl._M_start);
-	  insert(this->_M_impl._M_finish, __mid, __x.end());
+	  _M_range_insert_aux(this->_M_impl._M_finish, __mid, __x.end(),
+  std::random_access_iterator_tag());
 	}
 	}
   return *this;
@@ -280,7 +281,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 if (__first == __last)
   _M_erase_at_end(__cur);
 else
-  insert(end(), __first, __last);
+  _M_range_insert_aux(end(), __first, __last,
+			  std::__iterator_category(__first));
   }
 
   template 
diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h
index d7a9d52..f63ae4c 100644
--- a/libstdc++-v3/include/bits/stl_deque.h
+++ b/libstdc++-v3/include/bits/stl_deque.h
@@ -1081,7 +1081,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   deque&
   operator=(initializer_list __l)
   {
-	this->assign(__l.begin(), __l.end());
+	_M_assign_aux(__l.begin(), __l.end(),
+		  random_access_iterator_tag());
 	return *this;
   }
 #endif
@@ -1142,7 +1143,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/
   void
   assign(initializer_list __l)
-  { this->assign(__l.begin(), __l.end()); }
+  { _M_assign_aux(__l.begin(), __l.end(), random_access_iterator_tag()); }
 #endif
 
   /// Get a copy of the memory allocation object.
@@ -1306,7 +1307,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   {
 	const size_type __len = size();
 	if (__new_size > __len)
-	  insert(this->_M_impl._M_finish, __new_size - __len, __x);
+	  _M_fill_insert(this->_M_impl._M_finish, __new_size - __len, __x);
 	else if (__new_size < __len)
 	  _M_erase_at_end(this->_M_impl._M_start
 			  + difference_type(__new_size));
@@ -1328,7 +1329,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   {
 	const size_type __len = size();
 	if (__new_size > __len)
-	  insert(this->_M_impl._M_finish, __new_size - __len, __x);
+	  _M_fill_insert(this->_M_impl._M_finish, __new_size - __len, __x);
 	else if (__new_size < __len)
 	  _M_erase_at_end(this->_M_impl._M_start
 			  + difference_type(__new_size));
@@ -1645,7 +1646,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/
   iterator
   insert(const_iterator __p, initializer_list __l)
-  { return this->insert(__p, __l.begin(), __l.end()); }
+  {
+	auto __offset = __p - cbegin();
+	_M_range_insert_aux(__p._M_const_cast(), __l.begin(), __l.end(),
+			std::random_access_iterator_tag());
+	return begin() + __offset;
+  }
 #endif
 
 #if __cplusplus >= 201103L
@@ -1819,9 +1825,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
 			   __false_type)
 {
-	  typedef typename std::iterator_traits<_InputIterator>::
-	iterator_category _IterCategory;
-	  _M_range_initialize(__first, __last, _IterCategory());
+	  _M_range_initialize(__first, __last,
+			  std::__iterator_category(__first));
 	}
 
   // called by the second initialize_dispatch above
@@ -1884,11 +1889,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 void
 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
 			   __false_type)
-{
-	  typedef typename std::iterator_traits<_InputIterator>::
-	iterator_category _IterCategory;
-	  _M_assign_aux(__first, __last, _IterCategory());
-	}