// array allocator -*- C++ -*-
-// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005, 2006 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
class array_allocator_base
{
public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
pointer
address(reference __x) const { return &__x; }
class array_allocator : public array_allocator_base<_Tp>
{
public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp value_type;
-
- typedef _Array array_type;
-
- array_type* _M_array;
-
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ typedef _Array array_type;
+
+ private:
+ array_type* _M_array;
+ size_type _M_used;
+
+ public:
template<typename _Tp1, typename _Array1 = _Array>
struct rebind
{ typedef array_allocator<_Tp1, _Array1> other; };
array_allocator(array_type* __array = NULL) throw()
- : _M_array(__array)
- { }
+ : _M_array(__array), _M_used(size_type()) { }
array_allocator(const array_allocator& __o) throw()
- : _M_array(__o._M_array) { }
+ : _M_array(__o._M_array), _M_used(__o._M_used) { }
template<typename _Tp1, typename _Array1>
array_allocator(const array_allocator<_Tp1, _Array1>&) throw()
- : _M_array(NULL) { }
+ : _M_array(NULL), _M_used(size_type()) { }
~array_allocator() throw() { }
pointer
allocate(size_type __n, const void* = 0)
{
- static size_type __array_used;
- if (_M_array == 0 || __array_used + __n > _M_array->size())
+ if (_M_array == 0 || _M_used + __n > _M_array->size())
std::__throw_bad_alloc();
- pointer __ret = _M_array->begin() + __array_used;
- __array_used += __n;
+ pointer __ret = _M_array->begin() + _M_used;
+ _M_used += __n;
return __ret;
}
};
--- /dev/null
+//
+// Copyright (C) 2006 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+#include <ext/array_allocator.h>
+
+// libstdc++/26875
+int main()
+{
+ typedef std::tr1::array<int, 1> array_type;
+ array_type Array1;
+ array_type Array2;
+
+ typedef __gnu_cxx::array_allocator<int> allocator_type;
+ allocator_type Allocator1(&Array1);
+ allocator_type Allocator2(&Array2);
+
+ try
+ {
+ Allocator1.allocate(1);
+ Allocator2.allocate(1);
+ }
+ catch (std::bad_alloc& ex)
+ {
+ // fail, rethrow
+ throw;
+ }
+
+ return 0;
+}
+