diff options
Diffstat (limited to 'libstdc++-v3/include/profile/list')
-rw-r--r-- | libstdc++-v3/include/profile/list | 394 |
1 files changed, 151 insertions, 243 deletions
diff --git a/libstdc++-v3/include/profile/list b/libstdc++-v3/include/profile/list index 87d99a0b93d..438b440108c 100644 --- a/libstdc++-v3/include/profile/list +++ b/libstdc++-v3/include/profile/list @@ -30,81 +30,109 @@ #define _GLIBCXX_PROFILE_LIST 1 #include <list> -#include <profile/base.h> -#include <profile/iterator_tracker.h> +#include <profile/base.h> +#include <profile/iterator_tracker.h> namespace std _GLIBCXX_VISIBILITY(default) { namespace __profile { + template<typename _List> + class _List_profile + { + _List& + _M_conjure() + { return *static_cast<_List*>(this); } + + public: + _List_profile() _GLIBCXX_NOEXCEPT + { + __profcxx_list_construct(&_M_conjure()); // list2slist + __profcxx_list_construct2(&_M_conjure()); // list2vector + } + +#if __cplusplus >= 201103L + _List_profile(const _List_profile&) noexcept + : _List_profile() { } + _List_profile(_List_profile&&) noexcept + : _List_profile() { } + + _List_profile& + operator=(const _List_profile&) = default; + _List_profile& + operator=(_List_profile&&) = default; +#endif + + ~_List_profile() + { + __profcxx_list_destruct(&_M_conjure()); + __profcxx_list_destruct2(&_M_conjure()); + } + }; + /** @brief List wrapper with performance instrumentation. */ -template<typename _Tp, typename _Allocator = std::allocator<_Tp> > + template<typename _Tp, typename _Allocator = std::allocator<_Tp> > class list - : public _GLIBCXX_STD_C::list<_Tp, _Allocator> + : public _GLIBCXX_STD_C::list<_Tp, _Allocator>, + public _List_profile<list<_Tp, _Allocator> > { - typedef _GLIBCXX_STD_C::list<_Tp, _Allocator> _Base; + typedef _GLIBCXX_STD_C::list<_Tp, _Allocator> _Base; public: - typedef typename _Base::reference reference; - typedef typename _Base::const_reference const_reference; + typedef typename _Base::reference reference; + typedef typename _Base::const_reference const_reference; - typedef __iterator_tracker<typename _Base::iterator, list> - iterator; - typedef __iterator_tracker<typename _Base::const_iterator, list> - const_iterator; + typedef __iterator_tracker<typename _Base::iterator, list> + iterator; + typedef __iterator_tracker<typename _Base::const_iterator, list> + const_iterator; - typedef typename _Base::size_type size_type; - typedef typename _Base::difference_type difference_type; + typedef typename _Base::size_type size_type; + typedef typename _Base::difference_type difference_type; - typedef _Tp value_type; - typedef _Allocator allocator_type; - typedef typename _Base::pointer pointer; - typedef typename _Base::const_pointer const_pointer; - typedef std::reverse_iterator<iterator> reverse_iterator; - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + typedef _Tp value_type; + typedef _Allocator allocator_type; + typedef typename _Base::pointer pointer; + typedef typename _Base::const_pointer const_pointer; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // 23.2.2.1 construct/copy/destroy: - list() _GLIBCXX_NOEXCEPT - : _Base() - { - __profcxx_list_construct(this); // list2slist - __profcxx_list_construct2(this); // list2vector - } +#if __cplusplus < 201103L + list() { } + list(const list& __x) + : _Base(__x) { } + + ~list() { } +#else + list() = default; + list(const list&) = default; + list(list&&) = default; + ~list() = default; + + list(initializer_list<value_type> __l, + const allocator_type& __a = allocator_type()) + : _Base(__l, __a) { } +#endif explicit list(const _Allocator& __a) _GLIBCXX_NOEXCEPT - : _Base(__a) - { - __profcxx_list_construct(this); // list2slist - __profcxx_list_construct2(this); // list2vector - } + : _Base(__a) { } #if __cplusplus >= 201103L explicit list(size_type __n) - : _Base(__n) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } + : _Base(__n) { } list(size_type __n, const _Tp& __value, const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } + : _Base(__n, __value, __a) { } #else explicit list(size_type __n, const _Tp& __value = _Tp(), const _Allocator& __a = _Allocator()) - : _Base(__n, __value, __a) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } + : _Base(__n, __value, __a) { } #endif #if __cplusplus >= 201103L @@ -115,91 +143,33 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > #endif list(_InputIterator __first, _InputIterator __last, const _Allocator& __a = _Allocator()) - : _Base(__first, __last, __a) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } - - list(const list& __x) - : _Base(__x) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } + : _Base(__first, __last, __a) { } list(const _Base& __x) - : _Base(__x) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } - -#if __cplusplus >= 201103L - list(list&& __x) noexcept - : _Base(std::move(__x)) - { - __profcxx_list_construct(this); - __profcxx_list_construct2(this); - } - - list(initializer_list<value_type> __l, - const allocator_type& __a = allocator_type()) - : _Base(__l, __a) { } -#endif - - ~list() _GLIBCXX_NOEXCEPT - { - __profcxx_list_destruct(this); - __profcxx_list_destruct2(this); - } + : _Base(__x) { } +#if __cplusplus < 201103L list& operator=(const list& __x) { - static_cast<_Base&>(*this) = __x; + _M_base() = __x; return *this; } +#else + list& + operator=(const list&) = default; -#if __cplusplus >= 201103L list& - operator=(list&& __x) - { - // NB: DR 1204. - // NB: DR 675. - this->clear(); - this->swap(__x); - return *this; - } + operator=(list&&) = default; list& operator=(initializer_list<value_type> __l) { - static_cast<_Base&>(*this) = __l; + _M_base() = __l; return *this; } - - void - assign(initializer_list<value_type> __l) - { _Base::assign(__l); } #endif -#if __cplusplus >= 201103L - template<typename _InputIterator, - typename = std::_RequireInputIter<_InputIterator>> -#else - template<class _InputIterator> -#endif - void - assign(_InputIterator __first, _InputIterator __last) - { _Base::assign(__first, __last); } - - void - assign(size_type __n, const _Tp& __t) - { _Base::assign(__n, __t); } - - using _Base::get_allocator; - // iterators: iterator begin() _GLIBCXX_NOEXCEPT @@ -212,29 +182,29 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > iterator end() _GLIBCXX_NOEXCEPT { - __profcxx_list_rewind(this); - return iterator(_Base::end(), this); + __profcxx_list_rewind(this); + return iterator(_Base::end(), this); } const_iterator end() const _GLIBCXX_NOEXCEPT { - __profcxx_list_rewind(this); - return const_iterator(_Base::end(), this); + __profcxx_list_rewind(this); + return const_iterator(_Base::end(), this); } reverse_iterator rbegin() _GLIBCXX_NOEXCEPT { - __profcxx_list_rewind(this); - return reverse_iterator(end()); + __profcxx_list_rewind(this); + return reverse_iterator(end()); } const_reverse_iterator rbegin() const _GLIBCXX_NOEXCEPT - { - __profcxx_list_rewind(this); - return const_reverse_iterator(end()); + { + __profcxx_list_rewind(this); + return const_reverse_iterator(end()); } reverse_iterator @@ -248,11 +218,11 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > #if __cplusplus >= 201103L const_iterator cbegin() const noexcept - { return const_iterator(_Base::begin(), this); } + { return const_iterator(_Base::cbegin(), this); } const_iterator cend() const noexcept - { return const_iterator(_Base::end(), this); } + { return const_iterator(_Base::cend(), this); } const_reverse_iterator crbegin() const noexcept @@ -264,44 +234,17 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > #endif // 23.2.2.2 capacity: - using _Base::empty; - using _Base::size; - using _Base::max_size; - -#if __cplusplus >= 201103L - void - resize(size_type __sz) - { _Base::resize(__sz); } - - void - resize(size_type __sz, const _Tp& __c) - { _Base::resize(__sz, __c); } -#else - void - resize(size_type __sz, _Tp __c = _Tp()) - { _Base::resize(__sz, __c); } -#endif - - // element access: - reference - front() _GLIBCXX_NOEXCEPT - { return _Base::front(); } - - const_reference - front() const _GLIBCXX_NOEXCEPT - { return _Base::front(); } - reference back() _GLIBCXX_NOEXCEPT { - __profcxx_list_rewind(this); + __profcxx_list_rewind(this); return _Base::back(); } const_reference back() const _GLIBCXX_NOEXCEPT { - __profcxx_list_rewind(this); + __profcxx_list_rewind(this); return _Base::back(); } @@ -309,44 +252,32 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > void push_front(const value_type& __x) { - __profcxx_list_invalid_operator(this); - __profcxx_list_operation(this); - _Base::push_front(__x); + __profcxx_list_invalid_operator(this); + __profcxx_list_operation(this); + _Base::push_front(__x); } -#if __cplusplus >= 201103L - using _Base::emplace_front; -#endif - void pop_front() _GLIBCXX_NOEXCEPT { - __profcxx_list_operation(this); + __profcxx_list_operation(this); _Base::pop_front(); } - using _Base::push_back; - -#if __cplusplus >= 201103L - using _Base::emplace_back; -#endif - void pop_back() _GLIBCXX_NOEXCEPT { - iterator __victim = end(); - --__victim; _Base::pop_back(); - __profcxx_list_rewind(this); + __profcxx_list_rewind(this); } #if __cplusplus >= 201103L template<typename... _Args> - iterator - emplace(const_iterator __position, _Args&&... __args) + iterator + emplace(const_iterator __position, _Args&&... __args) { return iterator(_Base::emplace(__position.base(), - std::forward<_Args>(__args)...), + std::forward<_Args>(__args)...), this); } #endif @@ -358,24 +289,24 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > insert(iterator __position, const _Tp& __x) #endif { - _M_profile_insert(this, __position, size()); - return iterator(_Base::insert(__position.base(), __x), this); + _M_profile_insert(this, __position, this->size()); + return iterator(_Base::insert(__position.base(), __x), this); } #if __cplusplus >= 201103L iterator insert(const_iterator __position, _Tp&& __x) { - _M_profile_insert(this, __position, size()); - return iterator(_Base::emplace(__position.base(), std::move(__x)), - this); + _M_profile_insert(this, __position, this->size()); + return iterator(_Base::emplace(__position.base(), std::move(__x)), + this); } iterator insert(const_iterator __position, initializer_list<value_type> __l) { - _M_profile_insert(this, __position, size()); - return iterator(_Base::insert(__position.base(), __l), this); + _M_profile_insert(this, __position, this->size()); + return iterator(_Base::insert(__position.base(), __l), this); } #endif @@ -383,14 +314,14 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > iterator insert(const_iterator __position, size_type __n, const _Tp& __x) { - _M_profile_insert(this, __position, size()); + _M_profile_insert(this, __position, this->size()); return iterator(_Base::insert(__position.base(), __n, __x), this); } #else void insert(iterator __position, size_type __n, const _Tp& __x) { - _M_profile_insert(this, __position, size()); + _M_profile_insert(this, __position, this->size()); _Base::insert(__position.base(), __n, __x); } #endif @@ -399,20 +330,20 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > template<typename _InputIterator, typename = std::_RequireInputIter<_InputIterator>> iterator - insert(const_iterator __position, _InputIterator __first, + insert(const_iterator __position, _InputIterator __first, _InputIterator __last) { - _M_profile_insert(this, __position, size()); + _M_profile_insert(this, __position, this->size()); return iterator(_Base::insert(__position.base(), __first, __last), this); } #else template<class _InputIterator> - void - insert(iterator __position, _InputIterator __first, + void + insert(iterator __position, _InputIterator __first, _InputIterator __last) { - _M_profile_insert(this, __position, size()); + _M_profile_insert(this, __position, this->size()); _Base::insert(__position.base(), __first, __last); } #endif @@ -439,12 +370,11 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > void swap(list& __x) +#if __cplusplus >= 201103L + noexcept( noexcept(declval<_Base>().swap(__x)) ) +#endif { _Base::swap(__x); } - void - clear() _GLIBCXX_NOEXCEPT - { _Base::clear(); } - // 23.2.2.4 list operations: void #if __cplusplus >= 201103L @@ -488,9 +418,6 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > iterator __last) #endif { - // We used to perform the splice_alloc check: not anymore, redundant - // after implementing the relevant bits of N1599. - _Base::splice(__position.base(), _GLIBCXX_MOVE(__x._M_base()), __first.base(), __last.base()); } @@ -515,12 +442,12 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > } template<class _Predicate> - void - remove_if(_Predicate __pred) - { + void + remove_if(_Predicate __pred) + { for (iterator __x = begin(); __x != end(); ) { - __profcxx_list_operation(this); + __profcxx_list_operation(this); if (__pred(*__x)) __x = erase(__x); else @@ -538,7 +465,7 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > iterator __next = __first; while (++__next != __last) { - __profcxx_list_operation(this); + __profcxx_list_operation(this); if (*__first == *__next) erase(__next); else @@ -548,9 +475,9 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > } template<class _BinaryPredicate> - void - unique(_BinaryPredicate __binary_pred) - { + void + unique(_BinaryPredicate __binary_pred) + { iterator __first = begin(); iterator __last = end(); if (__first == __last) @@ -558,7 +485,7 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > iterator __next = __first; while (++__next != __last) { - __profcxx_list_operation(this); + __profcxx_list_operation(this); if (__binary_pred(*__first, *__next)) erase(__next); else @@ -573,12 +500,7 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > #else merge(list& __x) #endif - { - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 300. list::merge() specification incomplete - if (this != &__x) - { _Base::merge(_GLIBCXX_MOVE(__x._M_base())); } - } + { _Base::merge(_GLIBCXX_MOVE(__x._M_base())); } #if __cplusplus >= 201103L void @@ -587,63 +509,49 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > #endif template<class _Compare> - void + void #if __cplusplus >= 201103L - merge(list&& __x, _Compare __comp) + merge(list&& __x, _Compare __comp) #else - merge(list& __x, _Compare __comp) + merge(list& __x, _Compare __comp) #endif - { - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 300. list::merge() specification incomplete - if (this != &__x) - { _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); } - } + { _Base::merge(_GLIBCXX_MOVE(__x._M_base()), __comp); } #if __cplusplus >= 201103L template<typename _Compare> - void - merge(list& __x, _Compare __comp) - { this->merge(std::move(__x), __comp); } + void + merge(list& __x, _Compare __comp) + { this->merge(std::move(__x), __comp); } #endif - void - sort() { _Base::sort(); } - - template<typename _StrictWeakOrdering> - void - sort(_StrictWeakOrdering __pred) { _Base::sort(__pred); } - - using _Base::reverse; - _Base& - _M_base() _GLIBCXX_NOEXCEPT { return *this; } + _M_base() _GLIBCXX_NOEXCEPT { return *this; } const _Base& - _M_base() const _GLIBCXX_NOEXCEPT { return *this; } + _M_base() const _GLIBCXX_NOEXCEPT { return *this; } void _M_profile_find() const { } - void _M_profile_iterate(int __rewind = 0) const + void _M_profile_iterate(int __rewind = 0) const { - __profcxx_list_operation(this); - __profcxx_list_iterate(this); - if (__rewind) - __profcxx_list_rewind(this); + __profcxx_list_operation(this); + __profcxx_list_iterate(this); + if (__rewind) + __profcxx_list_rewind(this); } private: size_type _M_profile_insert(void* obj, const_iterator __pos, size_type __size) { - size_type __shift = 0; - typename _Base::const_iterator __it = __pos.base(); - for (; __it != _Base::end(); ++__it) - __shift++; - __profcxx_list_rewind(this); - __profcxx_list_operation(this); - __profcxx_list_insert(this, __shift, __size); + size_type __shift = 0; + typename _Base::const_iterator __it = __pos.base(); + for (; __it != _Base::end(); ++__it) + __shift++; + __profcxx_list_rewind(this); + __profcxx_list_operation(this); + __profcxx_list_insert(this, __shift, __size); } }; |