From 390e4c0dbe9b5e6854641701c3b0443526130d3b Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Fri, 16 Apr 2004 19:04:07 +0000 Subject: [PATCH] c++config (_GLIBCXX_STD): New. 2004-04-16 Benjamin Kosnik * include/bits/c++config (_GLIBCXX_STD): New. * src/list.cc: Use it. * include/std/std_bitset.h: Same. * include/bits/vector.tcc: Same. * include/bits/stl_set.h: Same. * include/bits/stl_multiset.h: Same. * include/bits/stl_multimap.h: Same. * include/bits/stl_map.h: Same. * include/bits/stl_list.h: Same. * include/bits/stl_vector.h: Same. * include/bits/stl_bvector.h: Same. * include/bits/stl_deque.h: Same. * include/bits/deque.tcc: Same. * include/bits/list.tcc: Same. * include/debug/vector: Same. * include/debug/set.h: Same. * include/debug/multiset.h: Same. * include/debug/multimap.h: Same. * include/debug/map.h: Same. * include/debug/list: Same. * include/debug/deque: Same. * include/debug/bitset: Same. * include/debug/formatter.h (__gnu_debug): Remove using directive. Add using declaration for std::type_info. * include/debug/safe_iterator.h: Add using declaration for std::iterator_traits and std::pair. * src/debug_list.cc: New. * src/Makefile.am: Add debug_list.cc. * src/Makefile.in: Regenerate. * config/linker-map.gnu: Add _List_node_base exports for std and __gnu_norm. * include/bits/stl_bvector.h (_Bvector_base): Use _Bvector_impl idiom that other containers use. * testsuite/23_containers/vector/bool/clear_allocator.cc: New. From-SVN: r80763 --- libstdc++-v3/ChangeLog | 38 ++++ libstdc++-v3/Makefile.in | 2 +- libstdc++-v3/config/linker-map.gnu | 13 +- libstdc++-v3/include/bits/c++config | 25 ++- libstdc++-v3/include/bits/deque.tcc | 4 +- libstdc++-v3/include/bits/list.tcc | 4 +- libstdc++-v3/include/bits/stl_bvector.h | 207 +++++++++--------- libstdc++-v3/include/bits/stl_deque.h | 4 +- libstdc++-v3/include/bits/stl_list.h | 4 +- libstdc++-v3/include/bits/stl_map.h | 4 +- libstdc++-v3/include/bits/stl_multimap.h | 4 +- libstdc++-v3/include/bits/stl_multiset.h | 4 +- libstdc++-v3/include/bits/stl_set.h | 4 +- libstdc++-v3/include/bits/stl_vector.h | 4 +- libstdc++-v3/include/bits/vector.tcc | 4 +- libstdc++-v3/include/debug/bitset | 7 +- libstdc++-v3/include/debug/deque | 8 +- libstdc++-v3/include/debug/formatter.h | 4 +- libstdc++-v3/include/debug/list | 8 +- libstdc++-v3/include/debug/map.h | 6 +- libstdc++-v3/include/debug/multimap.h | 6 +- libstdc++-v3/include/debug/multiset.h | 6 +- libstdc++-v3/include/debug/safe_iterator.h | 5 +- libstdc++-v3/include/debug/set.h | 6 +- libstdc++-v3/include/debug/vector | 6 +- libstdc++-v3/include/std/std_bitset.h | 5 +- libstdc++-v3/src/Makefile.am | 1 + libstdc++-v3/src/Makefile.in | 13 +- libstdc++-v3/src/debug_list.cc | 34 +++ libstdc++-v3/src/list.cc | 6 +- .../vector/bool/clear_allocator.cc | 88 ++++++++ 31 files changed, 361 insertions(+), 173 deletions(-) create mode 100644 libstdc++-v3/src/debug_list.cc create mode 100644 libstdc++-v3/testsuite/23_containers/vector/bool/clear_allocator.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f6846551c128..386efbc3e830 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,41 @@ +2004-04-16 Benjamin Kosnik + + * include/bits/c++config (_GLIBCXX_STD): New. + * src/list.cc: Use it. + * include/std/std_bitset.h: Same. + * include/bits/vector.tcc: Same. + * include/bits/stl_set.h: Same. + * include/bits/stl_multiset.h: Same. + * include/bits/stl_multimap.h: Same. + * include/bits/stl_map.h: Same. + * include/bits/stl_list.h: Same. + * include/bits/stl_vector.h: Same. + * include/bits/stl_bvector.h: Same. + * include/bits/stl_deque.h: Same. + * include/bits/deque.tcc: Same. + * include/bits/list.tcc: Same. + * include/debug/vector: Same. + * include/debug/set.h: Same. + * include/debug/multiset.h: Same. + * include/debug/multimap.h: Same. + * include/debug/map.h: Same. + * include/debug/list: Same. + * include/debug/deque: Same. + * include/debug/bitset: Same. + * include/debug/formatter.h (__gnu_debug): Remove using directive. + Add using declaration for std::type_info. + * include/debug/safe_iterator.h: Add using declaration for + std::iterator_traits and std::pair. + * src/debug_list.cc: New. + * src/Makefile.am: Add debug_list.cc. + * src/Makefile.in: Regenerate. + * config/linker-map.gnu: Add _List_node_base exports for std and + __gnu_norm. + + * include/bits/stl_bvector.h (_Bvector_base): Use _Bvector_impl + idiom that other containers use. + * testsuite/23_containers/vector/bool/clear_allocator.cc: New. + 2004-04-16 Paolo Carlini PR libstdc++/14975 diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in index 051ace1e5869..cf4d198bdc18 100644 --- a/libstdc++-v3/Makefile.in +++ b/libstdc++-v3/Makefile.in @@ -44,7 +44,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/../config.guess \ $(top_srcdir)/configure $(top_srcdir)/fragment.am \ $(top_srcdir)/scripts/check_survey.in \ $(top_srcdir)/scripts/testsuite_flags.in ../ABOUT-NLS \ - ../COPYING ../COPYING.LIB ../ChangeLog ../README \ + ../COPYING ../COPYING.LIB ../ChangeLog ../README ../compile \ ../config.guess ../config.rpath ../config.sub ../install-sh \ ../ltcf-c.sh ../ltcf-cxx.sh ../ltcf-gcj.sh ../ltconfig \ ../ltmain.sh ../missing ../mkinstalldirs ../ylwrap ChangeLog \ diff --git a/libstdc++-v3/config/linker-map.gnu b/libstdc++-v3/config/linker-map.gnu index 7dd9a2a12f79..b9205db85a03 100644 --- a/libstdc++-v3/config/linker-map.gnu +++ b/libstdc++-v3/config/linker-map.gnu @@ -55,6 +55,11 @@ GLIBCXX_3.4 { std::locale::_S_normalize_category*; std::locale::_[T-Za-z]*; std::[A-Zm-z]*; + std::_List_node_base::hook*; + std::_List_node_base::swap*; + std::_List_node_base::unhook*; + std::_List_node_base::reverse*; + std::_List_node_base::transfer*; std::__throw_*; std::__basic_file*; std::__timepunct*; @@ -66,10 +71,14 @@ GLIBCXX_3.4 { std::__moneypunct_cache*; std::__numpunct_cache*; std::__timepunct_cache*; - __gnu_norm::*; __gnu_debug::_Safe_iterator_base*; __gnu_debug::_Safe_sequence_base*; - __gnu_debug::_Error_formatter* + __gnu_debug::_Error_formatter*; + __gnu_norm::_List_node_base::hook*; + __gnu_norm::_List_node_base::swap*; + __gnu_norm::_List_node_base::unhook*; + __gnu_norm::_List_node_base::reverse*; + __gnu_norm::_List_node_base::transfer* }; # Names not in an 'extern' block are mangled names. diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 58d9bb048983..473777f8d2aa 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -1,6 +1,6 @@ // Predefined symbols and macros -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -51,27 +51,30 @@ # define _GLIBCXX_EXTERN_TEMPLATE 1 #endif -// To enable debug mode. -namespace __gnu_norm -{ - using namespace std; -} - +// Debug mode support. Debug mode basic_string is not allowed to be +// associated with std, because of locale and exception link +// dependence. namespace __gnu_debug_def { } namespace __gnu_debug { - using namespace __gnu_debug_def __attribute__ ((strong)); + using namespace __gnu_debug_def; } +#ifdef _GLIBCXX_DEBUG +# define _GLIBCXX_STD __gnu_norm +namespace __gnu_norm +{ + using namespace std; +} namespace std { -#ifdef _GLIBCXX_DEBUG using namespace __gnu_debug_def __attribute__ ((strong)); +} #else - using namespace __gnu_norm __attribute__ ((strong)); +# define _GLIBCXX_STD std #endif -} + // The remainder of the prewritten config is automatic; all the // user hooks are listed above. diff --git a/libstdc++-v3/include/bits/deque.tcc b/libstdc++-v3/include/bits/deque.tcc index 22fc573d9c05..e8e043886abb 100644 --- a/libstdc++-v3/include/bits/deque.tcc +++ b/libstdc++-v3/include/bits/deque.tcc @@ -61,7 +61,7 @@ #ifndef _DEQUE_TCC #define _DEQUE_TCC 1 -namespace __gnu_norm +namespace _GLIBCXX_STD { template deque<_Tp,_Alloc>& @@ -714,6 +714,6 @@ namespace __gnu_norm this->_M_impl._M_start._M_set_node(__new_nstart); this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1); } -} // namespace __gnu_norm +} // namespace std #endif diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc index f712be2ab0b2..aaaa8c364bdf 100644 --- a/libstdc++-v3/include/bits/list.tcc +++ b/libstdc++-v3/include/bits/list.tcc @@ -61,7 +61,7 @@ #ifndef _LIST_TCC #define _LIST_TCC 1 -namespace __gnu_norm +namespace _GLIBCXX_STD { template void @@ -371,7 +371,7 @@ namespace __gnu_norm swap( *(__fill-1) ); } } -} // namespace __gnu_norm +} // namespace std #endif /* _LIST_TCC */ diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h index 3ed04e5031be..4ecdf4449259 100644 --- a/libstdc++-v3/include/bits/stl_bvector.h +++ b/libstdc++-v3/include/bits/stl_bvector.h @@ -1,4 +1,4 @@ -// bit_vector and vector specialization -*- C++ -*- +// vector specialization -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. // @@ -61,7 +61,7 @@ #ifndef _BVECTOR_H #define _BVECTOR_H 1 -namespace __gnu_norm +namespace _GLIBCXX_STD { typedef unsigned long _Bit_type; enum { _S_word_bit = int(CHAR_BIT * sizeof(_Bit_type)) }; @@ -322,7 +322,8 @@ namespace __gnu_norm return *this; } - const_iterator operator+(difference_type __i) const { + const_iterator + operator+(difference_type __i) const { const_iterator __tmp = *this; return __tmp += __i; } @@ -345,47 +346,52 @@ namespace __gnu_norm template class _Bvector_base - : public _Alloc::template rebind<_Bit_type>::other { typedef typename _Alloc::template rebind<_Bit_type>::other _Bit_alloc_type; + + struct _Bvector_impl : public _Bit_alloc_type + { + _Bit_iterator _M_start; + _Bit_iterator _M_finish; + _Bit_type* _M_end_of_storage; + _Bvector_impl(const _Bit_alloc_type& __a) + : _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0) + { } + }; public: typedef _Alloc allocator_type; allocator_type get_allocator() const - { return *static_cast(this); } + { return *static_cast(&this->_M_impl); } - _Bvector_base(const allocator_type& __a) - : _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0) { } + _Bvector_base(const allocator_type& __a) : _M_impl(__a) { } ~_Bvector_base() { this->_M_deallocate(); } protected: + _Bvector_impl _M_impl; + _Bit_type* - _M_bit_alloc(size_t __n) - { return _Bit_alloc_type::allocate((__n + _S_word_bit - 1) - / _S_word_bit); } + _M_allocate(size_t __n) + { return _M_impl.allocate((__n + _S_word_bit - 1) / _S_word_bit); } void _M_deallocate() { - if (_M_start._M_p) - _Bit_alloc_type::deallocate(_M_start._M_p, - _M_end_of_storage - _M_start._M_p); + if (_M_impl._M_start._M_p) + _M_impl.deallocate(_M_impl._M_start._M_p, + _M_impl._M_end_of_storage - _M_impl._M_start._M_p); } - - _Bit_iterator _M_start; - _Bit_iterator _M_finish; - _Bit_type* _M_end_of_storage; }; -} // namespace __gnu_norm +} // namespace std // Declare a partial specialization of vector. #include -namespace __gnu_norm +namespace _GLIBCXX_STD { /** * @brief A specialization of vector for booleans which offers fixed time @@ -429,41 +435,40 @@ template { return _Bvector_base<_Alloc>::get_allocator(); } protected: - using _Bvector_base<_Alloc>::_M_bit_alloc; + using _Bvector_base<_Alloc>::_M_allocate; using _Bvector_base<_Alloc>::_M_deallocate; - using _Bvector_base<_Alloc>::_M_start; - using _Bvector_base<_Alloc>::_M_finish; - using _Bvector_base<_Alloc>::_M_end_of_storage; protected: void _M_initialize(size_type __n) { - _Bit_type* __q = this->_M_bit_alloc(__n); - this->_M_end_of_storage = __q + (__n + _S_word_bit - 1) / _S_word_bit; - this->_M_start = iterator(__q, 0); - this->_M_finish = this->_M_start + difference_type(__n); + _Bit_type* __q = this->_M_allocate(__n); + this->_M_impl._M_end_of_storage = __q + + (__n + _S_word_bit - 1) / _S_word_bit; + this->_M_impl._M_start = iterator(__q, 0); + this->_M_impl._M_finish = this->_M_start + difference_type(__n); } void _M_insert_aux(iterator __position, bool __x) { - if (this->_M_finish._M_p != this->_M_end_of_storage) + if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage) { - std::copy_backward(__position, this->_M_finish, this->_M_finish + 1); + std::copy_backward(__position, this->_M_impl._M_finish, + this->_M_impl._M_finish + 1); *__position = __x; - ++this->_M_finish; + ++this->_M_impl._M_finish; } else { const size_type __len = size() ? 2 * size() : static_cast(_S_word_bit); - _Bit_type * __q = this->_M_bit_alloc(__len); + _Bit_type * __q = this->_M_allocate(__len); iterator __i = std::copy(begin(), __position, iterator(__q, 0)); *__i++ = __x; - this->_M_finish = std::copy(__position, end(), __i); + this->_M_impl._M_finish = std::copy(__position, end(), __i); this->_M_deallocate(); - this->_M_end_of_storage = __q + (__len + _S_word_bit - 1) + this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1) / _S_word_bit; - this->_M_start = iterator(__q, 0); + this->_M_impl._M_start = iterator(__q, 0); } } @@ -471,9 +476,9 @@ template void _M_initialize_range(_InputIterator __first, _InputIterator __last, input_iterator_tag) { - this->_M_start = iterator(); - this->_M_finish = iterator(); - this->_M_end_of_storage = 0; + this->_M_impl._M_start = iterator(); + this->_M_impl._M_finish = iterator(); + this->_M_impl._M_end_of_storage = 0; for ( ; __first != __last; ++__first) push_back(*__first); } @@ -484,13 +489,12 @@ template { const size_type __n = std::distance(__first, __last); _M_initialize(__n); - std::copy(__first, __last, this->_M_start); + std::copy(__first, __last, this->_M_impl._M_start); } template - void _M_insert_range(iterator __pos, - _InputIterator __first, _InputIterator __last, - input_iterator_tag) + void _M_insert_range(iterator __pos, _InputIterator __first, + _InputIterator __last, input_iterator_tag) { for ( ; __first != __last; ++__first) { @@ -500,9 +504,8 @@ template } template - void _M_insert_range(iterator __position, - _ForwardIterator __first, _ForwardIterator __last, - forward_iterator_tag) + void _M_insert_range(iterator __position, _ForwardIterator __first, + _ForwardIterator __last, forward_iterator_tag) { if (__first != __last) { @@ -510,37 +513,37 @@ template if (capacity() - size() >= __n) { std::copy_backward(__position, end(), - this->_M_finish + difference_type(__n)); + this->_M_impl._M_finish + difference_type(__n)); std::copy(__first, __last, __position); - this->_M_finish += difference_type(__n); + this->_M_impl._M_finish += difference_type(__n); } else { const size_type __len = size() + std::max(size(), __n); - _Bit_type * __q = this->_M_bit_alloc(__len); + _Bit_type * __q = this->_M_allocate(__len); iterator __i = std::copy(begin(), __position, iterator(__q, 0)); __i = std::copy(__first, __last, __i); - this->_M_finish = std::copy(__position, end(), __i); + this->_M_impl._M_finish = std::copy(__position, end(), __i); this->_M_deallocate(); - this->_M_end_of_storage = __q + (__len + _S_word_bit - 1) - / _S_word_bit; - this->_M_start = iterator(__q, 0); + this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1) + / _S_word_bit; + this->_M_impl._M_start = iterator(__q, 0); } } } public: iterator begin() - { return this->_M_start; } + { return this->_M_impl._M_start; } const_iterator begin() const - { return this->_M_start; } + { return this->_M_impl._M_start; } iterator end() - { return this->_M_finish; } + { return this->_M_impl._M_finish; } const_iterator end() const - { return this->_M_finish; } + { return this->_M_impl._M_finish; } reverse_iterator rbegin() { return reverse_iterator(end()); } @@ -561,7 +564,7 @@ template { return size_type(-1); } size_type capacity() const - { return size_type(const_iterator(this->_M_end_of_storage, 0) + { return size_type(const_iterator(this->_M_impl._M_end_of_storage, 0) - begin()); } bool empty() const { return begin() == end(); } @@ -587,45 +590,49 @@ template explicit vector(const allocator_type& __a = allocator_type()) : _Bvector_base<_Alloc>(__a) { } - vector(size_type __n, bool __value, + vector(size_type __n, bool __value, const allocator_type& __a = allocator_type()) - : _Bvector_base<_Alloc>(__a) + : _Bvector_base<_Alloc>(__a) { _M_initialize(__n); - std::fill(this->_M_start._M_p, this->_M_end_of_storage, __value ? ~0 : 0); + std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage, + __value ? ~0 : 0); } explicit vector(size_type __n) - : _Bvector_base<_Alloc>(allocator_type()) + : _Bvector_base<_Alloc>(allocator_type()) { _M_initialize(__n); - std::fill(this->_M_start._M_p, this->_M_end_of_storage, 0); + std::fill(this->_M_impl._M_start._M_p, + this->_M_impl._M_end_of_storage, 0); } vector(const vector& __x) : _Bvector_base<_Alloc>(__x.get_allocator()) { _M_initialize(__x.size()); - std::copy(__x.begin(), __x.end(), this->_M_start); + std::copy(__x.begin(), __x.end(), this->_M_impl._M_start); } // Check whether it's an integral type. If so, it's not an iterator. - template void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) { _M_initialize(__n); - std::fill(this->_M_start._M_p, this->_M_end_of_storage, __x ? ~0 : 0); + std::fill(this->_M_impl._M_start._M_p, + this->_M_impl._M_end_of_storage, __x ? ~0 : 0); } template - void _M_initialize_dispatch(_InputIterator __first, _InputIterator __last, - __false_type) - { _M_initialize_range(__first, __last, std::__iterator_category(__first)); } + void + _M_initialize_dispatch(_InputIterator __first, _InputIterator __last, + __false_type) + { _M_initialize_range(__first, __last, + std::__iterator_category(__first)); } template - vector(_InputIterator __first, _InputIterator __last, - const allocator_type& __a = allocator_type()) - : _Bvector_base<_Alloc>(__a) + vector(_InputIterator __first, _InputIterator __last, + const allocator_type& __a = allocator_type()) + : _Bvector_base<_Alloc>(__a) { typedef typename _Is_integer<_InputIterator>::_Integral _Integral; _M_initialize_dispatch(__first, __last, _Integral()); @@ -643,7 +650,7 @@ template _M_initialize(__x.size()); } std::copy(__x.begin(), __x.end(), begin()); - this->_M_finish = begin() + difference_type(__x.size()); + this->_M_impl._M_finish = begin() + difference_type(__x.size()); return *this; } @@ -656,13 +663,15 @@ template { if (__n > size()) { - std::fill(this->_M_start._M_p, this->_M_end_of_storage, __x ? ~0 : 0); + std::fill(this->_M_impl._M_start._M_p, + this->_M_impl._M_end_of_storage, __x ? ~0 : 0); insert(end(), __n - size(), __x); } else { erase(begin() + __n, end()); - std::fill(this->_M_start._M_p, this->_M_end_of_storage, __x ? ~0 : 0); + std::fill(this->_M_impl._M_start._M_p, + this->_M_impl._M_end_of_storage, __x ? ~0 : 0); } } @@ -720,11 +729,12 @@ template __throw_length_error(__N("vector::reserve")); if (this->capacity() < __n) { - _Bit_type* __q = this->_M_bit_alloc(__n); - this->_M_finish = std::copy(begin(), end(), iterator(__q, 0)); + _Bit_type* __q = this->_M_allocate(__n); + this->_M_impl._M_finish = std::copy(begin(), end(), + iterator(__q, 0)); this->_M_deallocate(); - this->_M_start = iterator(__q, 0); - this->_M_end_of_storage = __q + (__n + _S_word_bit - 1) / _S_word_bit; + this->_M_impl._M_start = iterator(__q, 0); + this->_M_impl._M_end_of_storage = __q + (__n + _S_word_bit - 1) / _S_word_bit; } } @@ -742,17 +752,18 @@ template void push_back(bool __x) { - if (this->_M_finish._M_p != this->_M_end_of_storage) - *this->_M_finish++ = __x; + if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage) + *this->_M_impl._M_finish++ = __x; else _M_insert_aux(end(), __x); } void swap(vector& __x) { - std::swap(this->_M_start, __x._M_start); - std::swap(this->_M_finish, __x._M_finish); - std::swap(this->_M_end_of_storage, __x._M_end_of_storage); + std::swap(this->_M_impl._M_start, __x._M_impl._M_start); + std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); + std::swap(this->_M_impl._M_end_of_storage, + __x._M_impl._M_end_of_storage); } // [23.2.5]/1, third-to-last entry in synopsis listing @@ -766,9 +777,9 @@ template iterator insert(iterator __position, bool __x = bool()) { const difference_type __n = __position - begin(); - if (this->_M_finish._M_p != this->_M_end_of_storage + if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage && __position == end()) - *this->_M_finish++ = __x; + *this->_M_impl._M_finish++ = __x; else _M_insert_aux(__position, __x); return begin() + __n; @@ -803,22 +814,22 @@ template if (capacity() - size() >= __n) { std::copy_backward(__position, end(), - this->_M_finish + difference_type(__n)); + this->_M_impl._M_finish + difference_type(__n)); std::fill(__position, __position + difference_type(__n), __x); - this->_M_finish += difference_type(__n); + this->_M_impl._M_finish += difference_type(__n); } else { const size_type __len = size() + std::max(size(), __n); - _Bit_type * __q = this->_M_bit_alloc(__len); + _Bit_type * __q = this->_M_allocate(__len); iterator __i = std::copy(begin(), __position, iterator(__q, 0)); std::fill_n(__i, __n, __x); - this->_M_finish = std::copy(__position, end(), - __i + difference_type(__n)); + this->_M_impl._M_finish = std::copy(__position, end(), + __i + difference_type(__n)); this->_M_deallocate(); - this->_M_end_of_storage = __q + (__len + _S_word_bit - 1) - / _S_word_bit; - this->_M_start = iterator(__q, 0); + this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1) + / _S_word_bit; + this->_M_impl._M_start = iterator(__q, 0); } } @@ -826,19 +837,19 @@ template { _M_fill_insert(__position, __n, __x); } void pop_back() - { --this->_M_finish; } + { --this->_M_impl._M_finish; } iterator erase(iterator __position) { if (__position + 1 != end()) std::copy(__position + 1, end(), __position); - --this->_M_finish; + --this->_M_impl._M_finish; return __position; } iterator erase(iterator __first, iterator __last) { - this->_M_finish = std::copy(__last, end(), __first); + this->_M_impl._M_finish = std::copy(__last, end(), __first); return __first; } @@ -852,14 +863,14 @@ template void flip() { - for (_Bit_type * __p = this->_M_start._M_p; - __p != this->_M_end_of_storage; ++__p) + for (_Bit_type * __p = this->_M_impl._M_start._M_p; + __p != this->_M_impl._M_end_of_storage; ++__p) *__p = ~*__p; } void clear() { erase(begin(), end()); } }; -} // namespace __gnu_norm +} // namespace std #endif diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 5d237d5f3c15..c2f01a00d310 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -65,7 +65,7 @@ #include #include -namespace __gnu_norm +namespace _GLIBCXX_STD { /** * @if maint @@ -1496,6 +1496,6 @@ namespace __gnu_norm inline void swap(deque<_Tp,_Alloc>& __x, deque<_Tp,_Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _DEQUE_H */ diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index c0d821116c75..c94a0a9bf73b 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -63,7 +63,7 @@ #include -namespace __gnu_norm +namespace _GLIBCXX_STD { // Supporting structures are split into common and templated types; the // latter publicly inherits from the former in an effort to reduce code @@ -1247,7 +1247,7 @@ namespace __gnu_norm inline void swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _LIST_H */ diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index 3a563f174be4..bd78f57cdf90 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -63,7 +63,7 @@ #include -namespace __gnu_norm +namespace _GLIBCXX_STD { /** * @brief A standard container made up of (key,value) pairs, which can be @@ -689,6 +689,6 @@ namespace __gnu_norm inline void swap(map<_Key,_Tp,_Compare,_Alloc>& __x, map<_Key,_Tp,_Compare,_Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _MAP_H */ diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index cbc7b07a804c..c44aa74a6923 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -63,7 +63,7 @@ #include -namespace __gnu_norm +namespace _GLIBCXX_STD { // Forward declaration of operators < and ==, needed for friend declaration. @@ -673,6 +673,6 @@ namespace __gnu_norm swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x, multimap<_Key,_Tp,_Compare,_Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _MULTIMAP_H */ diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index 887899670b76..c82dee68e4ef 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -63,7 +63,7 @@ #include -namespace __gnu_norm +namespace _GLIBCXX_STD { // Forward declaration of operators < and ==, needed for friend declaration. @@ -580,6 +580,6 @@ namespace __gnu_norm multiset<_Key,_Compare,_Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _MULTISET_H */ diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index 28e1a3ceb30d..bb28bddc7af9 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -63,7 +63,7 @@ #include -namespace __gnu_norm +namespace _GLIBCXX_STD { // Forward declarations of operators < and ==, needed for friend declaration. template, @@ -588,6 +588,6 @@ namespace __gnu_norm swap(set<_Key,_Compare,_Alloc>& __x, set<_Key,_Compare,_Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _SET_H */ diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 10adb6368bed..b025393a7418 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -65,7 +65,7 @@ #include #include -namespace __gnu_norm +namespace _GLIBCXX_STD { /** * @if maint @@ -927,6 +927,6 @@ namespace __gnu_norm inline void swap(vector<_Tp,_Alloc>& __x, vector<_Tp,_Alloc>& __y) { __x.swap(__y); } -} // namespace __gnu_norm +} // namespace std #endif /* _VECTOR_H */ diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index dd459a53431b..abd1ba76250e 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -61,7 +61,7 @@ #ifndef _VECTOR_TCC #define _VECTOR_TCC 1 -namespace __gnu_norm +namespace _GLIBCXX_STD { template void @@ -409,6 +409,6 @@ namespace __gnu_norm } } } -} // namespace __gnu_norm +} // namespace std #endif /* _VECTOR_TCC */ diff --git a/libstdc++-v3/include/debug/bitset b/libstdc++-v3/include/debug/bitset index 1d8875aaa8ac..2e2364ff9300 100644 --- a/libstdc++-v3/include/debug/bitset +++ b/libstdc++-v3/include/debug/bitset @@ -1,6 +1,6 @@ // Debugging bitset implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -39,9 +39,10 @@ namespace __gnu_debug_def { template class bitset - : public __gnu_norm::bitset<_Nb>, public __gnu_debug::_Safe_sequence_base + : public _GLIBCXX_STD::bitset<_Nb>, + public __gnu_debug::_Safe_sequence_base { - typedef __gnu_norm::bitset<_Nb> _Base; + typedef _GLIBCXX_STD::bitset<_Nb> _Base; typedef __gnu_debug::_Safe_sequence_base _Safe_base; public: diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque index ed68b37a7986..c39a49c04610 100644 --- a/libstdc++-v3/include/debug/deque +++ b/libstdc++-v3/include/debug/deque @@ -1,6 +1,6 @@ // Debugging deque implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -39,10 +39,10 @@ namespace __gnu_debug_def { template > class deque - : public __gnu_norm::deque<_Tp, _Allocator>, - public __gnu_debug::_Safe_sequence > + : public _GLIBCXX_STD::deque<_Tp, _Allocator>, + public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::deque<_Tp, _Allocator> _Base; + typedef _GLIBCXX_STD::deque<_Tp, _Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; public: diff --git a/libstdc++-v3/include/debug/formatter.h b/libstdc++-v3/include/debug/formatter.h index 6ed00bd868e6..7022fa700777 100644 --- a/libstdc++-v3/include/debug/formatter.h +++ b/libstdc++-v3/include/debug/formatter.h @@ -1,6 +1,6 @@ // Debug-mode error formatting implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -36,7 +36,7 @@ namespace __gnu_debug { - using namespace std; + using std::type_info; /** Determine if the two types are the same. */ template diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index f9bb9f9435cc..556c9d9acff7 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -1,6 +1,6 @@ // Debugging list implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -40,10 +40,10 @@ namespace __gnu_debug_def { template > class list - : public __gnu_norm::list<_Tp, _Allocator>, + : public _GLIBCXX_STD::list<_Tp, _Allocator>, public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::list<_Tp, _Allocator> _Base; + typedef _GLIBCXX_STD::list<_Tp, _Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; public: @@ -76,7 +76,7 @@ namespace __gnu_debug_def template list(_InputIterator __first, _InputIterator __last, const _Allocator& __a = _Allocator()) - : _Base(__gnu_debug::__check_valid_range(__first, __last), __last, __a) + : _Base(__gnu_debug::__check_valid_range(__first, __last), __last, __a) { } diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index 9470e667434e..2a6794b31e0e 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -1,6 +1,6 @@ // Debugging map implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -40,10 +40,10 @@ namespace __gnu_debug_def template, typename _Allocator = std::allocator > > class map - : public __gnu_norm::map<_Key, _Tp, _Compare, _Allocator>, + : public _GLIBCXX_STD::map<_Key, _Tp, _Compare, _Allocator>, public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::map<_Key, _Tp, _Compare, _Allocator> _Base; + typedef _GLIBCXX_STD::map<_Key, _Tp, _Compare, _Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; public: diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index 3772c31dc698..4de1e3b58f47 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -1,6 +1,6 @@ // Debugging multimap implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -40,10 +40,10 @@ namespace __gnu_debug_def template, typename _Allocator = std::allocator > > class multimap - : public __gnu_norm::multimap<_Key, _Tp, _Compare, _Allocator>, + : public _GLIBCXX_STD::multimap<_Key, _Tp, _Compare, _Allocator>, public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::multimap<_Key, _Tp, _Compare, _Allocator> _Base; + typedef _GLIBCXX_STD::multimap<_Key, _Tp, _Compare, _Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; public: diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index 19bc29a960a8..92042fef68ce 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -1,6 +1,6 @@ // Debugging multiset implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -40,10 +40,10 @@ namespace __gnu_debug_def template, typename _Allocator = std::allocator<_Key> > class multiset - : public __gnu_norm::multiset<_Key, _Compare, _Allocator>, + : public _GLIBCXX_STD::multiset<_Key, _Compare, _Allocator>, public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::multiset<_Key, _Compare, _Allocator> _Base; + typedef _GLIBCXX_STD::multiset<_Key, _Compare, _Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; public: diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 72ba3b52f10b..7482d6caa659 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -1,6 +1,6 @@ // Safe iterator implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -38,6 +38,9 @@ namespace __gnu_debug { + using std::iterator_traits; + using std::pair; + /** Iterators that derive from _Safe_iterator_base but that aren't * _Safe_iterators can be determined singular or non-singular via * _Safe_iterator_base. diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index b9200adf233c..8656cb0aff67 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -1,6 +1,6 @@ // Debugging set implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -40,10 +40,10 @@ namespace __gnu_debug_def template, typename _Allocator = std::allocator<_Key> > class set - : public __gnu_norm::set<_Key,_Compare,_Allocator>, + : public _GLIBCXX_STD::set<_Key,_Compare,_Allocator>, public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::set<_Key,_Compare,_Allocator> _Base; + typedef _GLIBCXX_STD::set<_Key,_Compare,_Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; public: diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index f7fa3e8f092e..0cc2997b9754 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -1,6 +1,6 @@ // Debugging vector implementation -*- C++ -*- -// Copyright (C) 2003 +// Copyright (C) 2003, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -41,10 +41,10 @@ namespace __gnu_debug_def template > class vector - : public __gnu_norm::vector<_Tp, _Allocator>, + : public _GLIBCXX_STD::vector<_Tp, _Allocator>, public __gnu_debug::_Safe_sequence > { - typedef __gnu_norm::vector<_Tp, _Allocator> _Base; + typedef _GLIBCXX_STD::vector<_Tp, _Allocator> _Base; typedef __gnu_debug::_Safe_sequence _Safe_base; typedef typename _Base::const_iterator _Base_const_iterator; diff --git a/libstdc++-v3/include/std/std_bitset.h b/libstdc++-v3/include/std/std_bitset.h index 04249eca4f89..fba62c15bcac 100644 --- a/libstdc++-v3/include/std/std_bitset.h +++ b/libstdc++-v3/include/std/std_bitset.h @@ -59,12 +59,11 @@ #include // For ostream (operator<<) #include // For istream (operator>>) - #define _GLIBCXX_BITSET_BITS_PER_WORD numeric_limits::digits #define _GLIBCXX_BITSET_WORDS(__n) \ ((__n) < 1 ? 0 : ((__n) + _GLIBCXX_BITSET_BITS_PER_WORD - 1)/_GLIBCXX_BITSET_BITS_PER_WORD) -namespace __gnu_norm +namespace _GLIBCXX_STD { /** * @if maint @@ -1218,7 +1217,7 @@ namespace __gnu_norm return __os << __tmp; } //@} -} // namespace __gnu_norm +} // namespace std #undef _GLIBCXX_BITSET_WORDS #undef _GLIBCXX_BITSET_BITS_PER_WORD diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am index d70d1af3ad13..ed4c71079010 100644 --- a/libstdc++-v3/src/Makefile.am +++ b/libstdc++-v3/src/Makefile.am @@ -101,6 +101,7 @@ sources = \ complex_io.cc \ ctype.cc \ debug.cc \ + debug_list.cc \ functexcept.cc \ globals_locale.cc \ globals_io.cc \ diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index 9c4f48330ca6..aa192c2b1e2e 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -59,12 +59,12 @@ am__objects_1 = atomicity.lo codecvt_members.lo collate_members.lo \ numeric_members.lo time_members.lo am__objects_2 = basic_file.lo c++locale.lo am__objects_3 = allocator.lo codecvt.lo complex_io.lo ctype.lo \ - debug.lo functexcept.lo globals_locale.lo globals_io.lo ios.lo \ - ios_failure.lo ios_init.lo ios_locale.lo limits.lo list.lo \ - locale.lo locale_init.lo locale_facets.lo localename.lo \ - stdexcept.lo strstream.lo tree.lo allocator-inst.lo \ - concept-inst.lo fstream-inst.lo ext-inst.lo io-inst.lo \ - istream-inst.lo locale-inst.lo locale-misc-inst.lo \ + debug.lo debug_list.lo functexcept.lo globals_locale.lo \ + globals_io.lo ios.lo ios_failure.lo ios_init.lo ios_locale.lo \ + limits.lo list.lo locale.lo locale_init.lo locale_facets.lo \ + localename.lo stdexcept.lo strstream.lo tree.lo \ + allocator-inst.lo concept-inst.lo fstream-inst.lo ext-inst.lo \ + io-inst.lo istream-inst.lo locale-inst.lo locale-misc-inst.lo \ misc-inst.lo ostream-inst.lo sstream-inst.lo streambuf-inst.lo \ string-inst.lo valarray-inst.lo wlocale-inst.lo \ wstring-inst.lo $(am__objects_1) $(am__objects_2) @@ -299,6 +299,7 @@ sources = \ complex_io.cc \ ctype.cc \ debug.cc \ + debug_list.cc \ functexcept.cc \ globals_locale.cc \ globals_io.cc \ diff --git a/libstdc++-v3/src/debug_list.cc b/libstdc++-v3/src/debug_list.cc new file mode 100644 index 000000000000..3d14b28f4b9e --- /dev/null +++ b/libstdc++-v3/src/debug_list.cc @@ -0,0 +1,34 @@ +// Debugging mode support code for list -*- C++ -*- + +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#define _GLIBCXX_DEBUG + +#include + +#include "list.cc" diff --git a/libstdc++-v3/src/list.cc b/libstdc++-v3/src/list.cc index 2be2d7131938..ec94053b4111 100644 --- a/libstdc++-v3/src/list.cc +++ b/libstdc++-v3/src/list.cc @@ -55,7 +55,7 @@ #include -namespace __gnu_norm +namespace _GLIBCXX_STD { void _List_node_base::swap(_List_node_base& __x, _List_node_base& __y) @@ -121,7 +121,7 @@ namespace __gnu_norm } void - _List_node_base::hook(_List_node_base * const __position) + _List_node_base::hook(_List_node_base* const __position) { this->_M_next = __position; this->_M_prev = __position->_M_prev; @@ -137,5 +137,5 @@ namespace __gnu_norm __prev_node->_M_next = __next_node; __next_node->_M_prev = __prev_node; } -} // namespace __gnu_norm +} // namespace std diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/clear_allocator.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/clear_allocator.cc new file mode 100644 index 000000000000..ff1771626748 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/clear_allocator.cc @@ -0,0 +1,88 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +#include +#include + +using namespace std; +using __gnu_cxx::new_allocator; + +template + class clear_alloc : public new_allocator + { + public: + + template + struct rebind + { typedef clear_alloc other; }; + + virtual void clear() throw() + { } + + clear_alloc() throw() + { } + + clear_alloc(clear_alloc const& _wa) throw() + { } + + template + clear_alloc(clear_alloc const& _wa) throw() + { } + + virtual ~clear_alloc() throw() + { this->clear(); } + + T* allocate(typename new_allocator::size_type n, const void *hint = 0) + { + this->clear(); + return new_allocator::allocate(n, hint); + } + + void deallocate(T *ptr, typename new_allocator::size_type n) + { + this->clear(); + new_allocator::deallocate(ptr, n); + } + }; + +template + void Check_Container() + { + Container* pic = new Container; + int x = 230; + + while (x--) + { + pic->push_back(x); + } + + pic->get_allocator(); + + // The following has led to infinite recursions or cores. + pic->clear(); + + delete pic; + } + + +int main() +{ + Check_Container > >(); + return 0; +} + -- 2.39.5