From 23982922d4a6d0281b0270dfc3fd50f1c7b3b81a Mon Sep 17 00:00:00 2001 From: keldu Date: Sun, 3 Oct 2021 18:27:54 +0200 Subject: [PATCH] fixing storage merge nodes --- source/kelgin/async.h | 5 +++-- source/kelgin/async.tmpl.h | 35 ++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/source/kelgin/async.h b/source/kelgin/async.h index 2a6d998..0067572 100644 --- a/source/kelgin/async.h +++ b/source/kelgin/async.h @@ -811,6 +811,8 @@ private: return false; } + void getAppendageResult(ErrorOrValue &eov); + size_t space() const override; size_t queued() const override; @@ -826,6 +828,7 @@ private: friend class Appendage; Our> data; + size_t next_appendage = 0; public: MergeConveyorNode(Our> data); @@ -848,8 +851,6 @@ template class MergeConveyorNodeData { public: std::vector::Appendage>> appendages; - size_t next_appendage = 0; - MergeConveyorNode *merger = nullptr; public: diff --git a/source/kelgin/async.tmpl.h b/source/kelgin/async.tmpl.h index 9494eb5..c35e2a1 100644 --- a/source/kelgin/async.tmpl.h +++ b/source/kelgin/async.tmpl.h @@ -270,20 +270,20 @@ MergeConveyorNode::MergeConveyorNode(Our> d) template MergeConveyorNode::~MergeConveyorNode() {} template void MergeConveyorNode::getResult(ErrorOrValue &eov) { - ErrorOr &err_or_val = eov.as(); + ErrorOr> &err_or_val = eov.as>(); - if (error_or_value.has_value()) { - err_or_val = std::move(error_or_value.value()); - error_or_value = std::nullopt; - } else { - error_or_value = criticalError("No value in MergeConveyorNode"); - } + GIN_ASSERT(data) { return; } - GIN_ASSERT(data){ - return; - } - /// @todo search appendages for result + + auto &appendages = data->appendages; + next_appendage = std::min(appendages.size(), next_appendage); + + for (size_t i = next_appendage; i < appendages.size(); ++i) { + if (appendages[i]->queued()) { + err_or_val = std::move(appendages + } + } } template void MergeConveyorNode::fire() { @@ -342,6 +342,19 @@ template size_t MergeConveyorNode::Appendage::queued() const { return 0; } +template +void MergeConveyorNode::Appendage::getAppendageResult(ErrorOrValue &eov) { + ErrorOr> &eov = eov.as>(); + + GIN_ASSERT(queued() > 0) { + eov = criticalError("No element queued in Merge Appendage Node"); + return; + } + + eov = std::move(error_or_value.value()); + error_or_value = std::nullopt; +} + template void MergeConveyorNode::Appendage::childHasFired() { GIN_ASSERT(!error_or_value.has_value()) { return; } ErrorOr> eov;