//===----------------------------------------------------------------------===// // // 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