LkEngine 0.1.2
 
Loading...
Searching...
No Matches
SubclassOf.h
1/******************************************************************
2 * SubclassOf
3 *
4 *******************************************************************/
5#pragma once
6
7#include "LkEngine/Core/Template/LkTemplate.h"
8#include "LkEngine/Core/LObject/LClass.h"
9#include "LkEngine/Core/LObject/ObjectPtr.h"
10
11
12namespace LkEngine {
13
14 template <typename T>
15 class TSubclassOf;
16
17 template <typename T>
19 {
20 enum { Value = false };
21 };
22
23 template <typename T> struct TIsTSubclassOf< TSubclassOf<T>> { enum { Value = true }; };
24 template <typename T> struct TIsTSubclassOf<const TSubclassOf<T>> { enum { Value = true }; };
25 template <typename T> struct TIsTSubclassOf< volatile TSubclassOf<T>> { enum { Value = true }; };
26 template <typename T> struct TIsTSubclassOf<const volatile TSubclassOf<T>> { enum { Value = true }; };
27
28 template <typename T>
30 {
31 public:
32 TSubclassOf() = default;
33 TSubclassOf(TSubclassOf&&) = default;
34 TSubclassOf(const TSubclassOf&) = default;
35 ~TSubclassOf() = default;
36
37 TSubclassOf& operator=(TSubclassOf&&) = default;
38 TSubclassOf& operator=(const TSubclassOf&) = default;
39
40 FORCEINLINE TSubclassOf(LClass* From)
41 : Class(From)
42 {
43 }
44
57 template<typename R,
58 std::enable_if_t<
59 !TIsTSubclassOf<std::decay_t<R>>::Value, decltype(ImplicitConv<LClass*>(std::declval<R>()))
60 >* = nullptr>
61 FORCEINLINE TSubclassOf(R&& From)
62 : Class(From)
63 {
64 }
65
67 FORCEINLINE TSubclassOf& operator=(LClass* From)
68 {
69 Class = From;
70 return *this;
71 }
72
86 template<typename R,
87 std::enable_if_t<
88 !TIsTSubclassOf<std::decay_t<R>>::Value, decltype(ImplicitConv<LClass*>(std::declval<R>()))
89 >* = nullptr
90 >
91 FORCEINLINE TSubclassOf& operator=(R&& From)
92 {
93 Class = From;
94 return *this;
95 }
96
98 FORCEINLINE LClass* operator*() const
99 {
100 if (!Class || !Class->IsChildOf(T::StaticClass()))
101 {
102 return nullptr;
103 }
104
105 return Class;
106 }
107
109 FORCEINLINE LClass* Get() const
110 {
111 return **this;
112 }
113
115 FORCEINLINE LClass* operator->() const
116 {
117 return **this;
118 }
119
121 FORCEINLINE operator LClass* () const
122 {
123 return **this;
124 }
125
126 private:
128 TObjectPtr<LClass> Class = nullptr;
129
130 template <typename R>
131 friend class TSubclassOf;
132 };
133
134}
Definition Class.h:17
Definition ObjectPtr.h:102
Definition SubclassOf.h:30
FORCEINLINE LClass * operator*() const
Dereference back into a LClass pointer.
Definition SubclassOf.h:98
FORCEINLINE TSubclassOf(R &&From)
Create TSubclassOf instance from any type that can be implicitly converted to LClass*.
Definition SubclassOf.h:61
FORCEINLINE LClass * Get() const
Dereference back into a LClass pointer.
Definition SubclassOf.h:109
FORCEINLINE LClass * operator->() const
Dereference back into a LClass pointer.
Definition SubclassOf.h:115
FORCEINLINE TSubclassOf & operator=(LClass *From)
Assign from a LClass pointer.
Definition SubclassOf.h:67
Definition Asset.h:11
Definition SubclassOf.h:19