OSDN Git Service

Licensing changes to GPLv3 resp. GPLv3 with GCC Runtime Exception.
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / testsuite / 23_containers / vector / cons / clear_allocator.cc
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 <vector>
19 #include <ext/new_allocator.h>
20
21 using namespace std;
22 using __gnu_cxx::new_allocator;
23
24 template<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
62 template<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
82 int main()
83 {
84   Check_Container<std::vector<int, clear_alloc<int> > >();
85   return 0;
86 }
87