throw std::invalid_argument("Owned::Owned");
Stage &stage = get_stage(*parent);
+ /* TODO Add a flag to only do this when first_created in an outer call is
+ true. */
+ if(typeid(*parent)==typeid(P))
+ {
+ Reflection::Class<P> &parent_class = stage.get_reflector().get_or_create_class<P>();
+ if(!parent_class.is_up_to_date())
+ parent_class.template set_polymorphic_base<Entity>(*parent);
+ }
+
Pool<T> &pool = stage.get_pools().get_pool<T>();
bool first_created = !pool.get_capacity();
this->ptr = pool.create(parent, std::forward<Args>(args)...);
std::string name;
std::vector<const ClassBase *> bases;
std::unique_ptr<PolymorphismBase> polymorphism;
+ unsigned generation = 0;
ClassBase(Reflector &, std::type_index);
public:
template<typename T>
bool has_polymorphic_base() const { return dynamic_cast<const RootedPolymorphism<T> *>(polymorphism.get()); }
+ bool is_up_to_date() const;
+
protected:
void increment_generation() const;
};
return false;
}
+inline bool ClassBase::is_up_to_date() const
+{
+ return generation==reflector.get_generation();
+}
+
inline void ClassBase::increment_generation() const
{
++reflector.generation;
template<typename B>
inline void Class<T>::check_bases(const T &obj)
{
+ if(typeid(obj)!=type)
+ throw std::invalid_argument("Class::check_bases");
+
std::vector<const ClassBase *> candidate_bases;
for(const ClassBase *b: reflector.find_classes_if([](const ClassBase &c){ return c.has_polymorphic_base<B>(); }))
if(b!=this && b->is_instance<B>(obj))
bases = std::move(candidate_bases);
increment_generation();
}
+ generation = reflector.get_generation();
}
} // namespace Reflection