#define MSP_GAME_OWNED_H_
#include <stdexcept>
+#include "accessguard.h"
#include "events.h"
#include "handle.h"
#include "stage.h"
Owned(Handle<P>, Args &&...);
template<typename P, typename... Args>
+ Owned(Owned<P> &p, Args &&... a): Owned(static_cast<Handle<P> &>(p), std::forward<Args>(a)...) { }
+
+ template<typename P, typename... Args>
+ requires(!std::is_const_v<P>)
Owned(P &parent, Args &&... args): Owned(Handle<P>::from_object(&parent), std::forward<Args>(args)...) { }
Owned(Owned &&other): Handle<T>(other) { other.ptr = nullptr; }
template<typename P, typename... Args>
Owned<T>::Owned(Handle<P> parent, Args &&... args)
{
+#ifdef DEBUG
+ AccessGuard::get_instance().check<AccessGuard::Create>();
+#endif
+
if(!parent)
throw std::invalid_argument("Owned::Owned");
Stage &stage = get_stage(*parent);
- Pool<T> &pool = stage.get_pools().template get_pool<T>();
+ Pool<T> &pool = stage.get_pools().get_pool<T>();
+ bool first_created = !pool.get_capacity();
this->ptr = pool.create(parent, std::forward<Args>(args)...);
if constexpr(std::is_base_of_v<Component, T>)
{
+ if(first_created)
+ stage.get_reflector().get_or_create_class<T>().template set_polymorphic_base<Component>(**this);
parent->add_component(*this);
stage.get_event_source().emit<Events::ComponentCreated>(*this);
}
else
{
+ if(first_created)
+ stage.get_reflector().get_or_create_class<T>().template set_polymorphic_base<Entity>(**this);
parent->add_child(*this);
stage.get_event_source().emit<Events::EntityCreated>(*this);
}
if(!obj)
return;
+#ifdef DEBUG
+ AccessGuard::get_instance().check<AccessGuard::Destroy>();
+#endif
+
Stage &stage = get_stage(*obj);
if constexpr(std::is_base_of_v<Component, T>)
parent->remove_child(*this);
}
- Pool<T> &pool = stage.get_pools().template get_pool<T>();
+ Pool<T> &pool = stage.get_pools().get_pool<T>();
pool.destroy(this->ptr);
}