sandbox
Loading...
Searching...
No Matches
object_ptr.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_SIGNAL_OBJECT_PTR_HPP_
3#define LIBSBX_SIGNAL_OBJECT_PTR_HPP_
4
5#include <type_traits>
6
7#include <libsbx/signals/to_weak.hpp>
8
9namespace sbx::signals {
10
11using object_ptr = const void*;
12
13template<typename Type>
14auto get_object_ptr(const Type& value) -> object_ptr;
15
16template<typename Type, typename = void>
18 static auto get(const Type&) -> object_ptr {
19 return nullptr;
20 }
21}; // struct object_pointer
22
23template<typename Type>
24struct object_pointer<Type*, std::enable_if_t<std::is_pointer_v<Type*>>> {
25 static auto get(memory::observer_ptr<const Type> value) -> object_ptr {
26 return reinterpret_cast<object_ptr>(value);
27 }
28}; // struct object_pointer
29
30template<typename Type>
31struct object_pointer<Type, std::enable_if_t<is_weak_ptr_v<Type>>> {
32 static auto get(const Type& value) -> object_ptr {
33 auto object = value.lock();
34
35 return get_object_ptr(object);
36 }
37}; // struct object_pointer
38
39template<typename Type>
40struct object_pointer<Type, std::enable_if_t<!std::is_pointer_v<Type> && !is_weak_ptr_v<Type> && is_weak_ptr_compatible_v<Type>>> {
41 static auto get(const Type& value) -> object_ptr {
42 return value ? reinterpret_cast<object_ptr>(value.get()) : nullptr;
43 }
44}; // struct object_pointer
45
46template<typename Type>
47auto get_object_ptr(const Type& value) -> object_ptr {
48 return object_pointer<Type>::get(value);
49}
50
51} // namespace sbx::signals
52
53#endif // LIBSBX_SIGNAL_OBJECT_PTR_HPP_
A non-owning pointer that can be used to observe the value of a pointer.
Definition: observer_ptr.hpp:28
Definition: object_ptr.hpp:17