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