fixing storage merge nodes
This commit is contained in:
parent
622e6c4a7a
commit
23982922d4
|
@ -811,6 +811,8 @@ private:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getAppendageResult(ErrorOrValue &eov);
|
||||||
|
|
||||||
size_t space() const override;
|
size_t space() const override;
|
||||||
|
|
||||||
size_t queued() const override;
|
size_t queued() const override;
|
||||||
|
@ -826,6 +828,7 @@ private:
|
||||||
friend class Appendage;
|
friend class Appendage;
|
||||||
|
|
||||||
Our<MergeConveyorNodeData<T>> data;
|
Our<MergeConveyorNodeData<T>> data;
|
||||||
|
size_t next_appendage = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MergeConveyorNode(Our<MergeConveyorNodeData<T>> data);
|
MergeConveyorNode(Our<MergeConveyorNodeData<T>> data);
|
||||||
|
@ -848,8 +851,6 @@ template <typename T> class MergeConveyorNodeData {
|
||||||
public:
|
public:
|
||||||
std::vector<Own<typename MergeConveyorNode<T>::Appendage>> appendages;
|
std::vector<Own<typename MergeConveyorNode<T>::Appendage>> appendages;
|
||||||
|
|
||||||
size_t next_appendage = 0;
|
|
||||||
|
|
||||||
MergeConveyorNode<T> *merger = nullptr;
|
MergeConveyorNode<T> *merger = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -270,20 +270,20 @@ MergeConveyorNode<T>::MergeConveyorNode(Our<MergeConveyorNodeData<T>> d)
|
||||||
template <typename T> MergeConveyorNode<T>::~MergeConveyorNode() {}
|
template <typename T> MergeConveyorNode<T>::~MergeConveyorNode() {}
|
||||||
|
|
||||||
template <typename T> void MergeConveyorNode<T>::getResult(ErrorOrValue &eov) {
|
template <typename T> void MergeConveyorNode<T>::getResult(ErrorOrValue &eov) {
|
||||||
ErrorOr<T> &err_or_val = eov.as<T>();
|
ErrorOr<FixVoid<T>> &err_or_val = eov.as<FixVoid<T>>();
|
||||||
|
|
||||||
if (error_or_value.has_value()) {
|
GIN_ASSERT(data) { return; }
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @todo search appendages for result
|
/// @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 <typename T> void MergeConveyorNode<T>::fire() {
|
template <typename T> void MergeConveyorNode<T>::fire() {
|
||||||
|
@ -342,6 +342,19 @@ template <typename T> size_t MergeConveyorNode<T>::Appendage::queued() const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void MergeConveyorNode<T>::Appendage::getAppendageResult(ErrorOrValue &eov) {
|
||||||
|
ErrorOr<FixVoid<T>> &eov = eov.as<FixVoid<T>>();
|
||||||
|
|
||||||
|
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 <typename T> void MergeConveyorNode<T>::Appendage::childHasFired() {
|
template <typename T> void MergeConveyorNode<T>::Appendage::childHasFired() {
|
||||||
GIN_ASSERT(!error_or_value.has_value()) { return; }
|
GIN_ASSERT(!error_or_value.has_value()) { return; }
|
||||||
ErrorOr<FixVoid<T>> eov;
|
ErrorOr<FixVoid<T>> eov;
|
||||||
|
|
Loading…
Reference in New Issue