// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. 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);}

    _LIBCPP_INLINE_VISIBILITY
    bool operator==(__sso_allocator& __a) const {return &buf_ == &__a.buf_;}
    _LIBCPP_INLINE_VISIBILITY
    bool operator!=(__sso_allocator& __a) const {return &buf_ != &__a.buf_;}
};

_LIBCPP_END_NAMESPACE_STD

#endif  // _LIBCPP___SSO_ALLOCATOR
