Handle<Entity> get_entity() const { return entity; }
};
-template<typename T>
-class BufferedComponent: public Component
+template<typename T, typename Base = Component>
+ requires std::is_base_of_v<Component, Base>
+class BufferedComponent: public Base
{
public:
using Data = T;
bool written = false;
protected:
- BufferedComponent(Handle<Entity> e): Component(e) { }
+ using Base::Base;
const T &read() const;
T &write();
bool was_written() const { return written; }
};
-template<typename T>
-const T &BufferedComponent<T>::read() const
+template<typename T, typename Base>
+ requires std::is_base_of_v<Component, Base>
+const T &BufferedComponent<T, Base>::read() const
{
#ifdef DEBUG
AccessGuard::get_instance().check<AccessGuard::Read<T>>();
return data[read_index&1];
}
-template<typename T>
-T &BufferedComponent<T>::write()
+template<typename T, typename Base>
+ requires std::is_base_of_v<Component, Base>
+T &BufferedComponent<T, Base>::write()
{
#ifdef DEBUG
AccessGuard::get_instance().check<AccessGuard::Write<T>>();