1// Copyright (C) 2004, 2009 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18#include <deque> 19#include <ext/new_allocator.h> 20 21using namespace std; 22using __gnu_cxx::new_allocator; 23 24template<typename T> 25 class clear_alloc : public new_allocator<T> 26 { 27 public: 28 29 template <typename T1> 30 struct rebind 31 { typedef clear_alloc<T1> other; }; 32 33 virtual void clear() throw() 34 { } 35 36 clear_alloc() throw() 37 { } 38 39 clear_alloc(clear_alloc const&) throw() : new_allocator<T>() 40 { } 41 42 template<typename T1> 43 clear_alloc(clear_alloc<T1> const&) throw() 44 { } 45 46 virtual ~clear_alloc() throw() 47 { this->clear(); } 48 49 T* allocate(typename new_allocator<T>::size_type n, const void *hint = 0) 50 { 51 this->clear(); 52 return new_allocator<T>::allocate(n, hint); 53 } 54 55 void deallocate(T *ptr, typename new_allocator<T>::size_type n) 56 { 57 this->clear(); 58 new_allocator<T>::deallocate(ptr, n); 59 } 60 }; 61 62template<typename Container> 63 void Check_Container() 64 { 65 Container* pic = new Container; 66 int x = 230; 67 68 while (x--) 69 { 70 pic->push_back(x); 71 } 72 73 pic->get_allocator(); 74 75 // The following has led to infinite recursions or cores. 76 pic->clear(); 77 78 delete pic; 79 } 80 81 82int main() 83{ 84 Check_Container<std::deque<int, clear_alloc<int> > >(); 85 return 0; 86} 87 88