OLD | NEW |
(Empty) | |
| 1 // -*- C++ -*- |
| 2 //===----------------------------------------------------------------------===// |
| 3 // |
| 4 // The LLVM Compiler Infrastructure |
| 5 // |
| 6 // This file is dual licensed under the MIT and the University of Illinois Open |
| 7 // Source Licenses. See LICENSE.TXT for details. |
| 8 // |
| 9 //===----------------------------------------------------------------------===// |
| 10 |
| 11 #ifndef _LIBCPP___SSO_ALLOCATOR |
| 12 #define _LIBCPP___SSO_ALLOCATOR |
| 13 |
| 14 #include <__config> |
| 15 #include <type_traits> |
| 16 #include <new> |
| 17 |
| 18 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
| 19 #pragma GCC system_header |
| 20 #endif |
| 21 |
| 22 _LIBCPP_BEGIN_NAMESPACE_STD |
| 23 |
| 24 template <class _Tp, size_t _Np> class _LIBCPP_HIDDEN __sso_allocator; |
| 25 |
| 26 template <size_t _Np> |
| 27 class _LIBCPP_HIDDEN __sso_allocator<void, _Np> |
| 28 { |
| 29 public: |
| 30 typedef const void* const_pointer; |
| 31 typedef void value_type; |
| 32 }; |
| 33 |
| 34 template <class _Tp, size_t _Np> |
| 35 class _LIBCPP_HIDDEN __sso_allocator |
| 36 { |
| 37 typename aligned_storage<sizeof(_Tp) * _Np>::type buf_; |
| 38 bool __allocated_; |
| 39 public: |
| 40 typedef size_t size_type; |
| 41 typedef _Tp* pointer; |
| 42 typedef _Tp value_type; |
| 43 |
| 44 _LIBCPP_INLINE_VISIBILITY __sso_allocator() throw() : __allocated_(false) {} |
| 45 _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator&) throw() :
__allocated_(false) {} |
| 46 template <class _Up> _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_a
llocator<_Up, _Np>&) throw() |
| 47 : __allocated_(false) {} |
| 48 private: |
| 49 __sso_allocator& operator=(const __sso_allocator&); |
| 50 public: |
| 51 _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, typename __sso_all
ocator<void, _Np>::const_pointer = 0) |
| 52 { |
| 53 if (!__allocated_ && __n <= _Np) |
| 54 { |
| 55 __allocated_ = true; |
| 56 return (pointer)&buf_; |
| 57 } |
| 58 return static_cast<pointer>(::operator new(__n * sizeof(_Tp))); |
| 59 } |
| 60 _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) |
| 61 { |
| 62 if (__p == (pointer)&buf_) |
| 63 __allocated_ = false; |
| 64 else |
| 65 ::operator delete(__p); |
| 66 } |
| 67 _LIBCPP_INLINE_VISIBILITY size_type max_size() const throw() {return size_ty
pe(~0) / sizeof(_Tp);} |
| 68 |
| 69 _LIBCPP_INLINE_VISIBILITY |
| 70 bool operator==(__sso_allocator& __a) const {return &buf_ == &__a.buf_;} |
| 71 _LIBCPP_INLINE_VISIBILITY |
| 72 bool operator!=(__sso_allocator& __a) const {return &buf_ != &__a.buf_;} |
| 73 }; |
| 74 |
| 75 _LIBCPP_END_NAMESPACE_STD |
| 76 |
| 77 #endif // _LIBCPP___SSO_ALLOCATOR |
OLD | NEW |