2 * Copyright (C) 2022 Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
8 #ifndef LTTNG_MAKE_UNIQUE_WRAPPER_H
9 #define LTTNG_MAKE_UNIQUE_WRAPPER_H
11 #include <common/macros.hpp>
18 * make_unique_wrapper is intended to facilitate the use of std::unique_ptr
19 * to wrap C-style APIs that don't provide RAII resource management facilities.
24 * struct my_c_struct {
28 * struct my_c_struct *create_my_c_struct(void);
29 * void destroy_my_c_struct(struct my_c_struct *value);
31 * // Creating a unique_ptr to my_c_struct.
32 * auto safe_c_struct =
33 * lttng::make_unique_wrapper<my_c_struct, destroy_my_c_struct>(
34 * create_my_c_struct());
36 * Note that this facility is intended for use in the scope of a function.
37 * If you need to return this unique_ptr instance, you should consider writting
38 * a proper, idiomatic, wrapper.
42 template <typename WrappedType, void (*DeleterFunction)(WrappedType *)>
43 struct create_deleter_class {
45 void operator()(WrappedType *instance) const
47 DeleterFunction(instance);
51 std::unique_ptr<WrappedType, deleter> operator()(WrappedType *instance) const
53 return std::unique_ptr<WrappedType, deleter>(instance);
56 } /* namespace memory */
59 * 'free' is a utility function for use with make_unique_wrapper. It makes it easier to
60 * wrap raw pointers that have to be deleted with `free`. Using libc's 'free' as
61 * a make_unique_wrapper template argument will result in an error as 'WrappedType *' will
62 * not match free's 'void *' argument.
70 template <typename WrappedType, void (*DeleterFunc)(WrappedType *)>
71 std::unique_ptr<WrappedType,
72 typename memory::create_deleter_class<WrappedType, DeleterFunc>::deleter>
73 make_unique_wrapper(WrappedType *instance = nullptr)
75 const memory::create_deleter_class<WrappedType, DeleterFunc> unique_deleter;
77 return unique_deleter(instance);
80 } /* namespace lttng */
82 #endif /* LTTNG_MAKE_UNIQUE_WRAPPER_H */