1// Copyright (C) 2004-2015 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