]> git.tdb.fi Git - libs/game.git/commitdiff
Add a generation number to Reflector
authorMikko Rasa <tdb@tdb.fi>
Sun, 7 May 2023 12:27:46 +0000 (15:27 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 7 May 2023 12:27:46 +0000 (15:27 +0300)
source/game/reflection.h

index 7b75541f5c65bdbb8ce65dd95b67f259cc25af22..d42c86040d37e84fc70cee4706c22e4745636f82 100644 (file)
@@ -65,6 +65,9 @@ public:
 
        template<typename T>
        bool has_polymorphic_base() const { return dynamic_cast<const RootedPolymorphism<T> *>(polymorphism.get()); }
+
+protected:
+       void increment_generation() const;
 };
 
 
@@ -88,8 +91,11 @@ private:
 
 class MSPGAME_API Reflector
 {
+       friend class ClassBase;
+
 private:
        std::vector<std::unique_ptr<ClassBase>> classes;
+       unsigned generation = 0;
 
        std::vector<std::unique_ptr<ClassBase>>::const_iterator lower_bound(const std::type_index &) const;
 
@@ -104,6 +110,8 @@ public:
 
        template<typename F>
        std::vector<ClassBase *> find_classes_if(F &&) const;
+
+       unsigned get_generation() const { return generation; }
 };
 
 
@@ -118,7 +126,10 @@ inline Class<T> &Reflector::get_or_create_class()
        std::type_index type = typeid(T);
        auto i = lower_bound(type);
        if(i==classes.end() || (*i)->get_type()!=type)
+       {
                i = classes.emplace(i, std::make_unique<Class<T>>(std::ref(*this)));
+               ++generation;
+       }
        return static_cast<Class<T> &>(*i->get());
 }
 
@@ -152,6 +163,11 @@ inline bool ClassBase::is_instance(const T &obj) const
        return false;
 }
 
+inline void ClassBase::increment_generation() const
+{
+       ++reflector.generation;
+}
+
 
 template<typename T>
 template<typename B>
@@ -180,7 +196,11 @@ inline void Class<T>::check_bases(const T &obj)
                        ++i;
        }
 
-       bases = std::move(candidate_bases);
+       if(candidate_bases!=bases)
+       {
+               bases = std::move(candidate_bases);
+               increment_generation();
+       }
 }
 
 } // namespace Reflection