1// Copyright (C) 2004 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 2, 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 COPYING.  If not, write to the Free
16// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17// USA.
18
19#include <deque>
20#include <ext/new_allocator.h>
21
22using namespace std;
23using __gnu_cxx::new_allocator;
24
25template<typename T>
26  class clear_alloc : public new_allocator<T>
27  {
28  public:
29
30    template <typename T1>
31      struct rebind
32      { typedef clear_alloc<T1> other; };
33
34    virtual void clear() throw()
35    { }
36
37    clear_alloc() throw()
38    { }
39
40    clear_alloc(clear_alloc const&) throw() : new_allocator<T>()
41    { }
42
43    template<typename T1>
44    clear_alloc(clear_alloc<T1> const&) throw()
45      { }
46
47    virtual ~clear_alloc() throw()
48    { this->clear(); }
49
50    T* allocate(typename new_allocator<T>::size_type n, const void *hint = 0)
51    {
52      this->clear();
53      return new_allocator<T>::allocate(n, hint);
54    }
55
56    void deallocate(T *ptr, typename new_allocator<T>::size_type n)
57    {
58      this->clear();
59      new_allocator<T>::deallocate(ptr, n);
60    }
61  };
62
63template<typename Container>
64  void Check_Container()
65  {
66    Container* pic = new Container;
67    int x = 230;
68
69    while (x--)
70      {
71	pic->push_back(x);
72      }
73
74    pic->get_allocator();
75
76    // The following has led to infinite recursions or cores.
77    pic->clear();
78
79    delete pic;
80  }
81
82
83int main()
84{
85  Check_Container<std::deque<int, clear_alloc<int> > >();
86  return 0;
87}
88
89