FEI Package Browser (Single Doxygen Collection)  Version of the Day
fei_Pool_alloc.hpp
Go to the documentation of this file.
1 /*--------------------------------------------------------------------*/
2 /* Copyright 2005 Sandia Corporation. */
3 /* Under the terms of Contract DE-AC04-94AL85000, there is a */
4 /* non-exclusive license for use of this work by or on behalf */
5 /* of the U.S. Government. Export of this program may require */
6 /* a license from the United States Government. */
7 /*--------------------------------------------------------------------*/
8 
9 #ifndef _fei_Pool_alloc_hpp_
10 #define _fei_Pool_alloc_hpp_
11 
12 #include "fei_macros.hpp"
13 #include "fei_Pool.hpp"
14 #include <cstddef>
15 #include <cstdlib>
16 #include <limits>
17 #include <new>
18 #include <stdexcept>
19 #include <iostream>
20 
21 fei_Pool* get_fei_mem_pool(size_t n);
22 
33 template<typename T>
35  private:
36  fei_Pool* mem; //pool of elements
37  size_t n_;
38 
39  public:
40  typedef T value_type;
41  typedef std::size_t size_type;
42  typedef T* pointer;
43  typedef const T* const_pointer;
44  typedef T& reference;
45  typedef const T& const_reference;
46  typedef std::ptrdiff_t difference_type;
47 
48  // Boilerplate allocator stuff
49  template <typename U>
50  struct rebind
51  {
53  };
54 
55  pointer address (reference value) const
56  {
57  return &value;
58  }
60  {
61  return &value;
62  }
63 
64  fei_Pool_alloc() throw();
65  fei_Pool_alloc(const T&) throw();
66  template<typename U> fei_Pool_alloc(const fei_Pool_alloc<U>&) throw()
67  : mem(NULL),n_(0) {}
68 
69  ~fei_Pool_alloc() throw();
70 
71  pointer allocate(size_type n, const void* hint = NULL);
72  void deallocate(pointer p, size_type n);
73 
74  template<typename U> void construct(U* p, const U& val)
75  { new(p) U(val); }
76 
77  void construct(pointer p, const T& val)
78  { new(p) T(val); }
79 
80  template<typename U> void destroy(U* p)
81  { p->~U(); }
82 
83  void destroy(pointer p)
84  { p->~T(); }
85 
86  size_type max_size() const throw() { return std::numeric_limits<size_type>::max(); }
87 
88 };
89 
90 template<typename T> fei_Pool_alloc<T>::fei_Pool_alloc() throw() : mem(NULL),n_(0) {}
91 template<typename T> fei_Pool_alloc<T>::fei_Pool_alloc(const T&) throw() : mem(NULL),n_(0) {}
92 
93 template<typename T> fei_Pool_alloc<T>::~fei_Pool_alloc() throw() {}
94 
95 template<typename T>
97 {
98  if (n==0) return NULL;
99 
100  if (n_ == 0) {
101  n_ = n;
102  mem = get_fei_mem_pool(n_*sizeof(T));
103  }
104 
105  if (n != n_) {
106  std::cerr << "fei_Pool_alloc ERROR, allocate given bad length ("<<n
107  <<"), must be " <<n_<<". throwing exception."<<std::endl;
108  throw std::bad_alloc();
109  }
110  return static_cast<T*>(mem->alloc());
111 }
112 
113 template<typename T>
115 {
116  if (p == NULL || n == 0) return;
117 
118  if (n == n_) {
119  mem->free(p);
120  return;
121  }
122 
123  std::cerr << "fei_Pool_alloc ERROR, deallocate given bad length ("<<n
124  <<"), must be " <<n_<<". aborting."<<std::endl;
125  std::abort();
126 }
127 
128 template<typename T>
129 inline bool operator==(const fei_Pool_alloc<T>&,
130  const fei_Pool_alloc<T>&) throw()
131 { return true; }
132 template<typename T>
133 inline bool operator!=(const fei_Pool_alloc<T>&,
134  const fei_Pool_alloc<T>&) throw()
135 { return false; }
136 
137 #endif
138 
fei_Pool_alloc::allocate
pointer allocate(size_type n, const void *hint=NULL)
Definition: fei_Pool_alloc.hpp:96
fei_Pool_alloc::address
pointer address(reference value) const
Definition: fei_Pool_alloc.hpp:55
fei_Pool_alloc::size_type
std::size_t size_type
Definition: fei_Pool_alloc.hpp:41
get_fei_mem_pool
fei_Pool * get_fei_mem_pool(size_t n)
Definition: fei_Pool_alloc.cpp:33
fei_macros.hpp
fei_Pool_alloc::value_type
T value_type
Definition: fei_Pool_alloc.hpp:40
fei_Pool_alloc::fei_Pool_alloc
fei_Pool_alloc()
Definition: fei_Pool_alloc.hpp:90
fei_Pool_alloc::address
const_pointer address(const_reference value) const
Definition: fei_Pool_alloc.hpp:59
fei_Pool_alloc::destroy
void destroy(U *p)
Definition: fei_Pool_alloc.hpp:80
fei_Pool_alloc::const_pointer
const typedef T * const_pointer
Definition: fei_Pool_alloc.hpp:43
operator==
bool operator==(const fei_Pool_alloc< T > &, const fei_Pool_alloc< T > &)
Definition: fei_Pool_alloc.hpp:129
fei_Pool_alloc::~fei_Pool_alloc
~fei_Pool_alloc()
Definition: fei_Pool_alloc.hpp:93
fei_Pool_alloc::rebind::other
fei_Pool_alloc< U > other
Definition: fei_Pool_alloc.hpp:52
fei_Pool_alloc::pointer
T * pointer
Definition: fei_Pool_alloc.hpp:42
operator!=
bool operator!=(const fei_Pool_alloc< T > &, const fei_Pool_alloc< T > &)
Definition: fei_Pool_alloc.hpp:133
fei_Pool_alloc::rebind
Definition: fei_Pool_alloc.hpp:50
fei_Pool_alloc::difference_type
std::ptrdiff_t difference_type
Definition: fei_Pool_alloc.hpp:46
fei_Pool_alloc::deallocate
void deallocate(pointer p, size_type n)
Definition: fei_Pool_alloc.hpp:114
fei_Pool_alloc::construct
void construct(U *p, const U &val)
Definition: fei_Pool_alloc.hpp:74
fei_Pool.hpp
fei_Pool_alloc::destroy
void destroy(pointer p)
Definition: fei_Pool_alloc.hpp:83
fei_Pool_alloc::const_reference
const typedef T & const_reference
Definition: fei_Pool_alloc.hpp:45
fei_Pool_alloc::n_
size_t n_
Definition: fei_Pool_alloc.hpp:37
fei_Pool
Definition: fei_Pool.hpp:26
fei_Pool_alloc::reference
T & reference
Definition: fei_Pool_alloc.hpp:44
fei_Pool_alloc::max_size
size_type max_size() const
Definition: fei_Pool_alloc.hpp:86
fei_Pool_alloc::mem
fei_Pool * mem
Definition: fei_Pool_alloc.hpp:36
n
int n
fei_Pool_alloc::construct
void construct(pointer p, const T &val)
Definition: fei_Pool_alloc.hpp:77
fei_Pool_alloc
Definition: fei_Pool_alloc.hpp:34