diff options
| author | Léo Lam <leo@leolam.fr> | 2020-06-05 17:09:06 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-08-18 22:50:25 +0200 |
| commit | 2de366be0fa75e571c605e017b5604bccbdb75bf (patch) | |
| tree | b8044fc96bba792b1875067032da2fd4498a44a3 /src/KingSystem/ActorSystem/actBaseProcMap.h | |
Initial commit
Diffstat (limited to 'src/KingSystem/ActorSystem/actBaseProcMap.h')
| -rw-r--r-- | src/KingSystem/ActorSystem/actBaseProcMap.h | 61 |
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 |
