malloc_allocator.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _MALLOC_ALLOCATOR_H
00031 #define _MALLOC_ALLOCATOR_H 1
00032
00033 #include <cstdlib>
00034 #include <new>
00035 #include <bits/functexcept.h>
00036 #include <bits/move.h>
00037
00038 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
00039
00040 using std::size_t;
00041 using std::ptrdiff_t;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 template<typename _Tp>
00052 class malloc_allocator
00053 {
00054 public:
00055 typedef size_t size_type;
00056 typedef ptrdiff_t difference_type;
00057 typedef _Tp* pointer;
00058 typedef const _Tp* const_pointer;
00059 typedef _Tp& reference;
00060 typedef const _Tp& const_reference;
00061 typedef _Tp value_type;
00062
00063 template<typename _Tp1>
00064 struct rebind
00065 { typedef malloc_allocator<_Tp1> other; };
00066
00067 malloc_allocator() throw() { }
00068
00069 malloc_allocator(const malloc_allocator&) throw() { }
00070
00071 template<typename _Tp1>
00072 malloc_allocator(const malloc_allocator<_Tp1>&) throw() { }
00073
00074 ~malloc_allocator() throw() { }
00075
00076 pointer
00077 address(reference __x) const { return &__x; }
00078
00079 const_pointer
00080 address(const_reference __x) const { return &__x; }
00081
00082
00083
00084 pointer
00085 allocate(size_type __n, const void* = 0)
00086 {
00087 if (__builtin_expect(__n > this->max_size(), false))
00088 std::__throw_bad_alloc();
00089
00090 pointer __ret = static_cast<_Tp*>(std::malloc(__n * sizeof(_Tp)));
00091 if (!__ret)
00092 std::__throw_bad_alloc();
00093 return __ret;
00094 }
00095
00096
00097 void
00098 deallocate(pointer __p, size_type)
00099 { std::free(static_cast<void*>(__p)); }
00100
00101 size_type
00102 max_size() const throw()
00103 { return size_t(-1) / sizeof(_Tp); }
00104
00105
00106
00107 void
00108 construct(pointer __p, const _Tp& __val)
00109 { ::new((void *)__p) value_type(__val); }
00110
00111 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00112 template<typename... _Args>
00113 void
00114 construct(pointer __p, _Args&&... __args)
00115 { ::new((void *)__p) _Tp(std::forward<_Args>(__args)...); }
00116 #endif
00117
00118 void
00119 destroy(pointer __p) { __p->~_Tp(); }
00120 };
00121
00122 template<typename _Tp>
00123 inline bool
00124 operator==(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&)
00125 { return true; }
00126
00127 template<typename _Tp>
00128 inline bool
00129 operator!=(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&)
00130 { return false; }
00131
00132 _GLIBCXX_END_NAMESPACE
00133
00134 #endif