async conveyor stuff

This commit is contained in:
keldu 2020-08-18 22:38:36 +02:00
parent 021ed589d3
commit fe19899694
3 changed files with 30 additions and 6 deletions

View File

@ -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

View File

@ -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

View File

@ -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");
}