diff --git a/source/async.h b/source/async.h index 39e1328..8f7ce82 100644 --- a/source/async.h +++ b/source/async.h @@ -20,6 +20,8 @@ public: virtual ~ConveyorNode() = default; void setParent(ConveyorNode *p); + + virtual void get(ErrorOrValue& err_or_val) = 0; }; class ConveyorStorage { @@ -38,6 +40,8 @@ protected: public: ConveyorBase(Own &&node_p, ConveyorStorage* storage_p = nullptr); virtual ~ConveyorBase() = default; + + void get(ErrorOrValue& err_or_val); }; template class Conveyor; @@ -196,6 +200,8 @@ public: size_t space() const override; size_t queued() const override; + + void get(ErrorOrValue& err_or_val) override; }; template class ConvertConveyorNode : public ConveyorNode {}; @@ -244,12 +250,12 @@ ErrorOr Conveyor::take(){ if(storage->queued() > 0){ ErrorOr result; node->get(result); - return result; + return ErrorOr{result}; }else{ - return recoverableError("Conveyor buffer has no elements"); + return ErrorOr{recoverableError("Conveyor buffer has no elements")}; } }else{ - return criticalError("Conveyor in invalid state"); + return ErrorOr{criticalError("Conveyor in invalid state")}; } } @@ -336,4 +342,11 @@ template size_t AdaptConveyorNode::space() const { return std::numeric_limits::max() - storage.size(); } + +template +void AdaptConveyorNode::get(ErrorOrValue& err_or_val) override { + if(storage.size() > 0){ + err_or_val.as<>() = 0; + } +} } // namespace gin \ No newline at end of file diff --git a/source/error.h b/source/error.h index 111f8de..5f4ec9d 100644 --- a/source/error.h +++ b/source/error.h @@ -29,6 +29,16 @@ Error noError(); class ErrorOrValue { public: virtual ~ErrorOrValue() = default; + + template + ErrorOr& as(){ + return reinterpret_cast&>(*this); + } + + template + const ErrorOr& as() const { + return reinterpret_cast&>(*this); + } }; template class ErrorOr : public ErrorOrValue { @@ -36,6 +46,7 @@ private: std::variant value_or_error; public: + ErrorOr() = default; ErrorOr(const T &value) : value_or_error{value} {} ErrorOr(T &&value) : value_or_error{std::move(value)} {} @@ -55,4 +66,4 @@ public: const T &value() const { return std::get(value_or_error); } }; -} // namespace gin +} // namespace gin \ No newline at end of file diff --git a/test/async.cpp b/test/async.cpp index b26f8c1..7d24bfa 100644 --- a/test/async.cpp +++ b/test/async.cpp @@ -15,7 +15,7 @@ GIN_TEST("Async"){ feeder_conveyor.feeder->feed(5); - ErrorOr foo = feeder_conveyor.conveyor->take(); + ErrorOr foo = feeder_conveyor.conveyor.take(); - GIN_EXPECT(foo == 5, "Values not 5"); + GIN_EXPECT(foo.isValue() && foo.value() == 5, "Values not 5"); } \ No newline at end of file