This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Tree containers profile mode fix


Hi

Here is a patch to fix profile mode compilation errors. It makes tree based containers C++11 allocator aware in profile mode as they are in normal mode. I also try to use default implementation as much as possible to benefit from the normal mode noexcept qualifications on the defaulted functions.

Note that for some containers having no profiling instrumentation I try to replace the empty wrapper with template alias like:

template <typename _Key, typename _Compare = std::less<_Key>,
                 typename _Alloc = std::allocator<_Key>>
using set = _GLIBCXX_STD_C::set<_Key, _Compare, _Alloc>;

But some explicit instantiations failed then in the tests. Is it a gcc limitation or a Standard requirement to refuse explicit instantiation of a template alias ? If It could be interpreted as an explicit instantiation of the underlying type it would be really useful.

2014-01-15  François Dumont <fdumont@gcc.gnu.org>

    * include/profile/set.h (set): Implement C++11 allocator-aware
    container requirements.
    * include/profile/map.h (map): Likewise.
    * include/profile/multiset.h (multiset): Likewise.
    * include/profile/multimap.h (multimap): Likewise.
    * include/profile/set.h
    (set::operator=(const set&)): Define as default in C++11 mode.
    (set::operator=(set&&)): Likewise.
    * include/profile/map.h
    (map::operator=(const map&)): Likewise.
    (map::operator=(map&&)): Likewise.
    * include/profile/multiset.h
    (multiset::operator=(const multiset&)): Likewise.
    (multiset::operator=(multiset&&)): Likewise.
    * include/profile/multimap.h
    (multimap::operator=(const multimap&)): Likewise.
    (multimap::operator=(multimap&&)): Likewise.
    * include/profile/set.h (set::operator=(std::initializer_list<>)):
    Rely on the same operator from normal mode.
    * include/profile/map.h (map::operator=(std::initializer_list<>)):
    Likewise.
    * include/profile/multiset.h
    (multiset::operator=(std::initializer_list<>)): Likewise.
    * include/debug/multimap.h
    (multimap::operator=(std::initializer_list<>)): Likewise.
    * include/debug/set.h (set::swap(set&)): Add noexcept
    specification.
    * include/debug/map.h (map::swap(map&)): Likewise.
    * include/debug/multiset.h (multiset::swap(multiset&)): Likewise.
    * include/debug/multimap.h (multimap::swap(multimap&)): Likewise.

Tested under Linux x86_64 normal and profile modes.

François

Index: include/profile/multiset.h
===================================================================
--- include/profile/multiset.h	(revision 206587)
+++ include/profile/multiset.h	(working copy)
@@ -43,6 +43,10 @@
     {
       typedef _GLIBCXX_STD_C::multiset<_Key, _Compare, _Allocator> _Base;
 
+#if __cplusplus >= 201103L
+      typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
+#endif
+
     public:
       // types:
       typedef _Key				     key_type;
@@ -79,49 +83,62 @@
 		 const _Allocator& __a = _Allocator())
 	: _Base(__first, __last, __comp, __a) { }
 
+#if __cplusplus < 201103L
       multiset(const multiset& __x)
       : _Base(__x) { }
+#else
+      multiset(const multiset&) = default;
+      multiset(multiset&&) = default;
 
-      multiset(const _Base& __x)
-      : _Base(__x) { }
-
-#if __cplusplus >= 201103L
-      multiset(multiset&& __x)
-      noexcept(is_nothrow_copy_constructible<_Compare>::value)
-      : _Base(std::move(__x))
-      { }
-
       multiset(initializer_list<value_type> __l,
 	       const _Compare& __comp = _Compare(),
 	       const allocator_type& __a = allocator_type())
       : _Base(__l, __comp, __a) { }
+
+      explicit
+      multiset(const allocator_type& __a)
+	: _Base(__a) { }
+
+      multiset(const multiset& __x, const allocator_type& __a)
+      : _Base(__x, __a) { }
+
+      multiset(multiset&& __x, const allocator_type& __a)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value
+	       && _Alloc_traits::_S_always_equal())
+      : _Base(std::move(__x), __a) { }
+
+      multiset(initializer_list<value_type> __l, const allocator_type& __a)
+      : _Base(__l, __a) { }
+
+      template<typename _InputIterator>
+        multiset(_InputIterator __first, _InputIterator __last,
+	    const allocator_type& __a)
+	  : _Base(__first, __last, __a) { }
 #endif
 
+      multiset(const _Base& __x)
+      : _Base(__x) { }
+
       ~multiset() _GLIBCXX_NOEXCEPT { }
 
+#if __cplusplus < 201103L
       multiset&
       operator=(const multiset& __x)
       {
-	*static_cast<_Base*>(this) = __x;
+	_M_base() = __x;
 	return *this;
       }
+#else
+      multiset&
+      operator=(const multiset&) = default;
 
-#if __cplusplus >= 201103L
       multiset&
-      operator=(multiset&& __x)
-      {
-	// NB: DR 1204.
-	// NB: DR 675.
-	this->clear();
-	this->swap(__x);
-	return *this;
-      }
+      operator=(multiset&&) = default;
 
       multiset&
       operator=(initializer_list<value_type> __l)
       {
-	this->clear();
-	this->insert(__l);
+	_M_base() = __l;
 	return *this;
       }
 #endif
@@ -272,6 +289,9 @@
 
       void
       swap(multiset& __x)
+#if __cplusplus >= 201103L
+      noexcept(_Alloc_traits::_S_nothrow_swap())
+#endif
       { _Base::swap(__x); }
 
       void
Index: include/profile/map.h
===================================================================
--- include/profile/map.h	(revision 206587)
+++ include/profile/map.h	(working copy)
@@ -43,6 +43,10 @@
     {
       typedef _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Allocator> _Base;
 
+#if __cplusplus >= 201103L
+      typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
+#endif
+
     public:
       // types:
       typedef _Key                                  key_type;
@@ -93,40 +97,61 @@
       map(map&& __x)
       noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x))
-      { }
+      { __profcxx_map_to_unordered_map_construct(this); }
 
       map(initializer_list<value_type> __l,
 	  const _Compare& __c = _Compare(),
 	  const allocator_type& __a = allocator_type())
-      : _Base(__l, __c, __a) { }
+      : _Base(__l, __c, __a)
+      { __profcxx_map_to_unordered_map_construct(this); }
+
+      explicit
+      map(const allocator_type& __a)
+	: _Base(__a)
+      { __profcxx_map_to_unordered_map_construct(this); }
+
+      map(const map& __x, const allocator_type& __a)
+      : _Base(__x, __a)
+      { __profcxx_map_to_unordered_map_construct(this); }
+
+      map(map&& __x, const allocator_type& __a)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value
+	       && _Alloc_traits::_S_always_equal())
+      : _Base(std::move(__x), __a)
+      { __profcxx_map_to_unordered_map_construct(this); }
+
+      map(initializer_list<value_type> __l, const allocator_type& __a)
+      : _Base(__l, __a)
+      { __profcxx_map_to_unordered_map_construct(this); }
+
+      template<typename _InputIterator>
+        map(_InputIterator __first, _InputIterator __last,
+	    const allocator_type& __a)
+	  : _Base(__first, __last, __a)
+      { __profcxx_map_to_unordered_map_construct(this); }
 #endif
 
       ~map() _GLIBCXX_NOEXCEPT
       { __profcxx_map_to_unordered_map_destruct(this); }
 
+#if __cplusplus < 201103L
       map&
       operator=(const map& __x)
       {
-	*static_cast<_Base*>(this) = __x;
+	_M_base() = __x;
 	return *this;
       }
+#else
+      map&
+      operator=(const map&) = default;
 
-#if __cplusplus >= 201103L
       map&
-      operator=(map&& __x)
-      {
-	// NB: DR 1204.
-	// NB: DR 675.
-	this->clear();
-	this->swap(__x);
-	return *this;
-      }
+      operator=(map&&) = default;
 
       map&
       operator=(initializer_list<value_type> __l)
       {
-	this->clear();
-	this->insert(__l);
+	_M_base() = __l;
 	return *this;
       }
 #endif
@@ -393,6 +418,9 @@
 
       void
       swap(map& __x)
+#if __cplusplus >= 201103L
+      noexcept(_Alloc_traits::_S_nothrow_swap())
+#endif
       { _Base::swap(__x); }
 
       void
Index: include/profile/multimap.h
===================================================================
--- include/profile/multimap.h	(revision 206587)
+++ include/profile/multimap.h	(working copy)
@@ -43,6 +43,10 @@
     {
       typedef _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Allocator> _Base;
 
+#if __cplusplus >= 201103L
+      typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
+#endif
+
     public:
       // types:
       typedef _Key				     key_type;
@@ -79,49 +83,62 @@
 	       const _Allocator& __a = _Allocator())
       : _Base(__first, __last, __comp, __a) { }
 
+#if __cplusplus < 201103L
       multimap(const multimap& __x)
       : _Base(__x) { }
+#else
+      multimap(const multimap&) = default;
+      multimap(multimap&&) = default;
 
-      multimap(const _Base& __x)
-      : _Base(__x) { }
-
-#if __cplusplus >= 201103L
-      multimap(multimap&& __x)
-      noexcept(is_nothrow_copy_constructible<_Compare>::value)
-      : _Base(std::move(__x))
-      { }
-
       multimap(initializer_list<value_type> __l,
 	       const _Compare& __c = _Compare(),
 	       const allocator_type& __a = allocator_type())
       : _Base(__l, __c, __a) { }
+
+      explicit
+      multimap(const allocator_type& __a)
+	: _Base(__a) { }
+
+      multimap(const multimap& __x, const allocator_type& __a)
+      : _Base(__x, __a) { }
+
+      multimap(multimap&& __x, const allocator_type& __a)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value
+	       && _Alloc_traits::_S_always_equal())
+      : _Base(std::move(__x), __a) { }
+
+      multimap(initializer_list<value_type> __l, const allocator_type& __a)
+      : _Base(__l, __a) { }
+
+      template<typename _InputIterator>
+        multimap(_InputIterator __first, _InputIterator __last,
+	    const allocator_type& __a)
+	  : _Base(__first, __last, __a) { }
 #endif
 
+      multimap(const _Base& __x)
+      : _Base(__x) { }
+
       ~multimap() _GLIBCXX_NOEXCEPT { }
 
+#if __cplusplus < 201103L
       multimap&
       operator=(const multimap& __x)
       {
-	*static_cast<_Base*>(this) = __x;
+	_M_base() = __x;
 	return *this;
       }
+#else
+      multimap&
+      operator=(const multimap&) = default;
 
-#if __cplusplus >= 201103L
       multimap&
-      operator=(multimap&& __x)
-      {
-	// NB: DR 1204.
-	// NB: DR 675.
-	this->clear();
-	this->swap(__x);
-	return *this;
-      }
+      operator=(multimap&&) = default;
 
       multimap&
       operator=(initializer_list<value_type> __l)
       {
-	this->clear();
-	this->insert(__l);
+	_M_base() = __l;
 	return *this;
       }
 #endif
@@ -289,6 +306,9 @@
 
       void
       swap(multimap& __x)
+#if __cplusplus >= 201103L
+      noexcept(_Alloc_traits::_S_nothrow_swap())
+#endif
       { _Base::swap(__x); }
 
       void
Index: include/profile/set.h
===================================================================
--- include/profile/set.h	(revision 206587)
+++ include/profile/set.h	(working copy)
@@ -43,6 +43,10 @@
     {
       typedef _GLIBCXX_STD_C::set<_Key, _Compare, _Allocator> _Base;
 
+#if __cplusplus >= 201103L
+      typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
+#endif
+
     public:
       // types:
       typedef _Key				    key_type;
@@ -79,49 +83,62 @@
 	    const _Allocator& __a = _Allocator())
 	: _Base(__first, __last, __comp, __a) { }
 
+#if __cplusplus < 201103L
       set(const set& __x)
       : _Base(__x) { }
+#else
+      set(const set&) = default;
+      set(set&&) = default;
 
-      set(const _Base& __x)
-      : _Base(__x) { }
-
-#if __cplusplus >= 201103L
-      set(set&& __x)
-      noexcept(is_nothrow_copy_constructible<_Compare>::value)
-      : _Base(std::move(__x))
-      { }
-
       set(initializer_list<value_type> __l,
 	  const _Compare& __comp = _Compare(),
 	  const allocator_type& __a = allocator_type())
       : _Base(__l, __comp, __a) { }
+
+      explicit
+      set(const allocator_type& __a)
+	: _Base(__a) { }
+
+      set(const set& __x, const allocator_type& __a)
+      : _Base(__x, __a) { }
+
+      set(set&& __x, const allocator_type& __a)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value
+	       && _Alloc_traits::_S_always_equal())
+      : _Base(std::move(__x), __a) { }
+
+      set(initializer_list<value_type> __l, const allocator_type& __a)
+      : _Base(__l, __a) { }
+
+      template<typename _InputIterator>
+        set(_InputIterator __first, _InputIterator __last,
+	    const allocator_type& __a)
+	  : _Base(__first, __last, __a) { }
 #endif
 
+      set(const _Base& __x)
+      : _Base(__x) { }
+
       ~set() _GLIBCXX_NOEXCEPT { }
 
+#if __cplusplus < 201103L
       set&
       operator=(const set& __x)
       {
-	*static_cast<_Base*>(this) = __x;
+	_M_base() = __x;
 	return *this;
       }
+#else
+      set&
+      operator=(const set&) = default;
 
-#if __cplusplus >= 201103L
       set&
-      operator=(set&& __x)
-      {
-	// NB: DR 1204.
-	// NB: DR 675.
-	this->clear();
-	this->swap(__x);
-	return *this;
-      }
+      operator=(set&&) = default;
 
       set&
       operator=(initializer_list<value_type> __l)
       {
-	this->clear();
-	this->insert(__l);
+	_M_base() = __l;
 	return *this;
       }
 #endif
@@ -286,6 +303,9 @@
 
       void
       swap(set& __x)
+#if __cplusplus >= 201103L
+      noexcept(_Alloc_traits::_S_nothrow_swap())
+#endif
       { _Base::swap(__x); }
 
       void


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]