template<typename T>
bool has_polymorphic_base() const { return dynamic_cast<const RootedPolymorphism<T> *>(polymorphism.get()); }
+
+protected:
+ void increment_generation() const;
};
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;
template<typename F>
std::vector<ClassBase *> find_classes_if(F &&) const;
+
+ unsigned get_generation() const { return generation; }
};
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());
}
return false;
}
+inline void ClassBase::increment_generation() const
+{
+ ++reflector.generation;
+}
+
template<typename T>
template<typename B>
++i;
}
- bases = std::move(candidate_bases);
+ if(candidate_bases!=bases)
+ {
+ bases = std::move(candidate_bases);
+ increment_generation();
+ }
}
} // namespace Reflection