summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcMap.h
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-06-05 17:09:06 +0200
committerLéo Lam <leo@leolam.fr>2020-08-18 22:50:25 +0200
commit2de366be0fa75e571c605e017b5604bccbdb75bf (patch)
treeb8044fc96bba792b1875067032da2fd4498a44a3 /src/KingSystem/ActorSystem/actBaseProcMap.h
Initial commit
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcMap.h')
-rw-r--r--src/KingSystem/ActorSystem/actBaseProcMap.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/KingSystem/ActorSystem/actBaseProcMap.h b/src/KingSystem/ActorSystem/actBaseProcMap.h
new file mode 100644
index 00000000..9cbe42c9
--- /dev/null
+++ b/src/KingSystem/ActorSystem/actBaseProcMap.h
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "KingSystem/Utils/StrTreeMap.h"
+
+namespace ksys::act {
+
+class BaseProc;
+
+class BaseProcMapNode final : public util::StrTreeMapNode {
+public:
+ explicit BaseProcMapNode(BaseProc* proc) : mProc(proc) {}
+ ~BaseProcMapNode() override;
+
+ // NON_MATCHING: addressing mode for mPrev
+ void erase_() override {
+ if (mPrev)
+ mPrev->mNext = mNext;
+
+ if (mNext)
+ mNext->mPrev = mPrev;
+
+ StrTreeMapNode::erase_();
+ mInserted = false;
+ mPrev = mNext = nullptr;
+ }
+
+ util::StrTreeMapKey& key() { return mKey; }
+ const util::StrTreeMapKey& key() const { return mKey; }
+ BaseProc* proc() const { return mProc; }
+ BaseProcMapNode* prev() const { return mPrev; }
+ BaseProcMapNode* next() const { return mNext; }
+
+ void add(BaseProcMapNode* node);
+
+ bool isInserted() const { return mInserted; }
+ void setInserted() { mInserted = true; }
+
+private:
+ BaseProc* mProc = nullptr;
+ BaseProcMapNode* mPrev = nullptr;
+ BaseProcMapNode* mNext = nullptr;
+ bool mInserted = false;
+};
+
+class BaseProcMap : public util::StrTreeMap<BaseProcMapNode> {
+public:
+ void insert(BaseProcMapNode* node);
+
+ void erase(BaseProcMapNode* node) {
+ auto prev = node->prev();
+ auto next = node->next();
+ if (prev)
+ node->erase_();
+ else if (next)
+ StrTreeMap::insert(next);
+ else
+ StrTreeMap::erase(node->key());
+ }
+};
+
+} // namespace ksys::act