async conveyor stuff
This commit is contained in:
parent
021ed589d3
commit
fe19899694
|
@ -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<ConveyorNode> &&node_p, ConveyorStorage* storage_p = nullptr);
|
||||
virtual ~ConveyorBase() = default;
|
||||
|
||||
void get(ErrorOrValue& err_or_val);
|
||||
};
|
||||
|
||||
template <typename T> 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 <typename T> class ConvertConveyorNode : public ConveyorNode {};
|
||||
|
@ -244,12 +250,12 @@ ErrorOr<T> Conveyor<T>::take(){
|
|||
if(storage->queued() > 0){
|
||||
ErrorOr<T> result;
|
||||
node->get(result);
|
||||
return result;
|
||||
return ErrorOr<T>{result};
|
||||
}else{
|
||||
return recoverableError("Conveyor buffer has no elements");
|
||||
return ErrorOr<T>{recoverableError("Conveyor buffer has no elements")};
|
||||
}
|
||||
}else{
|
||||
return criticalError("Conveyor in invalid state");
|
||||
return ErrorOr<T>{criticalError("Conveyor in invalid state")};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -336,4 +342,11 @@ template <typename T>
|
|||
size_t AdaptConveyorNode<T>::space() const {
|
||||
return std::numeric_limits<size_t>::max() - storage.size();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void AdaptConveyorNode<T>::get(ErrorOrValue& err_or_val) override {
|
||||
if(storage.size() > 0){
|
||||
err_or_val.as<>() = 0;
|
||||
}
|
||||
}
|
||||
} // namespace gin
|
|
@ -29,6 +29,16 @@ Error noError();
|
|||
class ErrorOrValue {
|
||||
public:
|
||||
virtual ~ErrorOrValue() = default;
|
||||
|
||||
template<typename T>
|
||||
ErrorOr<T>& as(){
|
||||
return reinterpret_cast<ErrorOr<T>&>(*this);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
const ErrorOr<T>& as() const {
|
||||
return reinterpret_cast<const ErrorOr<T>&>(*this);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> class ErrorOr : public ErrorOrValue {
|
||||
|
@ -36,6 +46,7 @@ private:
|
|||
std::variant<T, Error> 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<T>(value_or_error); }
|
||||
};
|
||||
} // namespace gin
|
||||
} // namespace gin
|
|
@ -15,7 +15,7 @@ GIN_TEST("Async"){
|
|||
|
||||
feeder_conveyor.feeder->feed(5);
|
||||
|
||||
ErrorOr<size_t> foo = feeder_conveyor.conveyor->take();
|
||||
ErrorOr<size_t> foo = feeder_conveyor.conveyor.take();
|
||||
|
||||
GIN_EXPECT(foo == 5, "Values not 5");
|
||||
GIN_EXPECT(foo.isValue() && foo.value() == 5, "Values not 5");
|
||||
}
|
Loading…
Reference in New Issue