16 #ifndef _GU_RESERVED_CONTAINER_
17 #define _GU_RESERVED_CONTAINER_
19 #include "chromium/aligned_memory.h"
21 #include "gu_logger.hpp"
45 template <
typename T,
int reserved,
bool diagnostic = false>
50 typedef chromium::AlignedBuffer<T, reserved> Buffer;
53 typedef const T* const_pointer;
55 typedef const T& const_reference;
57 typedef size_t size_type;
59 typedef ptrdiff_t difference_type;
64 T* address(T& t)
const {
return &t; }
65 const T* address(
const T& t)
const {
return &t; }
66 size_type max_size()
const {
return size_type(-1)/2/
sizeof(T); }
68 void construct (T*
const p,
const T& t)
const {
new (p) T(t); }
69 void destroy (T*
const p)
const { p->~T(); }
72 bool operator==(
const ReservedAllocator& other)
const
74 return (buffer_ == other.buffer_);
77 bool operator!=(
const ReservedAllocator& other)
const
79 return !(*
this == other);
82 ReservedAllocator(Buffer& buf, size_type n = 0)
88 ReservedAllocator(
const ReservedAllocator& other)
90 buffer_(other.buffer_),
96 template <
typename U,
size_type c,
bool d>
97 ReservedAllocator(
const ReservedAllocator<U, c, d>&)
105 ~ReservedAllocator() {}
107 T* allocate(size_type
const n,
void* hint = NULL)
109 if (n == 0)
return NULL;
111 if (reserved - used_ >= n )
113 assert (buffer_ != NULL);
116 { log_info <<
"Allocating " << n <<
'/' << (reserved - used_)
117 <<
" from reserve"; }
119 T*
const ret(buffer_->base_ptr() + used_);
127 { log_warn <<
"Allocating " << n <<
" from heap"; }
129 void* ret = malloc(n *
sizeof(T));
130 if (NULL != ret)
return static_cast<T*
>(ret);
133 throw std::bad_alloc();
136 void deallocate(T*
const p, size_type
const n)
138 if (size_type(p - buffer_->base_ptr()) < reserved)
142 if (buffer_->base_ptr() + used_ == p + n)
150 assert(p + n <= buffer_->base_ptr() + used_);
159 size_type used()
const {
return used_; }
169 ReservedAllocator& operator=(
const ReservedAllocator&);
182 template <
typename ContainerType,
int reserved>
197 container_.reserve(reserved);
208 ContainerType& container() {
return container_; }
209 const ContainerType& container()
const {
return container_; }
210 ContainerType& operator()() {
return container_; }
211 const ContainerType& operator()()
const {
return container_; }
219 ContainerType* operator->() {
return &container_; }
220 const ContainerType* operator->()
const {
return &container_; }
223 typedef typename ContainerType::value_type ContainedType;
224 const ContainedType* reserved_buffer()
const {
return buffer_.base_ptr(); }
229 typedef typename Allocator::Buffer Buffer;
232 ContainerType container_;
Definition: gu_reserved_container.hpp:183
Definition: gu_reserved_container.hpp:62
Definition: gu_reserved_container.hpp:46