Banuba SDK
allocate_unique.hpp
1 #pragma once
2 
3 #include <memory>
4 
5 namespace bnb
6 {
7  /**
8  * @addtogroup Utils
9  * @{
10  */
11 
12  template<typename T, typename Alloc, typename D, typename... Args>
13  inline std::unique_ptr<T, D> allocate_unique(Alloc alloc, Args&&... args)
14  {
15  using traits = std::allocator_traits<Alloc>;
16  auto ptr = traits::allocate(alloc, 1);
17  try {
18  traits::construct(alloc, ptr, std::forward<Args>(args)...);
19  } catch (...) {
20  traits::deallocate(alloc, ptr, 1);
21  throw;
22  }
23 
24 
25  return std::unique_ptr<T, D>(
26  ptr,
27  [alloc = std::move(alloc)](auto p) mutable {
28  auto ptr = const_cast<T*>(reinterpret_cast<const T*>(p));
29  traits::destroy(alloc, ptr);
30  traits::deallocate(alloc, ptr, 1);
31  }
32  );
33  }
34 
35  /** @} */ // endgroup utils
36 } // namespace bnb