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,...
#define QX_COPYMOVABLE(className)
Define class as default copyable and movable.
Contains naming strategies for qx::rtti_root class.
Contains utils for working with std::tuple.