32 template<
class naming_strategy_t>
53 template<
class naming_strategy_t = rtti_naming_strategy_
class_name>
60 using inheritance_tuple_type = std::tuple<this_class_type>;
61 using naming_strategy_type = naming_strategy_t;
69 bool is_derived_from()
const noexcept
71 constexpr
class_id typeId = T::get_class_id_static();
72 return _is_base_id(typeId) || typeId == get_class_id();
76 bool is()
const noexcept
78 return get_class_id() == T::get_class_id_static();
81 bool is(string_view svClassName)
const noexcept
83 return svClassName == get_class_name();
88 return id == get_class_id();
91 virtual bool is_derived_from_id(
class_id id)
const noexcept
93 return is_derived_from_id_static(
id);
96 static constexpr
bool is_derived_from_id_static(
class_id id) noexcept
98 return id == get_class_id_static();
101 static constexpr string_view get_class_name_static() noexcept
106 virtual string_view get_class_name()
const noexcept
108 return get_class_name_static();
111 static constexpr
class_id get_class_id_static() noexcept
113 return class_id::create<this_class_type>();
116 virtual class_id get_class_id()
const noexcept
118 return get_class_id_static();
121 virtual std::span<const class_id> get_inheritance_sequence()
const = 0;
123 auto operator<=>(
const rtti_root&)
const =
default;
128 virtual bool _is_base_id(
class_id idBase)
const noexcept
130 return idBase == get_class_id_static();
138 constexpr
auto rtti()
140 return [](
const auto& value)
142 return value.template is_derived_from<T>();
155 #define QX_RTTI_CLASS(thisClass, ...) \
158 using this_class_type = thisClass; \
159 using super_class_type = __VA_ARGS__; \
160 using base_class_type = typename super_class_type::base_class_type; \
161 using inheritance_tuple_type = \
162 qx::tuple::join_t<typename super_class_type::inheritance_tuple_type, this_class_type>; \
165 static constexpr bool is_derived_from_id_static(qx::class_id id) noexcept \
167 return id == get_class_id_static() || super_class_type::is_derived_from_id_static(id); \
169 virtual bool is_derived_from_id(qx::class_id id) const noexcept override \
171 static_assert(std::is_same_v<std::remove_cvref_t<decltype(*this)>, this_class_type>); \
172 return is_derived_from_id_static(id); \
174 static constexpr qx::string_view get_class_name_static() noexcept \
176 return base_class_type::naming_strategy_type::get_name(qx::type_strings<this_class_type>::get_signature()); \
178 virtual qx::class_id get_class_id() const noexcept override \
180 return get_class_id_static(); \
182 static constexpr qx::class_id get_class_id_static() noexcept \
184 return qx::class_id::create<this_class_type>(); \
186 virtual qx::string_view get_class_name() const noexcept override \
188 return get_class_name_static(); \
190 virtual std::span<const qx::class_id> get_inheritance_sequence() const override \
192 static constexpr auto ids = []() \
194 std::array<qx::class_id, std::tuple_size_v<inheritance_tuple_type>> ids_; \
195 qx::tuple::iterate<inheritance_tuple_type>( \
196 [&ids_]<class T, size_t I>() \
198 ids_[I] = T::get_class_id_static(); \
206 virtual bool _is_base_id(qx::class_id base_id) const noexcept override \
208 return base_id == super_class_type::get_class_id_static() || super_class_type::_is_base_id(base_id); \
Class id, unique for each class using qx rtti system.
The class allows you to get strings with information about the type, including its full name,...
Contains naming strategies for qx::rtti_root class.
Contains utils for working with std::tuple.