clboss/tests/boss/test_reqresp.cpp

76 lines
1.5 KiB
C++
Raw Permalink Normal View History

#undef NDEBUG
#include"Boss/ModG/ReqResp.hpp"
gcc: Fix Compatibility Issue with GCC 13 This commit addresses a compatibility issue introduced by GCC in version 13 (refer to [1]). The issue is present in both the Arch base system and the latest version of Fedora. To resolve this, the commit introduces a Kernel-mimicking approach through a new `Compiler.hpp` file. In this file, we define various compiler hacks required to enhance code readability by reducing verbosity. For more details on the issue, see [1]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107134 ``` In file included from ./Boss/Msg/RequestPeerFromScid.hpp:4, from Boss/Mod/PeerFromScidMapper.cpp:3: ./Ln/Scid.hpp:16:14: error: 'uint64_t' in namespace 'std' does not name a type; did you mean 'wint_t'? 16 | std::uint64_t val; | ^~~~~~~~ | wint_t ./Ln/Scid.hpp: In constructor 'Ln::Scid::Scid(std::nullptr_t)': ./Ln/Scid.hpp:19:44: error: class 'Ln::Scid' does not have any field named 'val' 19 | Scid(std::nullptr_t _ = nullptr) : val(0) { } | ^~~ ./Ln/Scid.hpp: In member function 'Ln::Scid::operator bool() const': ./Ln/Scid.hpp:25:24: error: 'val' was not declared in this scope 25 | return val != 0; | ^~~ ./Ln/Scid.hpp: In member function 'bool Ln::Scid::operator==(const Ln::Scid&) const': ./Ln/Scid.hpp:32:24: error: 'val' was not declared in this scope 32 | return val == i.val; | ^~~ ./Ln/Scid.hpp:32:33: error: 'const class Ln::Scid' has no member named 'val' 32 | return val == i.val; | ^~~ ./Ln/Scid.hpp: In member function 'bool Ln::Scid::operator<(const Ln::Scid&) const': ./Ln/Scid.hpp:39:24: error: 'val' was not declared in this scope 39 | return val < i.val; | ^~~ ./Ln/Scid.hpp:39:32: error: 'const class Ln::Scid' has no member named 'val' 39 | return val < i.val; | ^~~ /bin/sh ./libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I./external/basicsecure/ -I./external/bitcoin-ripemd160/ -I./external/bitcoin-sha256/ -I./external/secp256k1/include/ -I./external/jsmn -Wall -Werror -pthread -Wno-noexcept-type -DUSE_VALGRIND -O2 -MT Boss/Mod/libclboss_la-UnmanagedManager.lo -MD -MP -MF Boss/Mod/.deps/libclboss_la-UnmanagedManager.Tpo -c -o Boss/Mod/libclboss_la-UnmanagedManager.lo `test -f 'Boss/Mod/UnmanagedManager.cpp' || echo './'`Boss/Mod/UnmanagedManager.cpp libtool: compile: g++ -DHAVE_CONFIG_H -I. -I./external/basicsecure/ -I./external/bitcoin-ripemd160/ -I./external/bitcoin-sha256/ -I./external/secp256k1/include/ -I./external/jsmn -Wall -Werror -pthread -Wno-noexcept-type -DUSE_VALGRIND -O2 -MT Boss/Mod/libclboss_la-UnmanagedManager.lo -MD -MP -MF Boss/Mod/.deps/libclboss_la-UnmanagedManager.Tpo -c Boss/Mod/UnmanagedManager.cpp -o Boss/Mod/libclboss_la-UnmanagedManager.o ``` Reported-by: Lakshya Singh <@king-11> Co-Developed-by: Lakshya Singh <@king-11> Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
2023-08-17 14:25:30 +05:30
#include"Util/Compiler.hpp"
#include"Ev/Io.hpp"
#include"Ev/map.hpp"
#include"Ev/start.hpp"
#include"Ev/yield.hpp"
#include"S/Bus.hpp"
#include"Util/make_unique.hpp"
#include<assert.h>
#include<vector>
namespace {
/* Example req-resp module that just does a trivial processing. */
struct InNumber {
void* requester;
std::uint32_t number;
};
struct OutNumber {
void* requester;
std::uint32_t number;
};
class Incrementer {
private:
S::Bus& bus;
public:
Incrementer() =delete;
Incrementer(Incrementer&&) =delete;
Incrementer(Incrementer const&) =delete;
explicit
Incrementer( S::Bus& bus_
) : bus(bus_) {
bus.subscribe<InNumber>([this](InNumber const& in) {
return bus.raise(OutNumber{ in.requester
, in.number + 1
});
});
}
};
}
int main() {
auto bus = S::Bus();
auto incr = Util::make_unique<Incrementer>(bus);
auto rr = Boss::ModG::ReqResp<InNumber, OutNumber>
(bus);
auto code = Ev::lift().then([&]() {
return rr.execute(InNumber{nullptr, 42});
}).then([&](OutNumber n) {
assert(n.number == 43);
/* Parallel execution. */
auto v = std::vector<std::uint32_t>{5, 6, 7, 8};
auto f = [&](std::uint32_t v) {
return Ev::yield().then([&rr, v]() {
return rr.execute(InNumber{nullptr, v});
}).then([](OutNumber n) {
return Ev::lift(n.number);
});
};
return Ev::map(std::move(f), std::move(v));
}).then([&](std::vector<std::uint32_t> nums) {
assert((nums == std::vector<std::uint32_t>{6, 7, 8, 9}));
return Ev::lift(0);
});
return Ev::start(code);
}