sandbox
Loading...
Searching...
No Matches
to_weak.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_SIGNAL_TO_WEAK_HPP_
3#define LIBSBX_SIGNAL_TO_WEAK_HPP_
4
5#include <memory>
6#include <type_traits>
7
8namespace sbx::signals {
9
10template<typename Type>
11auto to_weak(std::weak_ptr<Type> ptr) -> std::weak_ptr<Type> {
12 return ptr;
13}
14
15template<typename Type>
16auto to_weak(std::shared_ptr<Type> ptr) -> std::weak_ptr<Type> {
17 return ptr;
18}
19
20template<typename Type, typename = void>
21struct is_weak_ptr : std::false_type { };
22
23template<typename Type>
24struct is_weak_ptr<Type, std::void_t<decltype(std::declval<Type>().expired()), decltype(std::declval<Type>().lock()), decltype(std::declval<Type>().reset())>> : std::true_type { };
25
26template<typename Type>
27constexpr auto is_weak_ptr_v = is_weak_ptr<Type>::value;
28
29template<typename Type, typename = void>
30struct is_weak_ptr_compatible : std::false_type { };
31
32template<typename Type>
33struct is_weak_ptr_compatible<Type, std::void_t<decltype(to_weak(std::declval<Type>()))>> : is_weak_ptr<decltype(to_weak(std::declval<Type>()))> { };
34
35template<typename Type>
36constexpr auto is_weak_ptr_compatible_v = is_weak_ptr_compatible<Type>::value;
37
38} // namespace sbx::signals
39
40#endif // LIBSBX_SIGNAL_TO_WEAK_HPP_
Definition: to_weak.hpp:30
Definition: to_weak.hpp:21