commit de042a580ccf19821e217c94bffd7fade82a9bb5 Author: Jorijn van der Graaf Date: Tue May 6 12:38:11 2025 +0200 initial commit diff --git a/Crafter.Component-Component.cpp b/Crafter.Component-Component.cpp new file mode 100644 index 0000000..38137be --- /dev/null +++ b/Crafter.Component-Component.cpp @@ -0,0 +1,26 @@ +module; + +module Crafter.Component; + +using namespace Crafter; + +Component::Component() { + +} + +Component::~Component() { + onDelete.Invoke(); +} + +void Component::AddOwner() +{ + refCount++; +} + +void Component::RemoveOwner() +{ + refCount--; + if (refCount == 0) { + delete this; + } +} diff --git a/Crafter.Component-Component.cppm b/Crafter.Component-Component.cppm new file mode 100644 index 0000000..404fe7b --- /dev/null +++ b/Crafter.Component-Component.cppm @@ -0,0 +1,19 @@ +module; + +#include + +export module Crafter.Component:Component; + +import Crafter.Event; + +namespace Crafter { + export class Component { + public: + Event onDelete; + std::uint32_t refCount = 0; + Component(); + virtual ~Component(); + void AddOwner(); + void RemoveOwner(); + }; +} diff --git a/Crafter.Component-ComponentRef.cppm b/Crafter.Component-ComponentRef.cppm new file mode 100644 index 0000000..607cb21 --- /dev/null +++ b/Crafter.Component-ComponentRef.cppm @@ -0,0 +1,134 @@ +module; + +#include +#include + +export module Crafter.Component:ComponentRef; + +import :Component; +import Crafter.Event; + +namespace Crafter { + export template + class ComponentRef { + public: + Event refChanged; + Event componentDeleted; + T* component; + ComponentRef() : component(nullptr) { + + }; + + ComponentRef(T* component) { + SetRef(component); + } + + virtual void SetRef(T* component) { + if (component != nullptr) { + onDeleteListener.SetEvent(&component->onDelete, [this, component]() { + this->componentDeleted.Invoke(component); + }); + } + refChanged.Invoke(component); + this->component = component; + } + protected: + EventListener onDeleteListener; + }; + + export template + class ComponentRefOwning : public ComponentRef { + public: + ComponentRefOwning() : ComponentRef() { + + }; + + ComponentRefOwning(T* component) : ComponentRef(component) { + component->AddOwner(); + } + ~ComponentRefOwning() { + if (ComponentRef::component) { + ComponentRef::component->RemoveOwner(); + } + } + + void SetRef(T* component) override { + if (this->component != nullptr) { + this->component->RemoveOwner(); + } + + if (component != nullptr) { + ComponentRef::onDeleteListener.SetEvent(&component->onDelete, [this, component]() { + this->componentDeleted.Invoke(component); + }); + component->AddOwner(); + } + this->component = component; + } + }; + + export template + class ComponentRefVector { + public: + Event componentRemoved; + Event componentDeleted; + Event componentAdded; + std::vector components; + + ComponentRefVector() { + + } + + ComponentRefVector(std::vector components) : components(components) { + + } + + virtual void AddComponent(T* component) { + componentAdded.Invoke(component); + components.push_back(component); + listeners.emplace_back(&component->onDelete, [this, component]() { + this->componentDeleted.Invoke(component); + components.erase(std::remove(components.begin(), components.end(), component), components.end()); + }); + } + + virtual void RemoveComponent(T* component) { + componentRemoved.Invoke(component); + auto it = find(components.begin(), components.end(), component); + int index = it - components.begin(); + components.erase(components.begin() + index); + } + private: + std::vector> listeners; + }; + + export template + class ComponentRefVectorOwning : public ComponentRefVector { + public: + ComponentRefVectorOwning() { + + } + + ComponentRefVectorOwning(std::vector components) : ComponentRefVector(components) { + + } + + ~ComponentRefVectorOwning() { + for (size_t i = 0; i < ComponentRefVector::components.size(); i++) + { + ComponentRefVector::components[i]->RemoveOwner(); + } + } + + void AddComponent(T* component) override { + ComponentRefVector::AddComponent(component); + component->AddOwner(); + + } + + void RemoveComponent(T* component) override { + ComponentRefVector::RemoveComponent(component); + component->RemoveOwner(); + } + }; +} \ No newline at end of file diff --git a/Crafter.Component.cppm b/Crafter.Component.cppm new file mode 100644 index 0000000..778458a --- /dev/null +++ b/Crafter.Component.cppm @@ -0,0 +1,4 @@ +export module Crafter.Component; + +export import :Component; +export import :ComponentRef; \ No newline at end of file diff --git a/bin/Crafter.Component-Component.pcm b/bin/Crafter.Component-Component.pcm new file mode 100644 index 0000000..e392a7a Binary files /dev/null and b/bin/Crafter.Component-Component.pcm differ diff --git a/bin/Crafter.Component-ComponentRef.pcm b/bin/Crafter.Component-ComponentRef.pcm new file mode 100644 index 0000000..a49a871 Binary files /dev/null and b/bin/Crafter.Component-ComponentRef.pcm differ diff --git a/bin/Crafter.Component.pcm b/bin/Crafter.Component.pcm new file mode 100644 index 0000000..3823bcc Binary files /dev/null and b/bin/Crafter.Component.pcm differ diff --git a/bin/Crafter.Event.pcm b/bin/Crafter.Event.pcm new file mode 100644 index 0000000..1f453e0 Binary files /dev/null and b/bin/Crafter.Event.pcm differ diff --git a/bin/Crafter.Thread-ThreadPool.pcm b/bin/Crafter.Thread-ThreadPool.pcm new file mode 100644 index 0000000..5d7b7d9 Binary files /dev/null and b/bin/Crafter.Thread-ThreadPool.pcm differ diff --git a/bin/Crafter.Thread.pcm b/bin/Crafter.Thread.pcm new file mode 100644 index 0000000..c09a4a6 Binary files /dev/null and b/bin/Crafter.Thread.pcm differ diff --git a/bin/libcrafter-component.a b/bin/libcrafter-component.a new file mode 100644 index 0000000..db9f40e Binary files /dev/null and b/bin/libcrafter-component.a differ diff --git a/bin/libcrafter-event.a b/bin/libcrafter-event.a new file mode 100644 index 0000000..751e346 Binary files /dev/null and b/bin/libcrafter-event.a differ diff --git a/bin/libcrafter-thread.a b/bin/libcrafter-thread.a new file mode 100644 index 0000000..1db2b98 Binary files /dev/null and b/bin/libcrafter-thread.a differ diff --git a/build/Crafter.Component-Component.o b/build/Crafter.Component-Component.o new file mode 100644 index 0000000..ca485e5 Binary files /dev/null and b/build/Crafter.Component-Component.o differ diff --git a/build/Crafter.Component-ComponentRef.o b/build/Crafter.Component-ComponentRef.o new file mode 100644 index 0000000..5d6cf40 Binary files /dev/null and b/build/Crafter.Component-ComponentRef.o differ diff --git a/build/Crafter.Component-Component_source.o b/build/Crafter.Component-Component_source.o new file mode 100644 index 0000000..20fc6ec Binary files /dev/null and b/build/Crafter.Component-Component_source.o differ diff --git a/build/Crafter.Component.o b/build/Crafter.Component.o new file mode 100644 index 0000000..6e43fd2 Binary files /dev/null and b/build/Crafter.Component.o differ diff --git a/build/debug/Crafter.Component-Component.o b/build/debug/Crafter.Component-Component.o new file mode 100644 index 0000000..c6b0bb0 Binary files /dev/null and b/build/debug/Crafter.Component-Component.o differ diff --git a/build/debug/Crafter.Component-ComponentRef.o b/build/debug/Crafter.Component-ComponentRef.o new file mode 100644 index 0000000..8489dcf Binary files /dev/null and b/build/debug/Crafter.Component-ComponentRef.o differ diff --git a/build/debug/Crafter.Component-Component_source.o b/build/debug/Crafter.Component-Component_source.o new file mode 100644 index 0000000..482b8c0 Binary files /dev/null and b/build/debug/Crafter.Component-Component_source.o differ diff --git a/build/debug/Crafter.Component.o b/build/debug/Crafter.Component.o new file mode 100644 index 0000000..b48e879 Binary files /dev/null and b/build/debug/Crafter.Component.o differ diff --git a/project.json b/project.json new file mode 100644 index 0000000..3f01f2e --- /dev/null +++ b/project.json @@ -0,0 +1,38 @@ +{ + "name": "crafter-component", + "configurations": [ + { + "name": "base", + "standard": "c++26", + "source_files": ["Crafter.Component-Component"], + "module_files": ["Crafter.Component","Crafter.Component-ComponentRef","Crafter.Component-Component"], + "additional_files": [], + "build_dir": "./build", + "output_dir": "./bin", + "type":"library" + }, + { + "name": "debug", + "extends": ["base"], + "optimization_level": "0", + "debug":true, + "dependencies": [ + { + "path":"/home/jorijn/repos/Crafter/Crafter.Event/project.json", + "configuration":"debug" + } + ] + }, + { + "name": "release", + "extends": ["base"], + "optimization_level": "3", + "dependencies": [ + { + "path":"/home/jorijn/repos/Crafter/Crafter.Event/project.json", + "configuration":"debug" + } + ] + } + ] +}