working on simple adapt pipeline/conveyor nodes
This commit is contained in:
parent
e353c4aef4
commit
470cf18227
|
@ -5,6 +5,32 @@
|
||||||
namespace gin {
|
namespace gin {
|
||||||
namespace {
|
namespace {
|
||||||
thread_local EventLoop *local_loop = nullptr;
|
thread_local EventLoop *local_loop = nullptr;
|
||||||
|
|
||||||
|
EventLoop ¤tEventLoop() {
|
||||||
|
EventLoop *loop = local_loop;
|
||||||
|
assert(loop);
|
||||||
|
return *loop;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
ConveyorNode::ConveyorNode() : child{nullptr}, parent{nullptr} {}
|
||||||
|
|
||||||
|
ConveyorNode::ConveyorNode(Own<ConveyorNode> &&node)
|
||||||
|
: child{std::move(node)}, parent{nullptr} {}
|
||||||
|
|
||||||
|
void ConveyorNode::setParent(ConveyorNode *p) { parent = p; }
|
||||||
|
|
||||||
|
PropagateError::Helper::Helper(Error &&error) : error{std::move(error)} {}
|
||||||
|
|
||||||
|
Error PropagateError::Helper::asError() { return std::move(error); }
|
||||||
|
|
||||||
|
PropagateError::Helper PropagateError::operator()(const Error &error) const {
|
||||||
|
Error err{error};
|
||||||
|
return PropagateError::Helper{std::move(err)};
|
||||||
|
}
|
||||||
|
|
||||||
|
PropagateError::Helper PropagateError::operator()(Error &&error) {
|
||||||
|
return PropagateError::Helper{std::move(error)};
|
||||||
}
|
}
|
||||||
|
|
||||||
Event::Event(EventLoop &loop) : loop{loop} {}
|
Event::Event(EventLoop &loop) : loop{loop} {}
|
||||||
|
@ -146,4 +172,6 @@ void WaitScope::wait(const std::chrono::steady_clock::time_point &time_point) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaitScope::poll() { loop.poll(); }
|
void WaitScope::poll() { loop.poll(); }
|
||||||
|
|
||||||
|
class YieldConveyorNode final : public ConveyorNode {};
|
||||||
} // namespace gin
|
} // namespace gin
|
144
source/async.h
144
source/async.h
|
@ -1,31 +1,43 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
class ConveyorNode {
|
class ConveyorNode {
|
||||||
private:
|
private:
|
||||||
Own<ConveyorNode> node;
|
Own<ConveyorNode> child;
|
||||||
ConveyorNode* parent = nullptr;
|
ConveyorNode *parent = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ConveyorNode();
|
ConveyorNode();
|
||||||
ConveyorNode(Own<ConveyorNode>&& node);
|
ConveyorNode(Own<ConveyorNode> &&child);
|
||||||
virtual ~ConveyorNode() = default;
|
virtual ~ConveyorNode() = default;
|
||||||
|
|
||||||
void setParent(ConveyorNode* p);
|
void setParent(ConveyorNode *p);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConveyorBase {
|
class ConveyorBase {
|
||||||
private:
|
private:
|
||||||
Own<ConveyorNode> node;
|
Own<ConveyorNode> node;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ConveyorBase(Own<ConveyorNode>&& node);
|
ConveyorBase(Own<ConveyorNode> &&node);
|
||||||
virtual ~ConveyorBase() = default;
|
virtual ~ConveyorBase() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ConveyorStorage {
|
||||||
|
public:
|
||||||
|
virtual ~ConveyorStorage() = default;
|
||||||
|
|
||||||
|
virtual size_t space() const = 0;
|
||||||
|
virtual size_t queued() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T> class Conveyor;
|
template <typename T> class Conveyor;
|
||||||
|
|
||||||
template <typename T> Conveyor<T> chainedConveyorType(T *);
|
template <typename T> Conveyor<T> chainedConveyorType(T *);
|
||||||
|
@ -40,44 +52,45 @@ using ConveyorResult = ChainedConveyors<ReturnType<Func, T>>;
|
||||||
|
|
||||||
struct PropagateError {
|
struct PropagateError {
|
||||||
public:
|
public:
|
||||||
struct PropagateErrorHelper {
|
struct Helper {
|
||||||
|
private:
|
||||||
Error error;
|
Error error;
|
||||||
|
|
||||||
PropagateError asError();
|
public:
|
||||||
|
Helper(Error &&error);
|
||||||
|
|
||||||
|
Error asError();
|
||||||
};
|
};
|
||||||
|
|
||||||
PropagateErrorHelper operator(const Error& error) const;
|
PropagateError::Helper operator()(const Error &error) const;
|
||||||
PropagateErrorHelper operator(Error&& error);
|
PropagateError::Helper operator()(Error &&error);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T> class Conveyor : public ConveyorBase {
|
template <typename T> class Conveyor : public ConveyorBase {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
template <typename Func, typename ErrorFunc>
|
template <typename Func, typename ErrorFunc = PropagateError>
|
||||||
ConveyorResult<Func, T> then(Func &&func, ErrorFunc &&error_func);
|
ConveyorResult<Func, T> then(Func &&func,
|
||||||
|
ErrorFunc &&error_func = PropagateError());
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template <typename T> class ConveyorFeeder {
|
||||||
class ConveyorFeeder {
|
|
||||||
private:
|
|
||||||
Conveyor<T>* entry = nullptr;
|
|
||||||
|
|
||||||
friend class Conveyor<T>;
|
|
||||||
|
|
||||||
void entryDestroyed();
|
|
||||||
public:
|
public:
|
||||||
ConveyorFeeder(Conveyor<T>& conv);
|
virtual ~ConveyorFeeder() = default;
|
||||||
void feed(T&& data);
|
|
||||||
|
virtual void feed(T &&data) = 0;
|
||||||
|
virtual void fail(Error &&error) = 0;
|
||||||
|
|
||||||
|
virtual size_t space() const = 0;
|
||||||
|
virtual size_t queued() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template <typename T> struct ConveyorAndFeeder {
|
||||||
struct ConveyorAndFeeder {
|
|
||||||
Own<ConveyorFeeder<T>> feeder;
|
Own<ConveyorFeeder<T>> feeder;
|
||||||
Conveyor<T> conveyor;
|
Conveyor<T> conveyor;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template <typename T> ConveyorFeeder<T> newConveyorAndFeeder();
|
||||||
ConveyorFeeder<T> newConveyorAndFeeder();
|
|
||||||
|
|
||||||
class EventLoop;
|
class EventLoop;
|
||||||
class Event {
|
class Event {
|
||||||
|
@ -139,23 +152,94 @@ public:
|
||||||
void poll();
|
void poll();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Secret stuff
|
||||||
|
// Aka private semi hidden classes
|
||||||
|
|
||||||
|
template <typename T> class AdaptConveyorNode;
|
||||||
|
|
||||||
|
template <typename T> class AdaptConveyorFeeder : public ConveyorFeeder<T> {
|
||||||
|
private:
|
||||||
|
AdaptConveyorNode<T> *feedee = nullptr;
|
||||||
|
|
||||||
|
std::queue<T> storage;
|
||||||
|
|
||||||
|
public:
|
||||||
|
~AdaptConveyorFeeder();
|
||||||
|
|
||||||
|
void setFeedee(AdaptConveyorNode<T> *feedee);
|
||||||
|
|
||||||
|
void feed(T &&value) override;
|
||||||
|
void fail(Error &&error) override;
|
||||||
|
|
||||||
|
size_t space() const override;
|
||||||
|
size_t queued() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class AdaptConveyorNode : public ConveyorNode, public ConveyorStorage {
|
||||||
|
private:
|
||||||
|
AdaptConveyorFeeder<T> *feeder = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
~AdaptConveyorNode();
|
||||||
|
|
||||||
|
void setFeeder(AdaptConveyorFeeder<T> *feeder);
|
||||||
|
|
||||||
|
size_t space() const override;
|
||||||
|
size_t queued() const override;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T> class ConvertConveyorNode : public ConveyorNode {};
|
template <typename T> class ConvertConveyorNode : public ConveyorNode {};
|
||||||
|
|
||||||
|
class QueueBufferConveyorNodeBase : public ConveyorNode,
|
||||||
|
public ConveyorStorage {
|
||||||
|
public:
|
||||||
|
virtual ~QueueBufferConveyorNodeBase() = default;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T, size_t S>
|
template <typename T, size_t S>
|
||||||
class QueueBufferConveyorNode : public ConveyorNode, public Event {
|
class QueueBufferConveyorNode : public QueueBufferConveyorNodeBase,
|
||||||
|
public Event {
|
||||||
private:
|
private:
|
||||||
std::queue<T, std::array<T,S>> storage;
|
std::queue<T, std::array<T, S>> storage;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void fire() override;
|
void fire() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template <typename T>
|
||||||
class QueueBufferConveyorNode<T> : public ConveyorNode, public Event {
|
class QueueBufferConveyorNode<T, 0> : public QueueBufferConveyorNodeBase,
|
||||||
|
public Event {
|
||||||
private:
|
private:
|
||||||
std::queue<T> storage;
|
std::queue<T> storage;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void fire() override;
|
void fire() override;
|
||||||
};
|
};
|
||||||
} // namespace gin
|
} // namespace gin
|
||||||
// Template inlining
|
// Template inlining
|
||||||
namespace ent {}
|
namespace gin {
|
||||||
|
template <typename T> AdaptConveyorFeeder<T>::~AdaptConveyorFeeder() {
|
||||||
|
if (feedee) {
|
||||||
|
feedee->setFeeder(nullptr);
|
||||||
|
feedee = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void AdaptConveyorFeeder<T>::setFeedee(AdaptConveyorNode<T> *feedee_p) {
|
||||||
|
feedee = feedee_p;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> AdaptConveyorNode<T>::~AdaptConveyorNode() {
|
||||||
|
if (feeder) {
|
||||||
|
feeder->setFeedee(nullptr);
|
||||||
|
feeder = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void AdaptConveyorNode<T>::setFeeder(AdaptConveyorFeeder<T> *feeder_p) {
|
||||||
|
feeder = feeder_p;
|
||||||
|
}
|
||||||
|
} // namespace gin
|
|
@ -1,5 +1,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
|
LogIo::LogIo(EventLoop &loop) : loop{loop} {}
|
||||||
|
|
||||||
}
|
Log::Log(LogIo ¢ral, EventLoop &loop) : central{central}, loop{loop} {}
|
||||||
|
} // namespace gin
|
32
source/log.h
32
source/log.h
|
@ -4,25 +4,23 @@
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
class EventLoop;
|
class EventLoop;
|
||||||
class LogIo {
|
class LogIo;
|
||||||
private:
|
|
||||||
EventLoop& loop;
|
|
||||||
public:
|
|
||||||
LogIo(EventLoop& loop);
|
|
||||||
};
|
|
||||||
|
|
||||||
class Log {
|
class Log {
|
||||||
public:
|
public:
|
||||||
enum class Type : uint8_t {
|
enum class Type : uint8_t { Info, Warning, Error, Debug };
|
||||||
Info,
|
|
||||||
Warning,
|
|
||||||
Error,
|
|
||||||
Debug
|
|
||||||
};
|
|
||||||
private:
|
private:
|
||||||
LogIo& central;
|
LogIo ¢ral;
|
||||||
EventLoop& loop;
|
EventLoop &loop;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Log(LogIo& central, EventLoop& loop);
|
Log(LogIo ¢ral, EventLoop &loop);
|
||||||
};
|
};
|
||||||
}
|
class LogIo {
|
||||||
|
private:
|
||||||
|
EventLoop &loop;
|
||||||
|
|
||||||
|
public:
|
||||||
|
LogIo(EventLoop &loop);
|
||||||
|
};
|
||||||
|
} // namespace gin
|
Loading…
Reference in New Issue