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 _NEW_ALLOCATOR_H
00031 #define _NEW_ALLOCATOR_H 1
00032
00033 #include <bits/c++config.h>
00034 #include <new>
00035 #include <bits/functexcept.h>
00036 #include <bits/move.h>
00037
00038 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
00039 {
00040 _GLIBCXX_BEGIN_NAMESPACE_VERSION
00041
00042 using std::size_t;
00043 using std::ptrdiff_t;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 template<typename _Tp>
00054 class new_allocator
00055 {
00056 public:
00057 typedef size_t size_type;
00058 typedef ptrdiff_t difference_type;
00059 typedef _Tp* pointer;
00060 typedef const _Tp* const_pointer;
00061 typedef _Tp& reference;
00062 typedef const _Tp& const_reference;
00063 typedef _Tp value_type;
00064
00065 template<typename _Tp1>
00066 struct rebind
00067 { typedef new_allocator<_Tp1> other; };
00068
00069 new_allocator() throw() { }
00070
00071 new_allocator(const new_allocator&) throw() { }
00072
00073 template<typename _Tp1>
00074 new_allocator(const new_allocator<_Tp1>&) throw() { }
00075
00076 ~new_allocator() throw() { }
00077
00078 pointer
00079 address(reference __x) const { return std::__addressof(__x); }
00080
00081 const_pointer
00082 address(const_reference __x) const { return std::__addressof(__x); }
00083
00084
00085
00086 pointer
00087 allocate(size_type __n, const void* = 0)
00088 {
00089 if (__n > this->max_size())
00090 std::__throw_bad_alloc();
00091
00092 return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
00093 }
00094
00095
00096 void
00097 deallocate(pointer __p, size_type)
00098 { ::operator delete(__p); }
00099
00100 size_type
00101 max_size() const throw()
00102 { return size_t(-1) / sizeof(_Tp); }
00103
00104
00105
00106 void
00107 construct(pointer __p, const _Tp& __val)
00108 { ::new((void *)__p) _Tp(__val); }
00109
00110 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00111 template<typename... _Args>
00112 void
00113 construct(pointer __p, _Args&&... __args)
00114 { ::new((void *)__p) _Tp(std::forward<_Args>(__args)...); }
00115 #endif
00116
00117 void
00118 destroy(pointer __p) { __p->~_Tp(); }
00119 };
00120
00121 template<typename _Tp>
00122 inline bool
00123 operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
00124 { return true; }
00125
00126 template<typename _Tp>
00127 inline bool
00128 operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
00129 { return false; }
00130
00131 _GLIBCXX_END_NAMESPACE_VERSION
00132 }
00133
00134 #endif