diff --git a/mc_buffer.cpp b/mc_buffer.cpp index c9afaeb..51b41d5 100644 --- a/mc_buffer.cpp +++ b/mc_buffer.cpp @@ -98,5 +98,26 @@ int Buffer::bytes() const { return data_.size(); } +bool Buffer::serialize(Serializer* serializer) const { + serializer->write(bytes()); + serializer->writeRaw(data(), bytes()); + return true; +} + +bool Buffer::deserialize(Deserializer* deserializer) { + int count = 0; + if (!deserializer->read(&count)) { + return false; + } + + const byte* const data = deserializer->readRaw(count); + if (data == NULL) { + return false; + } + + setData(data, count); + return true; +} + } diff --git a/mc_buffer.hpp b/mc_buffer.hpp index b71f247..e53de77 100644 --- a/mc_buffer.hpp +++ b/mc_buffer.hpp @@ -48,6 +48,9 @@ public: void* data (); int bytes () const; + bool serialize (Serializer* serializer) const; + bool deserialize (Deserializer* deserializer); + private: std::vector data_; }; diff --git a/mc_common.hpp b/mc_common.hpp index c586ece..e4d81ab 100644 --- a/mc_common.hpp +++ b/mc_common.hpp @@ -53,4 +53,12 @@ namespace metacall { #endif +// +// Forward declarations +// + +class Serializer; +class Deserializer; + + } diff --git a/mc_meta.hpp b/mc_meta.hpp index 28b920e..15612ba 100644 --- a/mc_meta.hpp +++ b/mc_meta.hpp @@ -32,7 +32,7 @@ namespace metacall { // Meta // -qword serialize(class Serializer*, ...); +qword serialize(Serializer*, ...); template struct HasGlobalSerializer { @@ -46,7 +46,7 @@ struct HasGlobalSerializer { }; }; -qword deserialize(class Deserializer*, ...); +qword deserialize(Deserializer*, ...); template struct HasGlobalDeserializer { @@ -62,11 +62,11 @@ struct HasGlobalDeserializer { template struct HasLocalSerializer { - template + template struct Signature { }; template - static dword Test(Signature*); + static dword Test(Signature*); template static qword Test(...); @@ -82,7 +82,7 @@ struct HasLocalDeserializer { struct Signature { }; template - static dword Test(Signature*); + static dword Test(Signature*); template static qword Test(...); diff --git a/mc_packet.hpp b/mc_packet.hpp index a15185c..afb85e3 100644 --- a/mc_packet.hpp +++ b/mc_packet.hpp @@ -56,6 +56,20 @@ struct PacketHeader { { } + bool serialize(Serializer* serializer) const { + return + serializer->write(magic) && + serializer->write(id) && + serializer->write(size); + } + + bool deserialize(Deserializer* deserializer) { + return + deserializer->read(&magic) && + deserializer->read(&id) && + deserializer->read(&size); + } + dword magic; byte id; dword size; @@ -77,6 +91,20 @@ struct PacketInvokeRequest { Id = PACKET_ID_FUNCTION_CALL_REQUEST }; + bool serialize(Serializer* serializer) const { + return + serializer->write(function) && + serializer->write(taskId) && + serializer->write(data); + } + + bool deserialize(Deserializer* deserializer) { + return + deserializer->read(&function) && + deserializer->read(&taskId) && + deserializer->read(&data); + } + dword function; dword taskId; Buffer data; @@ -103,6 +131,20 @@ struct PacketInvokeReply { FLAG_INVALID_ARGS = 1 << 1, }; + bool serialize(Serializer* serializer) const { + return + serializer->write(flags) && + serializer->write(taskId) && + serializer->write(data); + } + + bool deserialize(Deserializer* deserializer) { + return + deserializer->read(&flags) && + deserializer->read(&taskId) && + deserializer->read(&data); + } + word flags; dword taskId; Buffer data; diff --git a/mc_serial-inl.hpp b/mc_serial-inl.hpp index ff21fb9..7772e7c 100644 --- a/mc_serial-inl.hpp +++ b/mc_serial-inl.hpp @@ -104,40 +104,4 @@ bool Serializer::write(const T& data) { } -// -// Serializers -// - -template -bool serialize(Serializer* serializer, const ArrayWriter& writer) { - serializer->write(writer.count); - - for (int i = 0; i < writer.count; ++i) { - serializer->write(writer.data[i]); - } - - return true; -} - -template -bool deserialize(Deserializer* deserializer, ArrayReader* reader) { - reader->clear(); - - if (!deserializer->read(&reader->count)) { - return false; - } - - reader->data = new T[reader->count]; - - for (int i = 0; i < reader->count; ++i) { - if (!deserializer->read(reader->data + i)) { - reader->clear(); - return false; - } - } - - return true; -} - - } diff --git a/mc_serial.cpp b/mc_serial.cpp index 8154aa8..4b7d812 100644 --- a/mc_serial.cpp +++ b/mc_serial.cpp @@ -101,73 +101,4 @@ int Serializer::offset() const { } -// -// Serializers -// - -bool serialize(Serializer* serializer, const Buffer& buffer) { - serializer->write(buffer.bytes()); - serializer->writeRaw(buffer.data(), buffer.bytes()); - return true; -} - -bool deserialize(Deserializer* deserializer, Buffer* buffer) { - int count = 0; - if (!deserializer->read(&count)) { - return false; - } - - const byte* const data = deserializer->readRaw(count); - if (data == NULL) - { - return false; - } - - buffer->setData(data, count); - return true; -} - -bool serialize(Serializer* serializer, const PacketHeader& packet) { - return - serializer->write(packet.magic) && - serializer->write(packet.id) && - serializer->write(packet.size); -} - -bool deserialize(Deserializer* deserializer, PacketHeader* packet) { - return - deserializer->read(&packet->magic) && - deserializer->read(&packet->id) && - deserializer->read(&packet->size); -} - -bool serialize(Serializer* serializer, const PacketInvokeRequest& packet) { - return - serializer->write(packet.function) && - serializer->write(packet.taskId) && - serializer->write(packet.data); -} - -bool deserialize(Deserializer* deserializer, PacketInvokeRequest* packet) { - return - deserializer->read(&packet->function) && - deserializer->read(&packet->taskId) && - deserializer->read(&packet->data); -} - -bool serialize(Serializer* serializer, const PacketInvokeReply& packet) { - return - serializer->write(packet.flags) && - serializer->write(packet.taskId) && - serializer->write(packet.data); -} - -bool deserialize(Deserializer* deserializer, PacketInvokeReply* packet) { - return - deserializer->read(&packet->flags) && - deserializer->read(&packet->taskId) && - deserializer->read(&packet->data); -} - - } diff --git a/mc_serial.hpp b/mc_serial.hpp index 31279c8..dbee737 100644 --- a/mc_serial.hpp +++ b/mc_serial.hpp @@ -63,74 +63,9 @@ public: int offset () const; private: - Buffer* data_; - int offset_; + Buffer* data_; + int offset_; }; -// -// ArrayWriter -// - -template -class ArrayWriter { -public: - ArrayWriter(const T* data, int count) : - data(data), - count(count) - { - } - - const T* data; - int count; -}; - - -// -// ArrayReader -// - -template -class ArrayReader { -public: - ArrayReader() : - data(NULL), - count(0) - { - } - - ~ArrayReader() { - delete[] data; - - data = NULL; - count = 0; - } - - const T* data; - int count; -}; - - -// -// Standard serializers/deserializers -// - -template -bool serialize (Serializer* serializer, const ArrayWriter& writer); -template -bool deserialize (Deserializer* deserializer, ArrayReader* reader); - -bool serialize (Serializer* serializer, const Buffer& buffer); -bool deserialize (Deserializer* deserializer, Buffer* buffer); - -bool serialize (Serializer* serializer, const PacketHeader& packet); -bool deserialize (Deserializer* deserializer, PacketHeader* packet); - -bool serialize (Serializer* serializer, const PacketInvokeRequest& packet); -bool deserialize (Deserializer* deserializer, PacketInvokeRequest* packet); - -bool serialize (Serializer* serializer, const PacketInvokeReply& packet); -bool deserialize (Deserializer* deserializer, PacketInvokeReply* packet); - - } diff --git a/metacall.hpp b/metacall.hpp index d944a27..99a47d2 100644 --- a/metacall.hpp +++ b/metacall.hpp @@ -45,10 +45,10 @@ #include "mc_token.hpp" #include "mc_buffer.hpp" #include "mc_socket.hpp" -#include "mc_packet.hpp" #include "mc_meta.hpp" #include "mc_serial.hpp" #include "mc_serial-inl.hpp" +#include "mc_packet.hpp" #include "mc_functor.hpp" #include "mc_binding.hpp" #include "mc_binding-inl.hpp"