#pragma once #include #include #include #include #include // internal id enum class Object : uint32_t {}; using ObjectRegistry = entt::basic_registry; using ObjectHandle = entt::basic_handle; // fwd struct ObjectStore2; struct StorageBackendI { // OR or OS ? ObjectStore2& _os; StorageBackendI(ObjectStore2& os); // ========== write object to storage ========== using write_to_storage_fetch_data_cb = uint64_t(uint8_t* request_buffer, uint64_t buffer_size); // calls data_cb with a buffer to be filled in, cb returns actual count of data. if returned < max, its the last buffer. virtual bool write(Object o, std::function& data_cb) = 0; //virtual bool write(Object o, const uint8_t* data, const uint64_t data_size); // default impl bool write(Object o, const ByteSpan data); // ========== read object from storage ========== using read_from_storage_put_data_cb = void(const ByteSpan buffer); virtual bool read(Object o, std::function& data_cb) = 0; }; namespace ObjectStore::Events { struct ObjectConstruct { const ObjectHandle e; }; struct ObjectUpdate { const ObjectHandle e; }; struct ObjectDestory { const ObjectHandle e; }; } // ObjectStore::Events enum class ObjectStore_Event : uint16_t { object_construct, object_update, object_destroy, MAX }; struct ObjectStoreEventI { using enumType = ObjectStore_Event; virtual ~ObjectStoreEventI(void) {} virtual bool onEvent(const ObjectStore::Events::ObjectConstruct&) { return false; } virtual bool onEvent(const ObjectStore::Events::ObjectUpdate&) { return false; } virtual bool onEvent(const ObjectStore::Events::ObjectDestory&) { return false; } }; using ObjectStoreEventProviderI = EventProviderI; struct ObjectStore2 : public ObjectStoreEventProviderI { static constexpr const char* version {"2"}; ObjectRegistry _reg; // TODO: default backend? ObjectStore2(void); virtual ~ObjectStore2(void); ObjectRegistry& registry(void); ObjectHandle objectHandle(const Object o); // TODO: properly think about multiple objects witht he same id / different backends ObjectHandle getOneObjectByID(const ByteSpan id); // sync? void throwEventConstruct(const Object o); void throwEventUpdate(const Object o); void throwEventDestroy(const Object o); };