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 constexpr
class_id id = class_id::create<this_class_type>();
117 virtual class_id get_class_id()
const noexcept
119 return get_class_id_static();
122 virtual std::span<const class_id> get_inheritance_sequence()
const = 0;
124 auto operator<=>(
const rtti_root&)
const =
default;
129 virtual bool _is_base_id(
class_id idBase)
const noexcept
131 return idBase == get_class_id_static();
139 constexpr
auto rtti()
141 return [](
const auto& value)
143 return value.template is_derived_from<T>();
156 #define QX_RTTI_CLASS(thisClass, ...) \
159 using this_class_type = thisClass; \
160 using super_class_type = __VA_ARGS__; \
161 using base_class_type = typename super_class_type::base_class_type; \
162 using inheritance_tuple_type = \
163 qx::tuple_utils::join_t<typename super_class_type::inheritance_tuple_type, this_class_type>; \
166 static constexpr bool is_derived_from_id_static(qx::class_id id) noexcept \
168 return id == get_class_id_static() || super_class_type::is_derived_from_id_static(id); \
170 virtual bool is_derived_from_id(qx::class_id id) const noexcept override \
172 static_assert(std::is_same_v<std::remove_cvref_t<decltype(*this)>, this_class_type>); \
173 return is_derived_from_id_static(id); \
175 static constexpr qx::string_view get_class_name_static() noexcept \
177 return base_class_type::naming_strategy_type::get_name(qx::type_strings<this_class_type>::get_signature()); \
179 virtual qx::class_id get_class_id() const noexcept override \
181 return get_class_id_static(); \
183 static constexpr qx::class_id get_class_id_static() noexcept \
185 constexpr qx::class_id id = qx::class_id::create<this_class_type>(); \
188 virtual qx::string_view get_class_name() const noexcept override \
190 return get_class_name_static(); \
192 virtual std::span<const qx::class_id> get_inheritance_sequence() const override \
194 static constexpr auto ids = []() \
196 std::array<qx::class_id, std::tuple_size_v<inheritance_tuple_type>> ids_; \
197 qx::tuple_utils::iterate<inheritance_tuple_type>( \
198 [&ids_]<class T, size_t I>() \
200 ids_[I] = T::get_class_id_static(); \
208 virtual bool _is_base_id(qx::class_id base_id) const noexcept override \
210 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.