4 #ifndef DUNE_COMMON_POOLALLOCATOR_HH
5 #define DUNE_COMMON_POOLALLOCATOR_HH
22 template<std::
size_t size,
typename T>
28 template<
typename T, std::
size_t s>
31 template<
typename T, std::
size_t s>
88 template<
class T, std::
size_t s>
92 friend struct ::testPoolMain<s,T>;
183 unsigned long long lmemory =
reinterpret_cast<unsigned long long>(chunk_);
188 memory_ =
reinterpret_cast<char *
>(lmemory);
206 inline void free(
void* o);
211 inline void print(std::ostream& os);
216 Pool(
const Pool<MemberType,s>&);
218 void operator=(
const Pool<MemberType,s>& pool)
const;
247 template<
class T, std::
size_t s>
305 template<
typename U, std::
size_t u>
315 inline pointer
allocate(std::size_t n, const_pointer hint=0);
324 inline void deallocate(pointer p, std::size_t n);
331 inline void construct(pointer p, const_reference value);
337 inline void destroy(pointer p);
342 inline pointer
address(reference x)
const {
return &x; }
348 inline const_pointer
address(const_reference x)
const {
return &x; }
371 static PoolType memoryPool_;
375 template <std::
size_t s>
383 template <
class U>
struct rebind
388 template<
typename T, std::
size_t t>
395 template<
typename T1, std::
size_t t1,
typename T2, std::
size_t t2>
402 template<
typename T1, std::
size_t t1,
typename T2, std::
size_t t2>
408 template<
typename T, std::
size_t t1, std::
size_t t2>
415 template<
typename T, std::
size_t t1, std::
size_t t2>
422 template<
typename T, std::
size_t t1, std::
size_t t2>
429 template<
typename T, std::
size_t t1, std::
size_t t2>
435 template<
typename T, std::
size_t t1, std::
size_t t2>
442 template<
typename T, std::
size_t t1, std::
size_t t2>
447 template<std::
size_t t1, std::
size_t t2>
453 template<std::
size_t t1, std::
size_t t2>
459 template<
class T, std::
size_t S>
461 :head_(0), chunks_(0)
464 dune_static_assert(
sizeof(Reference)<=unionSize,
"Library Error: type of referene is too big");
475 template<
class T, std::
size_t S>
485 Chunk *current=chunks_;
489 Chunk *tmp = current;
490 current = current->next_;
495 template<
class T, std::
size_t S>
498 Chunk* current=chunks_;
501 current=current->next_;
506 template<
class T, std::
size_t S>
509 Chunk *newChunk =
new Chunk;
510 newChunk->next_ = chunks_;
513 char* start = chunks_->memory_;
514 char* last = &start[elements*alignedSize];
515 Reference* ref =
new (start) (Reference);
522 for(
char* element=start+alignedSize; element<last; element=element+alignedSize){
523 Reference* next =
new (element) (Reference);
530 template<
class T, std::
size_t S>
534 Reference* freed =
static_cast<Reference*
>(b);
535 freed->next_ = head_;
539 std::cerr<<
"Tried to free null pointer! "<<b<<std::endl;
542 template<
class T, std::
size_t S>
548 Reference* p = head_;
554 template<
class T, std::
size_t s>
557 template<
class T, std::
size_t s>
561 template<
class T, std::
size_t s>
566 return static_cast<T*
>(memoryPool_.allocate());
568 throw std::bad_alloc();
571 template<
class T, std::
size_t s>
574 for(
size_t i=0; i<n; i++)
575 memoryPool_.free(p++);
578 template<
class T, std::
size_t s>
581 ::new (static_cast<void*>(p)) T(value);
584 template<
class T, std::
size_t s>