Banuba SDK
Loading...
Searching...
No Matches
allocate_unique.hpp
1#pragma once
2
3#include <memory>
4
5namespace 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