]> git.tdb.fi Git - libs/game.git/commitdiff
Make it possible to find reflected classes by RTTI
authorMikko Rasa <tdb@tdb.fi>
Wed, 7 Dec 2022 09:52:03 +0000 (11:52 +0200)
committerMikko Rasa <tdb@tdb.fi>
Wed, 7 Dec 2022 09:52:03 +0000 (11:52 +0200)
source/game/reflection.cpp
source/game/reflection.h

index d188e5081be09bccd32b605f7856f5dd84a31b67..43dd13a73e1c8ba01a64678aec85975213eb3eb8 100644 (file)
@@ -24,5 +24,12 @@ bool ClassBase::is_base_of(const ClassBase &other) const
        return ranges::any_of(other.bases, [this](const ClassBase *b){ return is_base_of(*b); });
 }
 
+
+ClassBase *Reflector::find_class(const type_index &type) const
+{
+       auto i = lower_bound(type);
+       return (i!=classes.end() && (*i)->get_type()==type ? i->get() : nullptr);
+}
+
 } // namespace Reflection
 } // namespace Msp::Game
index df974b113d3f32a22a1b1b36227d4be654a0193b..6d8535dec003e5d8d7ef3449ecc3ca01dea4dbaf 100644 (file)
@@ -93,8 +93,10 @@ private:
        std::vector<std::unique_ptr<ClassBase>>::const_iterator lower_bound(const std::type_index &) const;
 
 public:
+       ClassBase *find_class(const std::type_index &) const;
+
        template<typename T>
-       Class<T> *find_class() const;
+       Class<T> *find_class() const { return static_cast<Class<T> *>(find_class(typeid(T))); }
 
        template<typename T>
        Class<T> &get_or_create_class();
@@ -109,14 +111,6 @@ inline std::vector<std::unique_ptr<ClassBase>>::const_iterator Reflector::lower_
        return std::ranges::lower_bound(classes, type, {}, [](auto &c){ return c->get_type(); });
 }
 
-template<typename T>
-inline Class<T> *Reflector::find_class() const
-{
-       std::type_index type = typeid(T);
-       auto i = lower_bound(type);
-       return (i!=classes.end() && (*i)->get_type()==type ? static_cast<Class<T> *>(i->get()) : nullptr);
-}
-
 template<typename T>
 inline Class<T> &Reflector::get_or_create_class()
 {