OSDN Git Service

2006-09-20 Benjamin Kosnik <bkoz@redhat.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / ext / malloc_allocator.h
index 5545a58..0f23e06 100644 (file)
@@ -1,6 +1,6 @@
 // Allocator that wraps "C" malloc -*- C++ -*-
 
-// Copyright (C) 2001, 2002, 2003 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
@@ -15,7 +15,7 @@
 
 // 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 <memory>
+#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
@@ -78,12 +84,20 @@ namespace __gnu_cxx
       // NB: __n is permitted to be 0.  The C++ standard says nothing
       // about what the return value is when __n == 0.
       pointer
-      allocate(size_type __n, std::allocator<void>::const_pointer __h = 0)
-      { return static_cast<_Tp*>(malloc(__n * sizeof(_Tp))); }
+      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)
+         std::__throw_bad_alloc();
+       return __ret;
+      }
 
       // __p is not permitted to be a null pointer.
       void
-      deallocate(pointer __p, size_type __n)
+      deallocate(pointer __p, size_type)
       { free(static_cast<void*>(__p)); }
 
       size_type
@@ -94,11 +108,22 @@ namespace __gnu_cxx
       // 402. wrong new expression in [some_] allocator::construct
       void 
       construct(pointer __p, const _Tp& __val) 
-      { *__p = __val; }
+      { ::new(__p) value_type(__val); }
 
       void 
       destroy(pointer __p) { __p->~_Tp(); }
     };
-} // namespace __gnu_cxx
+
+  template<typename _Tp>
+    inline bool
+    operator==(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&)
+    { return true; }
+  
+  template<typename _Tp>
+    inline bool
+    operator!=(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&)
+    { return false; }
+
+_GLIBCXX_END_NAMESPACE
 
 #endif