2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP_SSO_ALLOCATOR_H
11 #define _LIBCPP_SSO_ALLOCATOR_H
16 #include <type_traits>
18 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19 #pragma GCC system_header
22 _LIBCPP_BEGIN_NAMESPACE_STD
24 template <class _Tp
, size_t _Np
> class _LIBCPP_HIDDEN __sso_allocator
;
27 class _LIBCPP_HIDDEN __sso_allocator
<void, _Np
>
30 typedef const void* const_pointer
;
31 typedef void value_type
;
34 template <class _Tp
, size_t _Np
>
35 class _LIBCPP_HIDDEN __sso_allocator
37 typename aligned_storage
<sizeof(_Tp
) * _Np
>::type buf_
;
40 typedef size_t size_type
;
42 typedef _Tp value_type
;
46 using other
= __sso_allocator
<U
, _Np
>;
49 _LIBCPP_INLINE_VISIBILITY
__sso_allocator() throw() : __allocated_(false) {}
50 _LIBCPP_INLINE_VISIBILITY
__sso_allocator(const __sso_allocator
&) throw() : __allocated_(false) {}
51 template <class _Up
> _LIBCPP_INLINE_VISIBILITY
__sso_allocator(const __sso_allocator
<_Up
, _Np
>&) throw()
52 : __allocated_(false) {}
54 __sso_allocator
& operator=(const __sso_allocator
&);
56 _LIBCPP_INLINE_VISIBILITY pointer
allocate(size_type __n
, typename __sso_allocator
<void, _Np
>::const_pointer
= nullptr)
58 if (!__allocated_
&& __n
<= _Np
)
61 return (pointer
)&buf_
;
63 return allocator
<_Tp
>().allocate(__n
);
65 _LIBCPP_INLINE_VISIBILITY
void deallocate(pointer __p
, size_type __n
)
67 if (__p
== (pointer
)&buf_
)
70 allocator
<_Tp
>().deallocate(__p
, __n
);
72 _LIBCPP_INLINE_VISIBILITY size_type
max_size() const throw() {return size_type(~0) / sizeof(_Tp
);}
74 _LIBCPP_INLINE_VISIBILITY
75 bool operator==(const __sso_allocator
& __a
) const {return &buf_
== &__a
.buf_
;}
76 _LIBCPP_INLINE_VISIBILITY
77 bool operator!=(const __sso_allocator
& __a
) const {return &buf_
!= &__a
.buf_
;}
80 _LIBCPP_END_NAMESPACE_STD
82 #endif // _LIBCPP_SSO_ALLOCATOR_H