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 is_derived_from = [](
const auto& value)
144 return value.template is_derived_from<T>();
148 constexpr
auto is = [](
const auto& value)
150 return value.template is<T>();
162 #define QX_RTTI_CLASS(thisClass, ...) \
165 using this_class_type = thisClass; \
166 using super_class_type = __VA_ARGS__; \
167 using base_class_type = typename super_class_type::base_class_type; \
168 using inheritance_tuple_type = \
169 qx::tuple_utils::join_t<typename super_class_type::inheritance_tuple_type, this_class_type>; \
172 static constexpr bool is_derived_from_id_static(qx::class_id id) noexcept \
174 return id == get_class_id_static() || super_class_type::is_derived_from_id_static(id); \
176 virtual bool is_derived_from_id(qx::class_id id) const noexcept override \
178 static_assert(std::is_same_v<std::remove_cvref_t<decltype(*this)>, this_class_type>); \
179 return is_derived_from_id_static(id); \
181 static constexpr qx::string_view get_class_name_static() noexcept \
183 return base_class_type::naming_strategy_type::get_name(qx::type_strings<this_class_type>::get_signature()); \
185 virtual qx::class_id get_class_id() const noexcept override \
187 return get_class_id_static(); \
189 static constexpr qx::class_id get_class_id_static() noexcept \
191 constexpr qx::class_id id = qx::class_id::create<this_class_type>(); \
194 virtual qx::string_view get_class_name() const noexcept override \
196 return get_class_name_static(); \
198 virtual std::span<const qx::class_id> get_inheritance_sequence() const override \
200 static constexpr auto ids = []() \
202 std::array<qx::class_id, std::tuple_size_v<inheritance_tuple_type>> ids_; \
203 qx::tuple_utils::iterate<inheritance_tuple_type>( \
204 [&ids_]<class T, size_t I>() \
206 ids_[I] = T::get_class_id_static(); \
214 virtual bool _is_base_id(qx::class_id base_id) const noexcept override \
216 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.