98760c18f8
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@199400 91177308-0d34-0410-b5e6-96231b3b80d8
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
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 STACK_ALLOCATOR_H
|
|
#define STACK_ALLOCATOR_H
|
|
|
|
#include <cstddef>
|
|
#include <new>
|
|
|
|
template <class T, std::size_t N>
|
|
class stack_allocator
|
|
{
|
|
char buf_[sizeof(T)*N];
|
|
char* ptr_;
|
|
public:
|
|
typedef T value_type;
|
|
typedef value_type* pointer;
|
|
typedef const value_type* const_pointer;
|
|
typedef value_type& reference;
|
|
typedef const value_type& const_reference;
|
|
typedef std::size_t size_type;
|
|
typedef std::ptrdiff_t difference_type;
|
|
|
|
template <class U> struct rebind {typedef stack_allocator<U, N> other;};
|
|
|
|
stack_allocator() : ptr_(buf_) {}
|
|
|
|
private:
|
|
stack_allocator(const stack_allocator&);// = delete;
|
|
stack_allocator& operator=(const stack_allocator&);// = delete;
|
|
|
|
public:
|
|
pointer allocate(size_type n, const void* = 0)
|
|
{
|
|
if (n > N - (ptr_ - buf_) / sizeof(value_type)) {
|
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
throw std::bad_alloc();
|
|
#else
|
|
std::terminate();
|
|
#endif
|
|
}
|
|
pointer r = (T*)ptr_;
|
|
ptr_ += n * sizeof(T);
|
|
return r;
|
|
}
|
|
void deallocate(pointer p, size_type n)
|
|
{
|
|
if ((char*)(p + n) == ptr_)
|
|
ptr_ = (char*)p;
|
|
}
|
|
|
|
size_type max_size() const {return N;}
|
|
};
|
|
|
|
template <class T, std::size_t N>
|
|
inline
|
|
void
|
|
swap(stack_allocator<T, N>& x, stack_allocator<T, N>& y) {}
|
|
|
|
#endif // STACK_ALLOCATOR_H
|