35 template<
class naming_strategy_t>
56 template<
class naming_strategy_t = rtti_naming_strategy_
class_name>
65 using inheritance_tuple_type = std::tuple<this_class_type>;
66 using naming_strategy_type = naming_strategy_t;
71 auto operator<=>(
const rtti_root&)
const =
default;
74 bool is_derived_from()
const noexcept
76 constexpr
class_id typeId = T::get_class_id_static();
77 return _is_base_id(typeId) || typeId == get_class_id();
81 bool is()
const noexcept
83 return get_class_id() == T::get_class_id_static();
86 bool is(string_view svClassName)
const noexcept
88 return svClassName == get_class_name();
93 return id == get_class_id();
96 virtual bool is_derived_from_id(
class_id id)
const noexcept
98 return is_derived_from_id_static(
id);
101 static constexpr
bool is_derived_from_id_static(
class_id id) noexcept
103 return id == get_class_id_static();
106 static constexpr string_view get_class_name_static() noexcept
111 virtual string_view get_class_name()
const noexcept
113 return get_class_name_static();
116 static constexpr
class_id get_class_id_static() noexcept
118 constexpr
class_id id = class_id::create<this_class_type>();
122 virtual class_id get_class_id()
const noexcept
124 return get_class_id_static();
127 virtual std::span<const class_id> get_inheritance_sequence()
const = 0;
132 virtual bool _is_base_id(
class_id idBase)
const noexcept
134 return idBase == get_class_id_static();
142 constexpr
auto rtti()
144 return [](
const auto& value)
146 return value.template is_derived_from<T>();
159 #define QX_RTTI_CLASS(thisClass, ...) \
162 using this_class_type = thisClass; \
163 using super_class_type = __VA_ARGS__; \
164 using base_class_type = typename super_class_type::base_class_type; \
165 using inheritance_tuple_type = \
166 qx::tuple_utils::join_t<typename super_class_type::inheritance_tuple_type, this_class_type>; \
169 static constexpr bool is_derived_from_id_static(qx::class_id id) noexcept \
171 return id == get_class_id_static() || super_class_type::is_derived_from_id_static(id); \
173 virtual bool is_derived_from_id(qx::class_id id) const noexcept override \
175 static_assert(std::is_same_v<std::remove_cvref_t<decltype(*this)>, this_class_type>); \
176 return is_derived_from_id_static(id); \
178 static constexpr qx::string_view get_class_name_static() noexcept \
180 return base_class_type::naming_strategy_type::get_name(qx::type_strings<this_class_type>::get_signature()); \
182 virtual qx::class_id get_class_id() const noexcept override \
184 return get_class_id_static(); \
186 static constexpr qx::class_id get_class_id_static() noexcept \
188 constexpr qx::class_id id = qx::class_id::create<this_class_type>(); \
191 virtual qx::string_view get_class_name() const noexcept override \
193 return get_class_name_static(); \
195 virtual std::span<const qx::class_id> get_inheritance_sequence() const override \
197 static constexpr auto ids = []() \
199 std::array<qx::class_id, std::tuple_size_v<inheritance_tuple_type>> ids_; \
200 qx::tuple_utils::iterate<inheritance_tuple_type>( \
201 [&ids_]<class T, size_t I>() \
203 ids_[I] = T::get_class_id_static(); \
211 virtual bool _is_base_id(qx::class_id base_id) const noexcept override \
213 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.