v2.0 #15

Merged
Persson-dev merged 9 commits from v2.0 into main 2025-07-10 13:15:42 +00:00
6 changed files with 76 additions and 3 deletions
Showing only changes of commit 59bedd6482 - Show all commits

4
.gitignore vendored
View File

@@ -6,4 +6,6 @@ build/
.DS_Store .DS_Store
.vscode .vscode
*.bin

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <sp/protocol/MessageBase.h> #include <sp/protocol/MessageBase.h>
#include <sp/protocol/MessageIO.h>
namespace sp { namespace sp {
@@ -8,6 +9,7 @@ template <typename TData, typename TMessageID, TMessageID ID, typename THandler>
class ConcreteMessage : public MessageBase<TMessageID, THandler> { class ConcreteMessage : public MessageBase<TMessageID, THandler> {
public: public:
using DataType = TData; using DataType = TData;
using ThisType = ConcreteMessage<TData, TMessageID, ID, THandler>;
template <typename... T> template <typename... T>
ConcreteMessage(const T&... args) : m_Data{args...} {} ConcreteMessage(const T&... args) : m_Data{args...} {}
@@ -19,7 +21,15 @@ class ConcreteMessage : public MessageBase<TMessageID, THandler> {
} }
virtual void Dispatch(THandler& handler) const override { virtual void Dispatch(THandler& handler) const override {
handler.Handle(static_cast<const ConcreteMessage<TData, TMessageID, ID, THandler>&>(*this)); handler.Handle(static_cast<const ThisType&>(*this));
}
virtual void Read(std::istream& a_Is) override {
details::ReadMessage(a_Is, m_Data);
}
virtual void Write(std::ostream& a_Os) const override {
details::WriteMessage(a_Os, m_Data);
} }
private: private:

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include <iosfwd>
namespace sp { namespace sp {
template <typename TMessageID, typename THandler> template <typename TMessageID, typename THandler>
@@ -14,6 +16,9 @@ class MessageBase {
virtual MessageIdType GetId() const = 0; virtual MessageIdType GetId() const = 0;
virtual void Dispatch(HandlerType& handler) const = 0; virtual void Dispatch(HandlerType& handler) const = 0;
virtual void Read(std::istream& a_Is) = 0;
virtual void Write(std::ostream& a_Os) const = 0;
}; };
} // namespace sp } // namespace sp

View File

@@ -0,0 +1,38 @@
#pragma once
#include <boost/pfr.hpp>
#include <iostream>
#include <sp/common/ByteSwapping.h>
namespace sp {
namespace details {
template<typename T>
void WriteField(std::ostream& a_Os, const T& a_Data) {
T swapped = a_Data;
ToNetwork(swapped);
a_Os.write(reinterpret_cast<const char*>(&swapped), sizeof(a_Data));
}
template<typename T>
void ReadField(std::istream& a_Is, T& a_Data) {
a_Is.read(reinterpret_cast<char*>(&a_Data), sizeof(a_Data));
FromNetwork(a_Data);
}
template <typename TData>
void WriteMessage(std::ostream& a_Os, const TData& a_MessageData) {
boost::pfr::for_each_field(a_MessageData, [&a_Os](const auto& a_Field) {
WriteField(a_Os, a_Field);
});
}
template <typename TData>
void ReadMessage(std::istream& a_Is, TData& a_MessageData) {
boost::pfr::for_each_field(a_MessageData, [&a_Is](auto& a_Field) {
ReadField(a_Is, a_Field);
});
}
} // namespace details
} // namespace sp

View File

@@ -5,8 +5,9 @@
#include <cstdint> #include <cstdint>
#include <iostream> #include <iostream>
#include <fstream>
enum class PacketID { KeepAlive = 0}; enum class PacketID { KeepAlive = 0 };
class PacketHandler; class PacketHandler;
@@ -38,6 +39,9 @@ using PacketFactory = sp::MessageFactory<PacketBase, AllMessages>;
int main() { int main() {
KeepAliveMessage m{5UL}; KeepAliveMessage m{5UL};
// dispatch tests
MyHandler h; MyHandler h;
PacketDispatcher d; PacketDispatcher d;
d.RegisterHandler(PacketID::KeepAlive, &h); d.RegisterHandler(PacketID::KeepAlive, &h);
@@ -45,5 +49,17 @@ int main() {
PacketFactory f; PacketFactory f;
auto message = f.CreateMessage(PacketID::KeepAlive); auto message = f.CreateMessage(PacketID::KeepAlive);
d.Dispatch(*message); d.Dispatch(*message);
// write tests
std::ofstream file {"test.bin"};
message->Write(file);
// file << std::endl;
m.Write(file);
// file << std::endl;
// message->Read(file);
return 0; return 0;
} }

View File

@@ -106,6 +106,8 @@ for _, file in ipairs(os.files("test/**.cpp")) do
add_files(file) add_files(file)
add_includedirs("include") add_includedirs("include")
set_rundir(".")
add_deps("SimpleProtocol") add_deps("SimpleProtocol")
add_tests("compile_and_run") add_tests("compile_and_run")