HAMR
The Heterogeneous Accelerator Memory Resource
hamr_new_allocator_impl.h
1 #ifndef hamr_new_allocator_impl_h
2 #define hamr_new_allocator_impl_h
3 
4 //#include "hamr_new_allocator.h"
5 
6 #include <iostream>
7 #include <type_traits>
8 #include <memory>
9 #include <typeinfo>
10 #include <cassert>
11 #include <cstring>
12 
13 namespace hamr
14 {
15 
16 // --------------------------------------------------------------------------
17 template <typename T>
18 new_deleter<T>::new_deleter(T *ptr, size_t n) : m_ptr(ptr), m_elem(n)
19 {
20 #if defined(HAMR_VERBOSE)
21  if (hamr::get_verbose())
22  {
23  std::cerr << "created new_deleter for array of " << n
24  << " objects of type " << typeid(T).name() << std::endl;
25  }
26 #endif
27 }
28 
29 // --------------------------------------------------------------------------
30 template <typename T>
32 {
33  assert(ptr == m_ptr);
34 
35 #if defined(HAMR_VERBOSE)
36  if (hamr::get_verbose())
37  {
38  std::cerr << "new_deleter deleting array of " << m_elem
39  << " objects of type " << typeid(T).name() << std::endl;
40  }
41 #endif
42 
43  delete [] ptr;
44 }
45 
46 
47 
48 
49 
50 
51 // --------------------------------------------------------------------------
52 template <typename T>
53 std::shared_ptr<T> new_allocator<T>::allocate(size_t n)
54 {
55 #if defined(HAMR_VERBOSE)
56  if (hamr::get_verbose())
57  {
58  std::cerr << "new_allocator allocating array of " << n
59  << " objects of type " << typeid(T).name() << std::endl;
60  }
61 #endif
62 
63  // allocate
64  T *ptr = new T[n];
65 
66  // package
67  return std::shared_ptr<T>(ptr, new_deleter<T>(ptr, n));
68 }
69 
70 // --------------------------------------------------------------------------
71 template <typename T>
72 std::shared_ptr<T> new_allocator<T>::allocate(size_t n, const T &val)
73 {
74 #if defined(HAMR_VERBOSE)
75  if (hamr::get_verbose())
76  {
77  std::cerr << "new_allocator allocating array of " << n
78  << " objects of type " << typeid(T).name() << " initialized"
79  << std::endl;
80  }
81 #endif
82 
83  // allocate
84  T *ptr = (T*)new unsigned char[n*sizeof(T)];
85 
86  // construct
87  for (size_t i = 0; i < n; ++i)
88  new (&ptr[i]) T(val);
89 
90  // package
91  return std::shared_ptr<T>(ptr, new_deleter<T>(ptr, n));
92 }
93 
94 // --------------------------------------------------------------------------
95 template <typename T>
96 template <typename U>
97 std::shared_ptr<T> new_allocator<T>::allocate(size_t n, const U *vals)
98 {
99 #if defined(HAMR_VERBOSE)
100  if (hamr::get_verbose())
101  {
102  std::cerr << "new_allocator allocating array of " << n
103  << " objects of type " << typeid(T).name() << " initialized"
104  << std::endl;
105  }
106 #endif
107 
108  // allocate
109  T *ptr = (T*)new unsigned char[n*sizeof(T)];
110 
111  // construct
112  for (size_t i = 0; i < n; ++i)
113  new (&ptr[i]) T(vals[i]);
114 
115  // package
116  return std::shared_ptr<T>(ptr, new_deleter<T>(ptr, n));
117 }
118 
119 };
120 
121 #endif
hamr::new_deleter
a deleter for arrays allocated with new
Definition: hamr_new_allocator.h:13
hamr::get_verbose
constexpr HAMR_EXPORT int get_verbose()
returns the value of the HAMR_VERBOSE environment variable
Definition: hamr_env.h:14
hamr::new_allocator::allocate
static std::shared_ptr< T > allocate(size_t n) HAMR_EXPORT
Definition: hamr_new_allocator_impl.h:53
hamr::new_deleter::new_deleter
new_deleter(T *ptr, size_t n)
Definition: hamr_new_allocator_impl.h:18
hamr::new_deleter::operator()
void operator()(T *ptr)
Definition: hamr_new_allocator_impl.h:31
hamr
heterogeneous accelerator memory resource
Definition: hamr_buffer.h:13