in process Camel to snake case

This commit is contained in:
Claudius Holeksa 2022-12-05 01:49:38 +01:00
parent a1a718967d
commit 947004fd65
9 changed files with 856 additions and 805 deletions

8
.clang-tidy Normal file
View File

@ -0,0 +1,8 @@
Checks: '-*,readability-identifier-naming'
CheckOptions:
- { key: readability-identifier-naming.NamespaceCase, value: lower_case }
- { key: readability-identifier-naming.ClassCase, value: lower_case }
- { key: readability-identifier-naming.StructCase, value: lower_case }
- { key: readability-identifier-naming.FunctionCase, value: lower_case }
- { key: readability-identifier-naming.VariableCase, value: lower_case }
- { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE }

View File

@ -32,16 +32,18 @@ def add_kel_source_files(self, sources, filetype, lib_env=None, shared=False, ta
def isAbsolutePath(key, dirname, env):
assert os.path.isabs(dirname), "%r must have absolute path syntax" % (key,)
## Environment variables
env_vars = Variables(
args=ARGUMENTS
)
env_vars.Add('prefix',
help='Installation target location of build results and headers',
default='/usr/local/',
validator=isAbsolutePath
)
## Environment setup
env=Environment(ENV=os.environ, variables=env_vars, CPPPATH=['#source/forstio','#source','#','#driver'],
CXX='clang++',
CPPDEFINES=['SAW_UNIX'],
@ -73,15 +75,23 @@ env.Alias('test', env.test_program)
# Clang format part
env.Append(BUILDERS={'ClangFormat' : Builder(action = 'clang-format --style=file -i $SOURCE')})
env.Append(BUILDERS={'ClangTidyFix' : Builder(action = 'clang-tidy -extra-arg-before=-xc++ --fix $SOURCE -- -std=c++17 -DSAW_UNIX -Isource')})
env.format_actions = []
def format_iter(env,files):
for f in files:
env.format_actions.append(env.AlwaysBuild(env.ClangFormat(target=f+"-clang-format",source=f)))
env.format_actions.append(env.AlwaysBuild(env.ClangFormat(target=f+"-clang-format",source=f)));
pass
env.tidy_actions = []
def tidy_iter(env,files):
for f in files:
env.tidy_actions.append(env.AlwaysBuild(env.ClangTidyFix(target=f+"-clang-tidy-fix",source=f)));
pass
format_iter(env,env.sources + env.driver_sources + env.headers + env.driver_headers)
env.Alias('format', env.format_actions)
env.Alias('format', env.format_actions);
env.Alias('tidy', env.tidy_actions);
env.Alias('cdb', env.cdb);
env.Alias('all', ['format', 'library', 'test'])

View File

@ -1,4 +1,4 @@
#include "driver/io-unix.h"
#include "io-unix.h"
#include <sstream>
@ -129,7 +129,7 @@ UnixDatagram::UnixDatagram(UnixEventPort &event_port, int file_descriptor,
: IFdOwner{event_port, file_descriptor, fd_flags, EPOLLIN | EPOLLOUT} {}
namespace {
ssize_t unixReadMsg(int fd, void *buffer, size_t length) {
ssize_t unix_read_msg(int fd, void *buffer, size_t length) {
struct ::sockaddr_storage their_addr;
socklen_t addr_len = sizeof(sockaddr_storage);
return ::recvfrom(fd, buffer, length, 0,
@ -137,15 +137,15 @@ ssize_t unixReadMsg(int fd, void *buffer, size_t length) {
&addr_len);
}
ssize_t unixWriteMsg(int fd, const void *buffer, size_t length,
::sockaddr *dest_addr, socklen_t dest_addr_len) {
ssize_t unix_write_msg(int fd, const void *buffer, size_t length,
::sockaddr *dest_addr, socklen_t dest_addr_len) {
return ::sendto(fd, buffer, length, 0, dest_addr, dest_addr_len);
}
} // namespace
ErrorOr<size_t> UnixDatagram::read(void *buffer, size_t length) {
ssize_t read_bytes = unixReadMsg(fd(), buffer, length);
ssize_t read_bytes = unix_read_msg(fd(), buffer, length);
if (read_bytes > 0) {
return static_cast<size_t>(read_bytes);
}
@ -163,8 +163,8 @@ ErrorOr<size_t> UnixDatagram::write(const void *buffer, size_t length,
UnixNetworkAddress &unix_dest = static_cast<UnixNetworkAddress &>(dest);
SocketAddress &sock_addr = unix_dest.unixAddress();
socklen_t sock_addr_length = sock_addr.getRawLength();
ssize_t write_bytes = unixWriteMsg(fd(), buffer, length, sock_addr.getRaw(),
sock_addr_length);
ssize_t write_bytes = unix_write_msg(fd(), buffer, length,
sock_addr.getRaw(), sock_addr_length);
if (write_bytes > 0) {
return static_cast<size_t>(write_bytes);
}
@ -192,14 +192,14 @@ void UnixDatagram::notify(uint32_t mask) {
}
namespace {
bool beginsWith(const std::string_view &viewed,
const std::string_view &begins) {
bool string_view_begins_with(const std::string_view &viewed,
const std::string_view &begins) {
return viewed.size() >= begins.size() &&
viewed.compare(0, begins.size(), begins) == 0;
}
std::variant<UnixNetworkAddress, UnixNetworkAddress *>
translateNetworkAddressToUnixNetworkAddress(NetworkAddress &addr) {
translate_network_address_to_unix_network_address(NetworkAddress &addr) {
auto addr_variant = addr.representation();
std::variant<UnixNetworkAddress, UnixNetworkAddress *> os_addr = std::visit(
[](auto &arg)
@ -220,7 +220,7 @@ translateNetworkAddressToUnixNetworkAddress(NetworkAddress &addr) {
return os_addr;
}
UnixNetworkAddress &translateToUnixAddressRef(
UnixNetworkAddress &translate_to_unix_address_ref(
std::variant<UnixNetworkAddress, UnixNetworkAddress *> &addr_variant) {
return std::visit(
[](auto &arg) -> UnixNetworkAddress & {
@ -240,8 +240,10 @@ UnixNetworkAddress &translateToUnixAddressRef(
} // namespace
Own<Server> UnixNetwork::listen(NetworkAddress &addr) {
auto unix_addr_storage = translateNetworkAddressToUnixNetworkAddress(addr);
UnixNetworkAddress &address = translateToUnixAddressRef(unix_addr_storage);
auto unix_addr_storage =
translate_network_address_to_unix_network_address(addr);
UnixNetworkAddress &address =
translate_to_unix_address_ref(unix_addr_storage);
assert(address.unixAddressSize() > 0);
if (address.unixAddressSize() == 0) {
@ -272,8 +274,10 @@ Own<Server> UnixNetwork::listen(NetworkAddress &addr) {
}
Conveyor<Own<IoStream>> UnixNetwork::connect(NetworkAddress &addr) {
auto unix_addr_storage = translateNetworkAddressToUnixNetworkAddress(addr);
UnixNetworkAddress &address = translateToUnixAddressRef(unix_addr_storage);
auto unix_addr_storage =
translate_network_address_to_unix_network_address(addr);
UnixNetworkAddress &address =
translate_to_unix_address_ref(unix_addr_storage);
assert(address.unixAddressSize() > 0);
if (address.unixAddressSize() == 0) {
@ -332,8 +336,10 @@ Conveyor<Own<IoStream>> UnixNetwork::connect(NetworkAddress &addr) {
}
Own<Datagram> UnixNetwork::datagram(NetworkAddress &addr) {
auto unix_addr_storage = translateNetworkAddressToUnixNetworkAddress(addr);
UnixNetworkAddress &address = translateToUnixAddressRef(unix_addr_storage);
auto unix_addr_storage =
translate_network_address_to_unix_network_address(addr);
UnixNetworkAddress &address =
translate_to_unix_address_ref(unix_addr_storage);
SAW_ASSERT(address.unixAddressSize() > 0) { return nullptr; }
@ -375,7 +381,7 @@ UnixNetwork::resolveAddress(const std::string &path, uint16_t port_hint) {
std::string_view addr_view{path};
{
std::string_view begins_with = "unix:";
if (beginsWith(addr_view, begins_with)) {
if (string_view_begins_with(addr_view, begins_with)) {
addr_view.remove_prefix(begins_with.size());
}
}

View File

@ -7,38 +7,38 @@
namespace saw {
namespace {
thread_local EventLoop *local_loop = nullptr;
thread_local event_loop *local_loop = nullptr;
EventLoop &currentEventLoop() {
EventLoop *loop = local_loop;
event_loop &current_event_loop() {
event_loop *loop = local_loop;
assert(loop);
return *loop;
}
} // namespace
ConveyorNode::ConveyorNode() {}
conveyor_node::conveyor_node() {}
ConveyorNodeWithChildMixin::ConveyorNodeWithChildMixin(
Own<ConveyorNode> &&child_, ConveyorNode &owner)
conveyor_node_with_child_mixin::conveyor_node_with_child_mixin(
own<conveyor_node> &&child_, conveyor_node &owner)
: child{std::move(child_)} {
assert(child);
child->notifyParentAttached(owner);
}
ErrorOr<Own<ConveyorNode>>
ConveyorNodeWithChildMixin::swapChild(Own<ConveyorNode> &&swapee) {
error_or<own<conveyor_node>>
conveyor_node_with_child_mixin::swap_child(own<conveyor_node> &&swapee) {
SAW_ASSERT(child) {
return criticalError("Child should exist if this function is called");
return criticalerror("Child should exist if this function is called");
}
Own<ConveyorNode> old_child = std::move(child);
own<conveyor_node> old_child = std::move(child);
/**
* We need the parent of the old_child's next storage
*/
ConveyorStorage *old_storage = old_child->nextStorage();
ConveyorStorage *old_storage_parent = old_storage ? old_storage->getParent()
: nullptr;
conveyor_storage *old_storage = old_child->nextStorage();
conveyor_storage *old_storage_parent =
old_storage ? old_storage->getParent() : nullptr;
/**
* Swap in the new child
@ -51,7 +51,7 @@ ConveyorNodeWithChildMixin::swapChild(Own<ConveyorNode> &&swapee) {
* storage has a nullptr set And if the old_storage_parent is a nullptr,
* then it doesn't matter. So we don't check for it
*/
ConveyorStorage *swapee_storage = child->nextStorage();
conveyor_storage *swapee_storage = child->nextStorage();
if (swapee_storage) {
swapee_storage->setParent(old_storage_parent);
}
@ -60,13 +60,13 @@ ConveyorNodeWithChildMixin::swapChild(Own<ConveyorNode> &&swapee) {
return old_child;
}
ConveyorStorage::ConveyorStorage() {}
conveyor_storage::conveyor_storage() {}
ConveyorStorage::~ConveyorStorage() {}
conveyor_storage::~conveyor_storage() {}
ConveyorStorage *ConveyorStorage::getParent() const { return parent; }
conveyor_storage *conveyor_storage::getParent() const { return parent; }
void ConveyorEventStorage::setParent(ConveyorStorage *p) {
void conveyor_event_storage::setParent(conveyor_storage *p) {
/*
* parent check isn't needed, but is used
* for the assert, because the storage should
@ -83,24 +83,24 @@ void ConveyorEventStorage::setParent(ConveyorStorage *p) {
parent = p;
}
ConveyorEventStorage::ConveyorEventStorage() : ConveyorStorage{} {}
conveyor_event_storage::conveyor_event_storage() : conveyor_storage{} {}
ConveyorBase::ConveyorBase(Own<ConveyorNode> &&node_p)
conveyor_base::conveyor_base(own<conveyor_node> &&node_p)
: node{std::move(node_p)} {}
Error PropagateError::operator()(const Error &error) const {
return error.copyError();
error propagate_error::operator()(const error &error) const {
return error.copyerror();
}
Error PropagateError::operator()(Error &&error) { return std::move(error); }
error propagate_error::operator()(error &&error) { return std::move(error); }
Event::Event() : Event(currentEventLoop()) {}
event::event() : event(current_event_loop()) {}
Event::Event(EventLoop &loop) : loop{loop} {}
event::event(event_loop &loop) : loop{loop} {}
Event::~Event() { disarm(); }
event::~event() { disarm(); }
void Event::armNext() {
void event::armNext() {
assert(&loop == local_loop);
if (prev == nullptr) {
// Push the next_insert_point back by one
@ -133,7 +133,7 @@ void Event::armNext() {
}
}
void Event::armLater() {
void event::armLater() {
assert(&loop == local_loop);
if (prev == nullptr) {
@ -153,7 +153,7 @@ void Event::armLater() {
}
}
void Event::armLast() {
void event::armLast() {
assert(&loop == local_loop);
if (prev == nullptr) {
@ -172,7 +172,7 @@ void Event::armLast() {
}
}
void Event::disarm() {
void event::disarm() {
if (prev != nullptr) {
if (loop.tail == &next) {
loop.tail = prev;
@ -192,33 +192,33 @@ void Event::disarm() {
}
}
bool Event::isArmed() const { return prev != nullptr; }
bool event::isArmed() const { return prev != nullptr; }
ConveyorSink::ConveyorSink() : node{nullptr} {}
conveyorSink::conveyorSink() : node{nullptr} {}
ConveyorSink::ConveyorSink(Own<ConveyorNode> &&node_p)
conveyorSink::conveyorSink(own<conveyor_node> &&node_p)
: node{std::move(node_p)} {}
void EventLoop::setRunnable(bool runnable) { is_runnable = runnable; }
void event_loop::setRunnable(bool runnable) { is_runnable = runnable; }
EventLoop::EventLoop() {}
event_loop::event_loop() {}
EventLoop::EventLoop(Own<EventPort> &&event_port)
event_loop::event_loop(own<eventPort> &&event_port)
: event_port{std::move(event_port)} {}
EventLoop::~EventLoop() { assert(local_loop != this); }
event_loop::~event_loop() { assert(local_loop != this); }
void EventLoop::enterScope() {
void event_loop::enterScope() {
assert(!local_loop);
local_loop = this;
}
void EventLoop::leaveScope() {
void event_loop::leaveScope() {
assert(local_loop == this);
local_loop = nullptr;
}
bool EventLoop::turnLoop() {
bool event_loop::turnLoop() {
size_t turn_step = 0;
while (head && turn_step < 65536) {
if (!turn()) {
@ -229,8 +229,8 @@ bool EventLoop::turnLoop() {
return true;
}
bool EventLoop::turn() {
Event *event = head;
bool event_loop::turn() {
event *event = head;
if (!event) {
return false;
@ -259,7 +259,7 @@ bool EventLoop::turn() {
return true;
}
bool EventLoop::wait(const std::chrono::steady_clock::duration &duration) {
bool event_loop::wait(const std::chrono::steady_clock::duration &duration) {
if (event_port) {
event_port->wait(duration);
}
@ -267,7 +267,7 @@ bool EventLoop::wait(const std::chrono::steady_clock::duration &duration) {
return turnLoop();
}
bool EventLoop::wait(const std::chrono::steady_clock::time_point &time_point) {
bool event_loop::wait(const std::chrono::steady_clock::time_point &time_point) {
if (event_port) {
event_port->wait(time_point);
}
@ -275,7 +275,7 @@ bool EventLoop::wait(const std::chrono::steady_clock::time_point &time_point) {
return turnLoop();
}
bool EventLoop::wait() {
bool event_loop::wait() {
if (event_port) {
event_port->wait();
}
@ -283,7 +283,7 @@ bool EventLoop::wait() {
return turnLoop();
}
bool EventLoop::poll() {
bool event_loop::poll() {
if (event_port) {
event_port->poll();
}
@ -291,16 +291,16 @@ bool EventLoop::poll() {
return turnLoop();
}
EventPort *EventLoop::eventPort() { return event_port.get(); }
eventPort *event_loop::eventPort() { return event_port.get(); }
ConveyorSinkSet &EventLoop::daemon() {
conveyor_sink_set &event_loop::daemon() {
if (!daemon_sink) {
daemon_sink = heap<ConveyorSinkSet>();
daemon_sink = heap<conveyor_sink_set>();
}
return *daemon_sink;
}
WaitScope::WaitScope(EventLoop &loop) : loop{loop} { loop.enterScope(); }
WaitScope::WaitScope(event_loop &loop) : loop{loop} { loop.enterScope(); }
WaitScope::~WaitScope() { loop.leaveScope(); }
@ -316,29 +316,29 @@ void WaitScope::wait(const std::chrono::steady_clock::time_point &time_point) {
void WaitScope::poll() { loop.poll(); }
ErrorOr<Own<ConveyorNode>>
ConvertConveyorNodeBase::swapChild(Own<ConveyorNode> &&swapee) noexcept {
return child_mixin.swapChild(std::move(swapee));
error_or<own<conveyor_node>>
convert_conveyor_node_base::swap_child(own<conveyor_node> &&swapee) noexcept {
return child_mixin.swap_child(std::move(swapee));
}
ConveyorStorage *ConvertConveyorNodeBase::nextStorage() noexcept {
conveyor_storage *convert_conveyor_node_base::nextStorage() noexcept {
if (!child_mixin.child) {
return nullptr;
}
return child_mixin.child->nextStorage();
}
ImmediateConveyorNodeBase::ImmediateConveyorNodeBase()
: ConveyorEventStorage{} {}
Immediateconveyor_nodeBase::Immediateconveyor_nodeBase()
: conveyor_event_storage{} {}
MergeConveyorNodeBase::MergeConveyorNodeBase() : ConveyorEventStorage{} {}
Mergeconveyor_nodeBase::Mergeconveyor_nodeBase() : conveyor_event_storage{} {}
ErrorOr<Own<ConveyorNode>>
QueueBufferConveyorNodeBase::swapChild(Own<ConveyorNode> &&swapee_) noexcept {
return child_mixin.swapChild(std::move(swapee_));
error_or<own<conveyor_node>> QueueBufferconveyor_nodeBase::swap_child(
own<conveyor_node> &&swapee_) noexcept {
return child_mixin.swap_child(std::move(swapee_));
}
void ConveyorSinkSet::destroySinkConveyorNode(ConveyorNode &node) {
void conveyor_sink_set::destroysink_conveyor_node(conveyor_node &node) {
if (!isArmed()) {
armLast();
}
@ -346,20 +346,21 @@ void ConveyorSinkSet::destroySinkConveyorNode(ConveyorNode &node) {
delete_nodes.push(&node);
}
void ConveyorSinkSet::fail(Error &&error) {
void conveyor_sink_set::fail(error &&error) {
/// @todo call error_handler
}
ConveyorSinkSet::ConveyorSinkSet(EventLoop &event_loop) : Event{event_loop} {}
conveyor_sink_set::conveyor_sink_set(event_loop &event_loop)
: event{event_loop} {}
void ConveyorSinkSet::add(Conveyor<void> &&sink) {
auto nas = Conveyor<void>::fromConveyor(std::move(sink));
void conveyor_sink_set::add(conveyor<void> &&sink) {
auto nas = conveyor<void>::fromconveyor(std::move(sink));
SAW_ASSERT(nas) { return; }
ConveyorStorage *storage = nas->nextStorage();
conveyor_storage *storage = nas->nextStorage();
Own<SinkConveyorNode> sink_node = nullptr;
own<sink_conveyor_node> sink_node = nullptr;
try {
sink_node = heap<SinkConveyorNode>(std::move(nas), *this);
sink_node = heap<sink_conveyor_node>(std::move(nas), *this);
} catch (std::bad_alloc &) {
return;
}
@ -370,36 +371,36 @@ void ConveyorSinkSet::add(Conveyor<void> &&sink) {
sink_nodes.emplace_back(std::move(sink_node));
}
void ConveyorSinkSet::fire() {
void conveyor_sink_set::fire() {
while (!delete_nodes.empty()) {
ConveyorNode *node = delete_nodes.front();
conveyor_node *node = delete_nodes.front();
/*auto erased = */ std::remove_if(sink_nodes.begin(), sink_nodes.end(),
[node](Own<ConveyorNode> &element) {
[node](own<conveyor_node> &element) {
return node == element.get();
});
delete_nodes.pop();
}
}
ConvertConveyorNodeBase::ConvertConveyorNodeBase(Own<ConveyorNode> &&dep)
convert_conveyor_node_base::convert_conveyor_node_base(own<conveyor_node> &&dep)
: child_mixin{std::move(dep), *this} {}
void ConvertConveyorNodeBase::getResult(ErrorOrValue &err_or_val) {
void convert_conveyor_node_base::getResult(error_or_value &err_or_val) {
getImpl(err_or_val);
}
void AttachConveyorNodeBase::getResult(ErrorOrValue &err_or_val) noexcept {
void attach_conveyor_node_base::getResult(error_or_value &err_or_val) noexcept {
if (child_mixin.child) {
child_mixin.child->getResult(err_or_val);
}
}
ErrorOr<Own<ConveyorNode>>
AttachConveyorNodeBase::swapChild(Own<ConveyorNode> &&swapee_) noexcept {
return child_mixin.swapChild(std::move(swapee_));
error_or<own<conveyor_node>>
attach_conveyor_node_base::swap_child(own<conveyor_node> &&swapee_) noexcept {
return child_mixin.swap_child(std::move(swapee_));
}
ConveyorStorage *AttachConveyorNodeBase::nextStorage() noexcept {
conveyor_storage *attach_conveyor_node_base::nextStorage() noexcept {
if (!child_mixin.child) {
return nullptr;
}
@ -407,9 +408,9 @@ ConveyorStorage *AttachConveyorNodeBase::nextStorage() noexcept {
return child_mixin.child->nextStorage();
}
void detachConveyor(Conveyor<void> &&conveyor) {
EventLoop &loop = currentEventLoop();
ConveyorSinkSet &sink = loop.daemon();
void detach_conveyor(conveyor<void> &&conveyor) {
event_loop &loop = current_event_loop();
conveyor_sink_set &sink = loop.daemon();
sink.add(std::move(conveyor));
}
} // namespace saw

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,5 @@
#pragma once
#include "async.h"
#include "common.h"
#include "error.h"
@ -11,18 +10,18 @@
namespace saw {
template <typename Func> ConveyorResult<Func, void> execLater(Func &&func) {
Conveyor<void> conveyor{FixVoid<void>{}};
template <typename Func> conveyor_result<Func, void> exec_later(Func &&func) {
conveyor<void> conveyor{fix_void<void>{}};
return conveyor.then(std::move(func));
}
template <typename T>
Conveyor<T>::Conveyor(FixVoid<T> value) : ConveyorBase(nullptr) {
conveyor<T>::conveyor(fix_void<T> value) : conveyor_base(nullptr) {
// Is there any way to do this?
// @todo new ConveyorBase constructor for Immediate values
// @todo new conveyorBase constructor for Immediate values
Own<ImmediateConveyorNode<FixVoid<T>>> immediate =
heap<ImmediateConveyorNode<FixVoid<T>>>(std::move(value));
own<immediate_conveyor_node<fix_void<T>>> immediate =
heap<immediate_conveyor_node<fix_void<T>>>(std::move(value));
if (!immediate) {
return;
@ -32,9 +31,9 @@ Conveyor<T>::Conveyor(FixVoid<T> value) : ConveyorBase(nullptr) {
}
template <typename T>
Conveyor<T>::Conveyor(Error &&error) : ConveyorBase(nullptr) {
Own<ImmediateConveyorNode<FixVoid<T>>> immediate =
heap<ImmediateConveyorNode<FixVoid<T>>>(std::move(error));
conveyor<T>::conveyor(error &&error) : conveyor_base(nullptr) {
own<immediate_conveyor_node<fix_void<T>>> immediate =
heap<immediate_conveyor_node<fix_void<T>>>(std::move(error));
if (!immediate) {
return;
@ -44,145 +43,150 @@ Conveyor<T>::Conveyor(Error &&error) : ConveyorBase(nullptr) {
}
template <typename T>
Conveyor<T>::Conveyor(Own<ConveyorNode> node_p)
: ConveyorBase{std::move(node_p)} {}
conveyor<T>::conveyor(own<conveyor_node> node_p)
: conveyor_base{std::move(node_p)} {}
template <typename T>
template <typename Func, typename ErrorFunc>
ConveyorResult<Func, T> Conveyor<T>::then(Func &&func, ErrorFunc &&error_func) {
Own<ConveyorNode> conversion_node =
heap<ConvertConveyorNode<FixVoid<ReturnType<Func, T>>, FixVoid<T>, Func,
ErrorFunc>>(std::move(node), std::move(func),
std::move(error_func));
conveyor_result<Func, T> conveyor<T>::then(Func &&func,
ErrorFunc &&error_func) {
own<conveyor_node> conversion_node =
heap<convert_conveyor_node<fix_void<return_type<Func, T>>, fix_void<T>,
Func, ErrorFunc>>(
std::move(node), std::move(func), std::move(error_func));
return Conveyor<RemoveErrorOr<ReturnType<Func, T>>>::toConveyor(
return conveyor<remove_error_or<return_type<Func, T>>>::to_conveyor(
std::move(conversion_node));
}
template <typename T> Conveyor<T> Conveyor<T>::buffer(size_t size) {
SAW_ASSERT(node) { return Conveyor<T>{Own<ConveyorNode>{nullptr}}; }
ConveyorStorage *storage = node->nextStorage();
SAW_ASSERT(storage) { return Conveyor<T>{Own<ConveyorNode>{nullptr}}; }
template <typename T> conveyor<T> conveyor<T>::buffer(size_t size) {
SAW_ASSERT(node) { return conveyor<T>{own<conveyor_node>{nullptr}}; }
conveyor_storage *storage = node->next_storage();
SAW_ASSERT(storage) { return conveyor<T>{own<conveyor_node>{nullptr}}; }
Own<QueueBufferConveyorNode<FixVoid<T>>> storage_node =
heap<QueueBufferConveyorNode<FixVoid<T>>>(std::move(node), size);
own<queue_buffer_conveyor_node<fix_void<T>>> storage_node =
heap<queue_buffer_conveyor_node<fix_void<T>>>(std::move(node), size);
ConveyorStorage *storage_ptr =
static_cast<ConveyorStorage *>(storage_node.get());
conveyor_storage *storage_ptr =
static_cast<conveyor_storage *>(storage_node.get());
storage->setParent(storage_ptr);
return Conveyor<T>{std::move(storage_node)};
storage->set_parent(storage_ptr);
return conveyor<T>{std::move(storage_node)};
}
template <typename T>
template <typename... Args>
Conveyor<T> Conveyor<T>::attach(Args &&...args) {
Own<AttachConveyorNode<Args...>> attach_node =
heap<AttachConveyorNode<Args...>>(std::move(node), std::move(args...));
return Conveyor<T>{std::move(attach_node)};
conveyor<T> conveyor<T>::attach(Args &&...args) {
own<attach_conveyor_node<Args...>> attach_node =
heap<attach_conveyor_node<Args...>>(std::move(node),
std::move(args...));
return conveyor<T>{std::move(attach_node)};
}
template <typename T>
std::pair<Conveyor<T>, MergeConveyor<T>> Conveyor<T>::merge() {
Our<MergeConveyorNodeData<T>> data = share<MergeConveyorNodeData<T>>();
std::pair<conveyor<T>, merge_conveyor<T>> conveyor<T>::merge() {
our<merge_conveyor_node_data<T>> data =
share<merge_conveyor_node_data<T>>();
Own<MergeConveyorNode<T>> merge_node = heap<MergeConveyorNode<T>>(data);
own<merge_conveyor_node<T>> merge_node = heap<merge_conveyor_node<T>>(data);
SAW_ASSERT(node) {
return std::make_pair(Conveyor<T>{Own<ConveyorNode>{nullptr}},
MergeConveyor<T>{});
return std::make_pair(conveyor<T>{own<conveyor_node>{nullptr}},
merge_conveyor<T>{});
}
ConveyorStorage *storage = node->nextStorage();
conveyor_storage *storage = node->next_storage();
SAW_ASSERT(storage) {
return std::make_pair(Conveyor<T>{Own<ConveyorNode>{nullptr}},
MergeConveyor<T>{});
return std::make_pair(conveyor<T>{own<conveyor_node>{nullptr}},
merge_conveyor<T>{});
}
data->attach(Conveyor<T>::toConveyor(std::move(node)));
data->attach(conveyor<T>::to_conveyor(std::move(node)));
MergeConveyor<T> node_ref{data};
merge_conveyor<T> node_ref{data};
return std::make_pair(Conveyor<T>{std::move(merge_node)},
return std::make_pair(conveyor<T>{std::move(merge_node)},
std::move(node_ref));
}
template <>
template <typename ErrorFunc>
ConveyorSink Conveyor<void>::sink(ErrorFunc &&error_func) {
ConveyorStorage *storage = node->nextStorage();
SAW_ASSERT(storage) { return ConveyorSink{}; }
conveyor_sink conveyor<void>::sink(ErrorFunc &&error_func) {
conveyor_storage *storage = node->next_storage();
SAW_ASSERT(storage) { return conveyor_sink{}; }
Own<SinkConveyorNode> sink_node = heap<SinkConveyorNode>(std::move(node));
ConveyorStorage *storage_ptr =
static_cast<ConveyorStorage *>(sink_node.get());
own<sink_conveyor_node> sink_node =
heap<sink_conveyor_node>(std::move(node));
conveyor_storage *storage_ptr =
static_cast<conveyor_storage *>(sink_node.get());
storage->setParent(storage_ptr);
storage->set_parent(storage_ptr);
return ConveyorSink{std::move(sink_node)};
return conveyor_sink{std::move(sink_node)};
}
void detachConveyor(Conveyor<void> &&conveyor);
void detachconveyor(conveyor<void> &&conveyor);
template <typename T>
template <typename ErrorFunc>
void Conveyor<T>::detach(ErrorFunc &&func) {
detachConveyor(std::move(then([](T &&) {}, std::move(func))));
void conveyor<T>::detach(ErrorFunc &&func) {
detachconveyor(std::move(then([](T &&) {}, std::move(func))));
}
template <>
template <typename ErrorFunc>
void Conveyor<void>::detach(ErrorFunc &&func) {
detachConveyor(std::move(then([]() {}, std::move(func))));
void conveyor<void>::detach(ErrorFunc &&func) {
detachconveyor(std::move(then([]() {}, std::move(func))));
}
template <typename T>
Conveyor<T> Conveyor<T>::toConveyor(Own<ConveyorNode> node) {
return Conveyor<T>{std::move(node)};
conveyor<T> conveyor<T>::to_conveyor(own<conveyor_node> node) {
return conveyor<T>{std::move(node)};
}
template <typename T>
Own<ConveyorNode> Conveyor<T>::fromConveyor(Conveyor<T> conveyor) {
own<conveyor_node> conveyor<T>::from_conveyor(conveyor<T> conveyor) {
return std::move(conveyor.node);
}
template <typename T> ErrorOr<FixVoid<T>> Conveyor<T>::take() {
template <typename T> error_or<fix_void<T>> conveyor<T>::take() {
SAW_ASSERT(node) {
return ErrorOr<FixVoid<T>>{criticalError("Conveyor in invalid state")};
return error_or<fix_void<T>>{
critical_error("conveyor in invalid state")};
}
ConveyorStorage *storage = node->nextStorage();
conveyor_storage *storage = node->next_storage();
if (storage) {
if (storage->queued() > 0) {
ErrorOr<FixVoid<T>> result;
node->getResult(result);
error_or<fix_void<T>> result;
node->get_result(result);
return result;
} else {
return ErrorOr<FixVoid<T>>{
recoverableError("Conveyor buffer has no elements")};
return error_or<fix_void<T>>{
recoverable_error("conveyor buffer has no elements")};
}
} else {
return ErrorOr<FixVoid<T>>{
criticalError("Conveyor node has no child storage")};
return error_or<fix_void<T>>{
critical_error("conveyor node has no child storage")};
}
}
template <typename T> ConveyorAndFeeder<T> newConveyorAndFeeder() {
Own<AdaptConveyorFeeder<FixVoid<T>>> feeder =
heap<AdaptConveyorFeeder<FixVoid<T>>>();
Own<AdaptConveyorNode<FixVoid<T>>> node =
heap<AdaptConveyorNode<FixVoid<T>>>();
template <typename T> conveyor_and_feeder<T> new_conveyor_and_feeder() {
own<adapt_conveyor_feeder<fix_void<T>>> feeder =
heap<adapt_conveyor_feeder<fix_void<T>>>();
own<adapt_conveyor_node<fix_void<T>>> node =
heap<adapt_conveyor_node<fix_void<T>>>();
feeder->setFeedee(node.get());
node->setFeeder(feeder.get());
return ConveyorAndFeeder<T>{std::move(feeder),
Conveyor<T>::toConveyor(std::move(node))};
return conveyor_and_feeder<T>{std::move(feeder),
conveyor<T>::to_conveyor(std::move(node))};
}
// QueueBuffer
template <typename T> void QueueBufferConveyorNode<T>::fire() {
template <typename T> void queue_buffer_conveyor_node<T>::fire() {
if (child_mixin.child) {
if (!storage.empty()) {
if (storage.front().isError()) {
if (storage.front().is_error()) {
if (storage.front().error().isCritical()) {
child_mixin.child = nullptr;
}
@ -193,9 +197,9 @@ template <typename T> void QueueBufferConveyorNode<T>::fire() {
bool has_space_before_fire = space() > 0;
if (parent) {
parent->childHasFired();
parent->child_has_fired();
if (!storage.empty() && parent->space() > 0) {
armLater();
arm_later();
}
}
@ -206,45 +210,45 @@ template <typename T> void QueueBufferConveyorNode<T>::fire() {
return;
}
ConveyorStorage *ch_storage = child_mixin.child->nextStorage();
conveyor_storage *ch_storage = child_mixin.child->next_storage();
if (ch_storage && !has_space_before_fire) {
ch_storage->parentHasFired();
ch_storage->parent_has_fired();
}
}
template <typename T>
void QueueBufferConveyorNode<T>::getResult(ErrorOrValue &eov) noexcept {
ErrorOr<T> &err_or_val = eov.as<T>();
void queue_buffer_conveyor_node<T>::get_result(error_or_value &eov) noexcept {
error_or<T> &err_or_val = eov.as<T>();
err_or_val = std::move(storage.front());
storage.pop();
}
template <typename T> size_t QueueBufferConveyorNode<T>::space() const {
template <typename T> size_t queue_buffer_conveyor_node<T>::space() const {
return max_store - storage.size();
}
template <typename T> size_t QueueBufferConveyorNode<T>::queued() const {
template <typename T> size_t queue_buffer_conveyor_node<T>::queued() const {
return storage.size();
}
template <typename T> void QueueBufferConveyorNode<T>::childHasFired() {
template <typename T> void queue_buffer_conveyor_node<T>::child_has_fired() {
if (child_mixin.child && storage.size() < max_store) {
ErrorOr<T> eov;
child_mixin.child->getResult(eov);
error_or<T> eov;
child_mixin.child->get_result(eov);
if (eov.isError()) {
if (eov.is_error()) {
if (eov.error().isCritical()) {
}
}
storage.push(std::move(eov));
if (!isArmed()) {
armLater();
if (!is_armed()) {
arm_later();
}
}
}
template <typename T> void QueueBufferConveyorNode<T>::parentHasFired() {
template <typename T> void queue_buffer_conveyor_node<T>::parent_has_fired() {
SAW_ASSERT(parent) { return; }
if (parent->space() == 0) {
@ -252,57 +256,57 @@ template <typename T> void QueueBufferConveyorNode<T>::parentHasFired() {
}
if (queued() > 0) {
armLater();
arm_later();
}
}
template <typename T>
ImmediateConveyorNode<T>::ImmediateConveyorNode(FixVoid<T> &&val)
immediate_conveyor_node<T>::immediate_conveyor_node(fix_void<T> &&val)
: value{std::move(val)}, retrieved{0} {}
template <typename T>
ImmediateConveyorNode<T>::ImmediateConveyorNode(Error &&error)
immediate_conveyor_node<T>::immediate_conveyor_node(error &&error)
: value{std::move(error)}, retrieved{0} {}
template <typename T> size_t ImmediateConveyorNode<T>::space() const {
template <typename T> size_t immediate_conveyor_node<T>::space() const {
return 0;
}
template <typename T> size_t ImmediateConveyorNode<T>::queued() const {
template <typename T> size_t immediate_conveyor_node<T>::queued() const {
return retrieved > 1 ? 0 : 1;
}
template <typename T> void ImmediateConveyorNode<T>::childHasFired() {
template <typename T> void immediate_conveyor_node<T>::child_has_fired() {
// Impossible case
assert(false);
}
template <typename T> void ImmediateConveyorNode<T>::parentHasFired() {
template <typename T> void immediate_conveyor_node<T>::parent_has_fired() {
SAW_ASSERT(parent) { return; }
assert(parent->space() > 0);
if (queued() > 0) {
armNext();
arm_next();
}
}
template <typename T> void ImmediateConveyorNode<T>::fire() {
template <typename T> void immediate_conveyor_node<T>::fire() {
if (parent) {
parent->childHasFired();
parent->child_has_fired();
if (queued() > 0 && parent->space() > 0) {
armLast();
arm_last();
}
}
}
template <typename T>
MergeConveyor<T>::MergeConveyor(Lent<MergeConveyorNodeData<T>> d)
merge_conveyor<T>::merge_conveyor(lent<merge_conveyor_node_data<T>> d)
: data{std::move(d)} {}
template <typename T> MergeConveyor<T>::~MergeConveyor() {}
template <typename T> merge_conveyor<T>::~merge_conveyor() {}
template <typename T> void MergeConveyor<T>::attach(Conveyor<T> conveyor) {
template <typename T> void merge_conveyor<T>::attach(conveyor<T> conveyor) {
auto sp = data.lock();
SAW_ASSERT(sp) { return; }
@ -310,26 +314,26 @@ template <typename T> void MergeConveyor<T>::attach(Conveyor<T> conveyor) {
}
template <typename T>
MergeConveyorNode<T>::MergeConveyorNode(Our<MergeConveyorNodeData<T>> d)
merge_conveyor_node<T>::merge_conveyor_node(our<merge_conveyor_node_data<T>> d)
: data{d} {
SAW_ASSERT(data) { return; }
data->merger = this;
}
template <typename T> MergeConveyorNode<T>::~MergeConveyorNode() {}
template <typename T> merge_conveyor_node<T>::~merge_conveyor_node() {}
template <typename T>
ErrorOr<Own<ConveyorNode>>
MergeConveyorNode<T>::swapChild(Own<ConveyorNode> &&swapee_) noexcept {
error_or<own<conveyor_node>>
merge_conveyor_node<T>::swap_child(own<conveyor_node> &&swapee_) noexcept {
(void)swapee_;
return criticalError(
"MergeConveyorNode<T>::Appendage should block calls to this class");
return critical_error(
"MergeconveyorNode<T>::Appendage should block calls to this class");
}
template <typename T>
void MergeConveyorNode<T>::getResult(ErrorOrValue &eov) noexcept {
ErrorOr<FixVoid<T>> &err_or_val = eov.as<FixVoid<T>>();
void merge_conveyor_node<T>::get_result(error_or_value &eov) noexcept {
error_or<fix_void<T>> &err_or_val = eov.as<fix_void<T>>();
SAW_ASSERT(data) { return; }
@ -355,24 +359,24 @@ void MergeConveyorNode<T>::getResult(ErrorOrValue &eov) noexcept {
}
}
err_or_val = criticalError("No value in Merge Appendages");
err_or_val = critical_error("No value in Merge Appendages");
}
template <typename T> void MergeConveyorNode<T>::fire() {
template <typename T> void merge_conveyor_node<T>::fire() {
SAW_ASSERT(queued() > 0) { return; }
if (parent) {
parent->childHasFired();
parent->child_has_fired();
if (queued() > 0 && parent->space() > 0) {
armLater();
arm_later();
}
}
}
template <typename T> size_t MergeConveyorNode<T>::space() const { return 0; }
template <typename T> size_t merge_conveyor_node<T>::space() const { return 0; }
template <typename T> size_t MergeConveyorNode<T>::queued() const {
template <typename T> size_t merge_conveyor_node<T>::queued() const {
SAW_ASSERT(data) { return 0; }
size_t queue_count = 0;
@ -384,64 +388,65 @@ template <typename T> size_t MergeConveyorNode<T>::queued() const {
return queue_count;
}
template <typename T> void MergeConveyorNode<T>::childHasFired() {
template <typename T> void merge_conveyor_node<T>::child_has_fired() {
/// This can never happen
assert(false);
}
template <typename T> void MergeConveyorNode<T>::parentHasFired() {
template <typename T> void merge_conveyor_node<T>::parent_has_fired() {
SAW_ASSERT(parent) { return; }
if (queued() > 0) {
if (parent->space() > 0) {
armLater();
arm_later();
}
}
}
/**
* MergeConveyorNode<T>::Apendage
* MergeconveyorNode<T>::Apendage
*/
template <typename T>
ErrorOr<Own<ConveyorNode>>
MergeConveyorNode<T>::Appendage::swapChild(Own<ConveyorNode> &&swapee_) {
Own<ConveyorNode> old_child = std::move(child);
error_or<own<conveyor_node>>
merge_conveyor_node<T>::appendage::swap_child(own<conveyor_node> &&swapee_) {
own<conveyor_node> old_child = std::move(child);
child = std::move(swapee_);
// This case should never happen
SAW_ASSERT(old_child) { return criticalError("No child exists"); }
SAW_ASSERT(old_child) { return critical_error("No child exists"); }
return old_child;
}
template <typename T>
void MergeConveyorNode<T>::Appendage::getResult(ErrorOrValue &eov) {
ErrorOr<FixVoid<T>> &err_or_val = eov.as<FixVoid<T>>();
void merge_conveyor_node<T>::appendage::get_result(error_or_value &eov) {
error_or<fix_void<T>> &err_or_val = eov.as<fix_void<T>>();
SAW_ASSERT(queued() > 0) {
err_or_val = criticalError("No element queued in Merge Appendage Node");
err_or_val =
critical_error("No element queued in Merge Appendage Node");
return;
}
err_or_val = std::move(error_or_value.value());
error_or_value = std::nullopt;
err_or_val = std::move(error_or_value_data.value());
error_or_value_data = std::nullopt;
}
template <typename T> size_t MergeConveyorNode<T>::Appendage::space() const {
template <typename T> size_t merge_conveyor_node<T>::appendage::space() const {
SAW_ASSERT(merger) { return 0; }
if (error_or_value.has_value()) {
if (error_or_value_data.has_value()) {
return 0;
}
return 1;
}
template <typename T> size_t MergeConveyorNode<T>::Appendage::queued() const {
template <typename T> size_t merge_conveyor_node<T>::appendage::queued() const {
SAW_ASSERT(merger) { return 0; }
if (error_or_value.has_value()) {
if (error_or_value_data.has_value()) {
return 1;
}
@ -450,39 +455,43 @@ template <typename T> size_t MergeConveyorNode<T>::Appendage::queued() const {
/// @todo delete this function. Replaced by the regular getResult
template <typename T>
void MergeConveyorNode<T>::Appendage::getAppendageResult(ErrorOrValue &eov) {
ErrorOr<FixVoid<T>> &err_or_val = eov.as<FixVoid<T>>();
void merge_conveyor_node<T>::appendage::get_appendage_result(
error_or_value &eov) {
error_or<fix_void<T>> &err_or_val = eov.as<fix_void<T>>();
SAW_ASSERT(queued() > 0) {
err_or_val = criticalError("No element queued in Merge Appendage Node");
err_or_val =
critical_error("No element queued in Merge Appendage Node");
return;
}
err_or_val = std::move(error_or_value.value());
error_or_value = std::nullopt;
err_or_val = std::move(error_or_value_data.value());
error_or_value_data = std::nullopt;
}
template <typename T> void MergeConveyorNode<T>::Appendage::childHasFired() {
SAW_ASSERT(!error_or_value.has_value()) { return; }
ErrorOr<FixVoid<T>> eov;
child->getResult(eov);
template <typename T>
void merge_conveyor_node<T>::appendage::child_has_fired() {
SAW_ASSERT(!error_or_value_data.has_value()) { return; }
error_or<fix_void<T>> eov;
child->get_result(eov);
error_or_value = std::move(eov);
error_or_value_data = std::move(eov);
if (!merger->isArmed()) {
merger->armLater();
}
}
template <typename T> void MergeConveyorNode<T>::Appendage::parentHasFired() {
ConveyorStorage *child_storage = child->nextStorage();
if (child_storage) {
child_storage->parentHasFired();
if (!merger->is_armed()) {
merger->arm_later();
}
}
template <typename T>
void MergeConveyorNode<T>::Appendage::setParent(ConveyorStorage *par) {
void merge_conveyor_node<T>::appendage::parent_has_fired() {
conveyor_storage *child_storage = child->next_storage();
if (child_storage) {
child_storage->parent_has_fired();
}
}
template <typename T>
void merge_conveyor_node<T>::appendage::set_parent(conveyor_storage *par) {
SAW_ASSERT(merger) { return; }
SAW_ASSERT(child) { return; }
@ -491,38 +500,36 @@ void MergeConveyorNode<T>::Appendage::setParent(ConveyorStorage *par) {
}
template <typename T>
void MergeConveyorNodeData<T>::attach(Conveyor<T> conveyor) {
auto nas = Conveyor<T>::fromConveyor(std::move(conveyor));
void merge_conveyor_node_data<T>::attach(conveyor<T> conveyor) {
auto nas = conveyor<T>::from_conveyor(std::move(conveyor));
SAW_ASSERT(nas) { return; }
ConveyorStorage *storage = nas->nextStorage();
conveyor_storage *storage = nas->nextStorage();
SAW_ASSERT(storage) { return; }
auto merge_node_appendage =
heap<typename MergeConveyorNode<T>::Appendage>(std::move(nas), *merger);
heap<typename merge_conveyor_node<T>::Appendage>(std::move(nas),
*merger);
auto merge_node_appendage_ptr = merge_node_appendage.get();
storage->setParent(merge_node_appendage.get());
storage->set_parent(merge_node_appendage.get());
SAW_ASSERT(merger) { return; }
ConveyorStorage *mrg_storage = merger->nextStorage();
conveyor_storage *mrg_storage = merger->nextStorage();
SAW_ASSERT(mrg_storage) { return; }
merge_node_appendage->setParent(mrg_storage);
appendages.push_back(std::move(merge_node_appendage));
/// @todo return this. necessary? maybe for the weird linking setup
/// maybe not
// return merge_node_appendage_ptr;
}
template <typename T> void MergeConveyorNodeData<T>::governingNodeDestroyed() {
template <typename T>
void merge_conveyor_node_data<T>::governing_node_destroyed() {
appendages.clear();
merger = nullptr;
}
template <typename T> AdaptConveyorFeeder<T>::~AdaptConveyorFeeder() {
template <typename T> adapt_conveyor_feeder<T>::~adapt_conveyor_feeder() {
if (feedee) {
feedee->setFeeder(nullptr);
feedee = nullptr;
@ -530,30 +537,30 @@ template <typename T> AdaptConveyorFeeder<T>::~AdaptConveyorFeeder() {
}
template <typename T>
void AdaptConveyorFeeder<T>::setFeedee(AdaptConveyorNode<T> *feedee_p) {
void adapt_conveyor_feeder<T>::set_feedee(adapt_conveyor_node<T> *feedee_p) {
feedee = feedee_p;
}
template <typename T> void AdaptConveyorFeeder<T>::feed(T &&value) {
template <typename T> void adapt_conveyor_feeder<T>::feed(T &&value) {
if (feedee) {
feedee->feed(std::move(value));
}
}
template <typename T> void AdaptConveyorFeeder<T>::fail(Error &&error) {
template <typename T> void adapt_conveyor_feeder<T>::fail(error &&error) {
if (feedee) {
feedee->fail(std::move(error));
}
}
template <typename T> size_t AdaptConveyorFeeder<T>::queued() const {
template <typename T> size_t adapt_conveyor_feeder<T>::queued() const {
if (feedee) {
return feedee->queued();
}
return 0;
}
template <typename T> size_t AdaptConveyorFeeder<T>::space() const {
template <typename T> size_t adapt_conveyor_feeder<T>::space() const {
if (feedee) {
return feedee->space();
}
@ -561,20 +568,20 @@ template <typename T> size_t AdaptConveyorFeeder<T>::space() const {
}
template <typename T>
Error AdaptConveyorFeeder<T>::swap(Conveyor<T> &&conveyor) noexcept {
SAW_ASSERT(feedee) { return criticalError("No feedee connected"); }
error adapt_conveyor_feeder<T>::swap(conveyor<T> &&conveyor) noexcept {
SAW_ASSERT(feedee) { return critical_error("No feedee connected"); }
auto node = Conveyor<T>::fromConveyor(std::move(conveyor));
auto node = conveyor<T>::from_conveyor(std::move(conveyor));
feedee->swapChild(std::move(node));
return noError();
return no_error();
}
template <typename T>
AdaptConveyorNode<T>::AdaptConveyorNode() : ConveyorEventStorage{} {}
adapt_conveyor_node<T>::adapt_conveyor_node() : conveyor_event_storage{} {}
template <typename T> AdaptConveyorNode<T>::~AdaptConveyorNode() {
template <typename T> adapt_conveyor_node<T>::~adapt_conveyor_node() {
if (feeder) {
feeder->setFeedee(nullptr);
feeder = nullptr;
@ -582,12 +589,12 @@ template <typename T> AdaptConveyorNode<T>::~AdaptConveyorNode() {
}
template <typename T>
ErrorOr<Own<ConveyorNode>>
AdaptConveyorNode<T>::swapChild(Own<ConveyorNode> &&swapee) noexcept {
error_or<own<conveyor_node>>
adapt_conveyor_node<T>::swap_child(own<conveyor_node> &&swapee) noexcept {
// This should return the owning pointer of this instance
auto myself_err = parent_node.swapChildOfParent(std::move(swapee));
auto myself_err = parent_node.swap_child_of_parent(std::move(swapee));
if (myself_err.isError()) {
if (myself_err.is_error()) {
return myself_err;
}
@ -599,56 +606,57 @@ AdaptConveyorNode<T>::swapChild(Own<ConveyorNode> &&swapee) noexcept {
}
template <typename T>
ConveyorStorage *AdaptConveyorNode<T>::nextStorage() noexcept {
return static_cast<ConveyorStorage *>(this);
conveyor_storage *adapt_conveyor_node<T>::next_storage() noexcept {
return static_cast<conveyor_storage *>(this);
}
template <typename T>
void AdaptConveyorNode<T>::notifyParentAttached(ConveyorNode &par) noexcept {
parent_node.changeParent(&par);
void adapt_conveyor_node<T>::notify_parent_attached(
conveyor_node &par) noexcept {
parent_node.change_parent(&par);
}
template <typename T>
void AdaptConveyorNode<T>::setFeeder(AdaptConveyorFeeder<T> *feeder_p) {
void adapt_conveyor_node<T>::set_feeder(adapt_conveyor_feeder<T> *feeder_p) {
feeder = feeder_p;
}
template <typename T> void AdaptConveyorNode<T>::feed(T &&value) {
template <typename T> void adapt_conveyor_node<T>::feed(T &&value) {
storage.push(std::move(value));
armNext();
arm_next();
}
template <typename T> void AdaptConveyorNode<T>::fail(Error &&error) {
template <typename T> void adapt_conveyor_node<T>::fail(error &&error) {
storage.push(std::move(error));
armNext();
arm_next();
}
template <typename T> size_t AdaptConveyorNode<T>::queued() const {
template <typename T> size_t adapt_conveyor_node<T>::queued() const {
return storage.size();
}
template <typename T> size_t AdaptConveyorNode<T>::space() const {
template <typename T> size_t adapt_conveyor_node<T>::space() const {
return std::numeric_limits<size_t>::max() - storage.size();
}
template <typename T>
void AdaptConveyorNode<T>::getResult(ErrorOrValue &err_or_val) {
void adapt_conveyor_node<T>::get_result(error_or_value &err_or_val) {
if (!storage.empty()) {
err_or_val.as<T>() = std::move(storage.front());
storage.pop();
} else {
err_or_val.as<T>() =
criticalError("Signal for retrieval of storage sent even though no "
"data is present");
err_or_val.as<T>() = critical_error(
"Signal for retrieval of storage sent even though no "
"data is present");
}
}
template <typename T> void AdaptConveyorNode<T>::childHasFired() {
template <typename T> void adapt_conveyor_node<T>::child_has_fired() {
// Adapt node has no children
assert(false);
}
template <typename T> void AdaptConveyorNode<T>::parentHasFired() {
template <typename T> void adapt_conveyor_node<T>::parent_has_fired() {
SAW_ASSERT(parent) { return; }
if (parent->space() == 0) {
@ -656,17 +664,17 @@ template <typename T> void AdaptConveyorNode<T>::parentHasFired() {
}
}
template <typename T> void AdaptConveyorNode<T>::fire() {
template <typename T> void adapt_conveyor_node<T>::fire() {
if (parent) {
parent->childHasFired();
parent->child_has_fired();
if (storage.size() > 0) {
armLater();
arm_later();
}
}
}
template <typename T> OneTimeConveyorFeeder<T>::~OneTimeConveyorFeeder() {
template <typename T> one_time_conveyor_feeder<T>::~one_time_conveyor_feeder() {
if (feedee) {
feedee->setFeeder(nullptr);
feedee = nullptr;
@ -674,37 +682,38 @@ template <typename T> OneTimeConveyorFeeder<T>::~OneTimeConveyorFeeder() {
}
template <typename T>
void OneTimeConveyorFeeder<T>::setFeedee(OneTimeConveyorNode<T> *feedee_p) {
void one_time_conveyor_feeder<T>::set_feedee(
one_time_conveyor_node<T> *feedee_p) {
feedee = feedee_p;
}
template <typename T> void OneTimeConveyorFeeder<T>::feed(T &&value) {
template <typename T> void one_time_conveyor_feeder<T>::feed(T &&value) {
if (feedee) {
feedee->feed(std::move(value));
}
}
template <typename T> void OneTimeConveyorFeeder<T>::fail(Error &&error) {
template <typename T> void one_time_conveyor_feeder<T>::fail(error &&error) {
if (feedee) {
feedee->fail(std::move(error));
}
}
template <typename T> size_t OneTimeConveyorFeeder<T>::queued() const {
template <typename T> size_t one_time_conveyor_feeder<T>::queued() const {
if (feedee) {
return feedee->queued();
}
return 0;
}
template <typename T> size_t OneTimeConveyorFeeder<T>::space() const {
template <typename T> size_t one_time_conveyor_feeder<T>::space() const {
if (feedee) {
return feedee->space();
}
return 0;
}
template <typename T> OneTimeConveyorNode<T>::~OneTimeConveyorNode() {
template <typename T> one_time_conveyor_node<T>::~one_time_conveyor_node() {
if (feeder) {
feeder->setFeedee(nullptr);
feeder = nullptr;
@ -712,43 +721,44 @@ template <typename T> OneTimeConveyorNode<T>::~OneTimeConveyorNode() {
}
template <typename T>
void OneTimeConveyorNode<T>::setFeeder(OneTimeConveyorFeeder<T> *feeder_p) {
void one_time_conveyor_node<T>::set_feeder(
one_time_conveyor_feeder<T> *feeder_p) {
feeder = feeder_p;
}
template <typename T> void OneTimeConveyorNode<T>::feed(T &&value) {
template <typename T> void one_time_conveyor_node<T>::feed(T &&value) {
storage = std::move(value);
armNext();
arm_next();
}
template <typename T> void OneTimeConveyorNode<T>::fail(Error &&error) {
template <typename T> void one_time_conveyor_node<T>::fail(error &&error) {
storage = std::move(error);
armNext();
arm_next();
}
template <typename T> size_t OneTimeConveyorNode<T>::queued() const {
template <typename T> size_t one_time_conveyor_node<T>::queued() const {
return storage.has_value() ? 1 : 0;
}
template <typename T> size_t OneTimeConveyorNode<T>::space() const {
template <typename T> size_t one_time_conveyor_node<T>::space() const {
return passed ? 0 : 1;
}
template <typename T>
void OneTimeConveyorNode<T>::getResult(ErrorOrValue &err_or_val) {
void one_time_conveyor_node<T>::get_result(error_or_value &err_or_val) {
if (storage.has_value()) {
err_or_val.as<T>() = std::move(storage.value());
storage = std::nullopt;
} else {
err_or_val.as<T>() =
criticalError("Signal for retrieval of storage sent even though no "
"data is present");
err_or_val.as<T>() = critical_error(
"Signal for retrieval of storage sent even though no "
"data is present");
}
}
template <typename T> void OneTimeConveyorNode<T>::fire() {
template <typename T> void one_time_conveyor_node<T>::fire() {
if (parent) {
parent->childHasFired();
parent->child_has_fired();
}
}

View File

@ -32,43 +32,43 @@ namespace saw {
assert(expression); \
if (!(expression)) [[unlikely]]
template <typename T> using Maybe = std::optional<T>;
template <typename T> using maybe = std::optional<T>;
template <typename T> using Own = std::unique_ptr<T>;
template <typename T> using own = std::unique_ptr<T>;
template <typename T> using Our = std::shared_ptr<T>;
template <typename T> using our = std::shared_ptr<T>;
template <typename T> using Lent = std::weak_ptr<T>;
template <typename T> using lent = std::weak_ptr<T>;
template <typename T, class... Args> Own<T> heap(Args &&...args) {
return Own<T>(new T(std::forward<Args>(args)...));
template <typename T, class... Args> own<T> heap(Args &&...args) {
return own<T>(new T(std::forward<Args>(args)...));
}
template <typename T, class... Args> Our<T> share(Args &&...args) {
template <typename T, class... Args> our<T> share(Args &&...args) {
return std::make_shared<T>(std::forward<Args>(args)...);
}
template <typename T> T instance() noexcept;
template <typename Func, typename T> struct ReturnTypeHelper {
template <typename Func, typename T> struct return_type_helper {
typedef decltype(instance<Func>()(instance<T>())) Type;
};
template <typename Func> struct ReturnTypeHelper<Func, void> {
template <typename Func> struct return_type_helper<Func, void> {
typedef decltype(instance<Func>()()) Type;
};
template <typename Func, typename T>
using ReturnType = typename ReturnTypeHelper<Func, T>::Type;
using return_type = typename return_type_helper<Func, T>::Type;
struct Void {};
template <typename T> struct VoidFix { typedef T Type; };
template <> struct VoidFix<void> { typedef Void Type; };
template <typename T> using FixVoid = typename VoidFix<T>::Type;
template <typename T> struct void_fix { typedef T Type; };
template <> struct void_fix<void> { typedef Void Type; };
template <typename T> using fix_void = typename void_fix<T>::Type;
template <typename T> struct VoidUnfix { typedef T Type; };
template <> struct VoidUnfix<Void> { typedef void Type; };
template <typename T> using UnfixVoid = typename VoidUnfix<T>::Type;
template <typename T> struct void_unfix { typedef T Type; };
template <> struct void_unfix<Void> { typedef void Type; };
template <typename T> using unfix_void = typename void_unfix<T>::Type;
template <typename... T> constexpr bool always_false = false;

View File

@ -1,19 +1,19 @@
#include "error.h"
namespace saw {
Error::Error() : error_{static_cast<Error::Code>(0)} {}
error::error() : error_{static_cast<error::code>(0)} {}
Error::Error(const std::string_view &msg, Error::Code code)
: error_message{msg}, error_{static_cast<Error::Code>(code)} {}
error::error(const std::string_view &msg, error::code code)
: error_message{msg}, error_{static_cast<error::code>(code)} {}
Error::Error(std::string &&msg, Error::Code code)
: error_message{std::move(msg)}, error_{static_cast<Error::Code>(code)} {}
error::error(std::string &&msg, error::code code)
: error_message{std::move(msg)}, error_{static_cast<error::code>(code)} {}
Error::Error(Error &&error)
error::error(error &&error)
: error_message{std::move(error.error_message)}, error_{std::move(
error.error_)} {}
const std::string_view Error::message() const {
const std::string_view error::message() const {
return std::visit(
[this](auto &&arg) -> const std::string_view {
@ -24,50 +24,50 @@ const std::string_view Error::message() const {
} else if constexpr (std::is_same_v<T, std::string_view>) {
return arg;
} else {
return "Error in class Error. Good luck :)";
return "error in class error. Good luck :)";
}
},
error_message);
}
bool Error::failed() const {
return static_cast<std::underlying_type_t<Error::Code>>(error_) != 0;
bool error::failed() const {
return static_cast<std::underlying_type_t<error::code>>(error_) != 0;
}
bool Error::isCritical() const {
return static_cast<std::underlying_type_t<Error::Code>>(error_) < 0;
bool error::is_critical() const {
return static_cast<std::underlying_type_t<error::code>>(error_) < 0;
}
bool Error::isRecoverable() const {
return static_cast<std::underlying_type_t<Error::Code>>(error_) > 0;
bool error::is_recoverable() const {
return static_cast<std::underlying_type_t<error::code>>(error_) > 0;
}
Error Error::copyError() const {
Error error;
error error::copy_error() const {
error error;
error.error_ = error_;
try {
error.error_message = error_message;
} catch (const std::bad_alloc &) {
error.error_message =
std::string_view{"Error while copying Error string. Out of memory"};
std::string_view{"error while copying error string. Out of memory"};
}
return error;
}
Error::Code Error::code() const { return static_cast<Error::Code>(error_); }
error::code error::code() const { return static_cast<error::code>(error_); }
Error makeError(const std::string_view &generic, Error::Code code) {
return Error{generic, code};
error makeerror(const std::string_view &generic, error::code code) {
return error{generic, code};
}
Error criticalError(const std::string_view &generic, Error::Code c) {
return makeError(generic, c);
error critical_error(const std::string_view &generic, error::code c) {
return makeerror(generic, c);
}
Error recoverableError(const std::string_view &generic, Error::Code c) {
return makeError(generic, c);
error recoverable_error(const std::string_view &generic, error::code c) {
return makeerror(generic, c);
}
Error noError() { return Error{}; }
error no_error() { return error{}; }
} // namespace saw

View File

@ -11,133 +11,140 @@
namespace saw {
/**
* Utility class for generating errors. Has a base distinction between
* critical and recoverable errors. Additional code ids can be provided to the
* critical and recoverable_ errors. Additional code ids can be provided to the
* constructor if additional distinctions are necessary.
*/
class Error {
class error {
public:
enum class Code : int16_t {
GenericCritical = -1,
GenericRecoverable = 1,
Disconnected = -99,
Exhausted = -98
enum class code : int16_t {
generic_critical = -1,
generic_recoverable = 1,
disconnected = -99,
exhausted = -98
};
private:
std::variant<std::string_view, std::string> error_message;
Code error_;
code error_;
public:
Error();
Error(const std::string_view &msg, Error::Code code);
Error(std::string &&msg, Error::Code code);
Error(Error &&error);
error();
error(const std::string_view &msg, error::code code);
error(std::string &&msg, error::code code);
error(error &&error);
SAW_FORBID_COPY(Error);
SAW_FORBID_COPY(error);
Error &operator=(Error &&) = default;
error &operator=(error &&) = default;
const std::string_view message() const;
bool failed() const;
bool isCritical() const;
bool isRecoverable() const;
bool is_critical() const;
bool is_recoverable() const;
Error copyError() const;
error copy_error() const;
Code code() const;
code error_code() const;
};
Error makeError(const std::string_view &generic, Error::Code c);
error make_error(const std::string_view &generic, error::code c);
template <typename Formatter>
Error makeError(const Formatter &formatter, Error::Code code,
const std::string_view &generic) {
error make_error(const Formatter &formatter, error::code code,
const std::string_view &generic) {
/*
try {
std::string error_msg = formatter();
return Error{std::move(error_msg), code};
return error{std::move(error_msg), code};
} catch (std::bad_alloc &) {
return Error{generic, code};
return error{generic, code};
}
*/
std::string error_msg = formatter();
return error{std::move(error_msg), code};
}
Error criticalError(const std::string_view &generic,
Error::Code c = Error::Code::GenericCritical);
error critical_error(const std::string_view &generic,
error::code c = error::code::generic_critical);
template <typename Formatter>
Error criticalError(const Formatter &formatter, const std::string_view &generic,
Error::Code c = Error::Code::GenericCritical) {
return makeError(formatter, c, generic);
error critical_error(const Formatter &formatter,
const std::string_view &generic,
error::code c = error::code::generic_critical) {
return makeerror(formatter, c, generic);
}
Error recoverableError(const std::string_view &generic,
Error::Code c = Error::Code::GenericRecoverable);
error recoverable_error(const std::string_view &generic,
error::code c = error::code::generic_recoverable);
template <typename Formatter>
Error recoverableError(const Formatter &formatter,
const std::string_view &generic,
Error::Code c = Error::Code::GenericRecoverable) {
return makeError(formatter, c, generic);
error recoverable_error(const Formatter &formatter,
const std::string_view &generic,
error::code c = error::code::generic_recoverable) {
return makeerror(formatter, c, generic);
}
Error noError();
error no_error();
/**
* Exception alternative. Since I code without exceptions this class is
* essentially a kind of exception replacement.
*/
template <typename T> class ErrorOr;
template <typename T> class error_or;
class ErrorOrValue {
class error_or_value {
public:
virtual ~ErrorOrValue() = default;
virtual ~error_or_value() = default;
template <typename T> ErrorOr<UnfixVoid<T>> &as() {
return static_cast<ErrorOr<UnfixVoid<T>> &>(*this);
template <typename T> error_or<unfix_void<T>> &as() {
return static_cast<error_or<unfix_void<T>> &>(*this);
}
template <typename T> const ErrorOr<UnfixVoid<T>> &as() const {
return static_cast<const ErrorOr<UnfixVoid<T>> &>(*this);
template <typename T> const error_or<unfix_void<T>> &as() const {
return static_cast<const error_or<unfix_void<T>> &>(*this);
}
};
template <typename T> class ErrorOr final : public ErrorOrValue {
template <typename T> class error_or final : public error_or_value {
private:
std::variant<Error, FixVoid<T>> value_or_error;
std::variant<error, fix_void<T>> value_or_error;
static_assert(!std::is_same_v<T, Void>, "Don't use internal private types");
public:
ErrorOr() = default;
ErrorOr(const FixVoid<T> &value) : value_or_error{value} {}
error_or() = default;
error_or(const fix_void<T> &value) : value_or_error{value} {}
ErrorOr(FixVoid<T> &&value) : value_or_error{std::move(value)} {}
error_or(fix_void<T> &&value) : value_or_error{std::move(value)} {}
ErrorOr(const Error &error) : value_or_error{error} {}
ErrorOr(Error &&error) : value_or_error{std::move(error)} {}
error_or(const error &error) : value_or_error{error} {}
error_or(error &&error) : value_or_error{std::move(error)} {}
bool isValue() const {
return std::holds_alternative<FixVoid<T>>(value_or_error);
bool is_value() const {
return std::holds_alternative<fix_void<T>>(value_or_error);
}
bool isError() const {
return std::holds_alternative<Error>(value_or_error);
bool is_error() const {
return std::holds_alternative<error>(value_or_error);
}
Error &error() { return std::get<Error>(value_or_error); }
class error &error() {
return std::get<error>(value_or_error);
}
const Error &error() const { return std::get<Error>(value_or_error); }
const class error &error() const { return std::get<error>(value_or_error); }
FixVoid<T> &value() { return std::get<FixVoid<T>>(value_or_error); }
fix_void<T> &value() { return std::get<fix_void<T>>(value_or_error); }
const FixVoid<T> &value() const {
return std::get<FixVoid<T>>(value_or_error);
const fix_void<T> &value() const {
return std::get<fix_void<T>>(value_or_error);
}
};
template <typename T> class ErrorOr<ErrorOr<T>> {
template <typename T> class error_or<error_or<T>> {
private:
ErrorOr() = delete;
error_or() = delete;
};
} // namespace saw