diff options
author | Howard Hinnant <hhinnant@apple.com> | 2010-05-11 23:42:16 +0400 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2010-05-11 23:42:16 +0400 |
commit | 3e519524c118651123eecf60c2bbc5d65ad9bac3 (patch) | |
tree | b2dd4168cfe448920a602cd7d2e40f95da187153 /libcxx/include/__sso_allocator | |
parent | 9132c59d43b6c590c9bb33496eebf9f192d6857a (diff) |
libcxx initial import
llvm-svn: 103490
Diffstat (limited to 'libcxx/include/__sso_allocator')
-rw-r--r-- | libcxx/include/__sso_allocator | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/libcxx/include/__sso_allocator b/libcxx/include/__sso_allocator new file mode 100644 index 000000000000..6f5a75fbd739 --- /dev/null +++ b/libcxx/include/__sso_allocator @@ -0,0 +1,73 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___SSO_ALLOCATOR +#define _LIBCPP___SSO_ALLOCATOR + +#include <__config> +#include <type_traits> +#include <new> + +#pragma GCC system_header + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, size_t _N> class _LIBCPP_HIDDEN __sso_allocator; + +template <size_t _N> +class _LIBCPP_HIDDEN __sso_allocator<void, _N> +{ +public: + typedef const void* const_pointer; + typedef void value_type; +}; + +template <class _Tp, size_t _N> +class _LIBCPP_HIDDEN __sso_allocator +{ + typename aligned_storage<sizeof(_Tp) * _N>::type buf_; + bool __allocated_; +public: + typedef size_t size_type; + typedef _Tp* pointer; + typedef _Tp value_type; + + _LIBCPP_INLINE_VISIBILITY __sso_allocator() throw() : __allocated_(false) {} + _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator&) throw() : __allocated_(false) {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator<_Up, _N>&) throw() + : __allocated_(false) {} +private: + __sso_allocator& operator=(const __sso_allocator&); +public: + _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, typename __sso_allocator<void, _N>::const_pointer = 0) + { + if (!__allocated_ && __n <= _N) + { + __allocated_ = true; + return (pointer)&buf_; + } + return static_cast<pointer>(::operator new(__n * sizeof(_Tp))); + } + _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) + { + if (__p == (pointer)&buf_) + __allocated_ = false; + else + ::operator delete(__p); + } + _LIBCPP_INLINE_VISIBILITY size_type max_size() const throw() {return size_type(~0) / sizeof(_Tp);} + + bool operator==(__sso_allocator& __a) const {return &buf_ == &__a.buf_;} + bool operator!=(__sso_allocator& __a) const {return &buf_ != &__a.buf_;} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___SSO_ALLOCATOR |