2 * Copyright (C) 2024 Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
8 #ifndef LTTNG_REFERENCE_H
9 #define LTTNG_REFERENCE_H
11 #include <common/macros.hpp>
18 template <typename ReferencedType, typename CustomDeleter>
19 class non_copyable_reference {
21 using referenced_type = ReferencedType;
22 using deleter = CustomDeleter;
24 non_copyable_reference(non_copyable_reference&& other) noexcept : _value(other._value)
26 _value = other._value;
30 non_copyable_reference() = delete;
31 non_copyable_reference(const non_copyable_reference&) = delete;
32 non_copyable_reference& operator=(non_copyable_reference&& other) noexcept
36 _value = other._value;
43 non_copyable_reference& operator=(const non_copyable_reference&) = delete;
45 ReferencedType& get() const noexcept
50 ReferencedType *operator->() const noexcept
55 ReferencedType& operator*() const noexcept
60 void release() noexcept
65 ~non_copyable_reference()
71 explicit non_copyable_reference(ReferencedType& instance) noexcept : _value(&instance)
82 DIAGNOSTIC_IGNORE_INJECTED_CLASS_NAME
83 static_assert(std::is_class<typename CustomDeleter::deleter>::value,
84 "CustomDeleter must define a 'deleter' callable class.");
85 const typename CustomDeleter::deleter del;
92 template <typename FactoryReferencedType, typename FactoryCustomDeleter>
93 friend non_copyable_reference<FactoryReferencedType, FactoryCustomDeleter>
94 make_non_copyable_reference(FactoryReferencedType&);
96 ReferencedType *_value = nullptr;
99 template <typename ReferencedType, typename CustomDeleter>
100 non_copyable_reference<ReferencedType, CustomDeleter>
101 make_non_copyable_reference(ReferencedType& instance)
103 return non_copyable_reference<ReferencedType, CustomDeleter>(instance);
106 } /* namespace lttng */
108 #endif /* LTTNG_REFERENCE_H */