31#ifndef FENNEC_RTTI_TYPE_REGISTRY_H
32#define FENNEC_RTTI_TYPE_REGISTRY_H
43template<
typename BaseT,
typename...ArgsT>
46 using ctor_t = BaseT* (*)(ArgsT...);
60 : priority(
e.priority)
65 entry(entry&& e) noexcept
66 : priority(
e.priority)
74 entry& operator=(
const entry& e) {
75 priority =
e.priority;
81 entry& operator=(entry&&) noexcept = default;
83 entry(
size_t p, fennec::type type, ctor_t ctor)
84 : priority(p), type(type), ctor(ctor) {
89 bool operator()(
const entry& a,
const entry& b)
const {
90 return a.priority > b.priority and a.ctor < b.ctor;
94 using entrylist_t = priority_queue<entry, compare>;
96 template<
typename DerivedT>
requires(is_base_of_v<BaseT, DerivedT>)
97 static void register_type(
size_t priority = 0) {
98 _global_list().emplace(
100 type::get<DerivedT>(),
101 _constructor_helper<DerivedT>
105 static const entrylist_t& get_type_list() {
106 return _global_list();
110 static entrylist_t& _global_list() {
111 static entrylist_t list;
116 static BaseT* _constructor_helper(ArgsT...args) {
117 return new T(args...);
constexpr genType e()
Definition constants.h:635