#define MSP_GAME_COMPONENT_H_
#include <msp/time/timedelta.h>
+#include "accessguard.h"
#include "handle.h"
+#include "mspgame_api.h"
namespace Msp::Game {
class Entity;
-class Component
+class MSPGAME_API Component
{
protected:
Handle<Entity> entity;
Handle<Entity> get_entity() const { return entity; }
};
+template<typename T>
+class BufferedComponent: public Component
+{
+public:
+ using Data = T;
+
+protected:
+ T data[2];
+ uint8_t read_index = 0;
+ uint8_t write_index = 0;
+ bool written = false;
+
+ BufferedComponent(Handle<Entity> e): Component(e) { }
+
+ const T &read() const;
+ T &write();
+
+public:
+ virtual void prepare_tick() { write_index = 1-read_index; written = false; }
+ virtual void commit_tick() { if(written) read_index = write_index; }
+};
+
+template<typename T>
+const T &BufferedComponent<T>::read() const
+{
+#ifdef DEBUG
+ AccessGuard::get_instance().check<AccessGuard::Read<T>>();
+#endif
+ return data[read_index];
+}
+
+template<typename T>
+T &BufferedComponent<T>::write()
+{
+#ifdef DEBUG
+ AccessGuard::get_instance().check<AccessGuard::Write<T>>();
+#endif
+ if(!written && write_index!=read_index)
+ {
+ data[write_index] = data[read_index];
+ written = true;
+ }
+ return data[write_index];
+}
+
} // namespace Msp::Game
#endif