// Allocator that wraps "C" malloc -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005 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
// 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.
// As a special exception, you may use this file as part of a free software
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
+/** @file ext/malloc_allocator.h
+ * This file is a GNU extension to the Standard C++ Library.
+ */
+
#ifndef _MALLOC_ALLOCATOR_H
#define _MALLOC_ALLOCATOR_H 1
+#include <cstdlib>
#include <new>
+#include <bits/functexcept.h>
+
+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+
+ using std::size_t;
+ using std::ptrdiff_t;
-namespace __gnu_cxx
-{
/**
- * @brief An allocator that uses malloc
+ * @brief An allocator that uses malloc.
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls malloc
* - all deallocation calls free
- *
- * (See @link Allocators allocators info @endlink for more.)
*/
template<typename _Tp>
class malloc_allocator
pointer
allocate(size_type __n, const void* = 0)
{
+ if (__builtin_expect(__n > this->max_size(), false))
+ std::__throw_bad_alloc();
+
pointer __ret = static_cast<_Tp*>(malloc(__n * sizeof(_Tp)));
if (!__ret)
- throw std::bad_alloc();
+ std::__throw_bad_alloc();
return __ret;
}
inline bool
operator!=(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&)
{ return false; }
-} // namespace __gnu_cxx
+
+_GLIBCXX_END_NAMESPACE
#endif