|  | #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 |