From d5e092f5b55c40682af7c9e8224107c502bb8e9e Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sun, 10 Dec 2023 15:21:44 +0100 Subject: [PATCH] Implement Serializer class. --- source/base/memory/serializer.cc | 68 ++++++++++++++++++++++++++++++++ source/base/memory/serializer.h | 50 +++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 source/base/memory/serializer.cc create mode 100644 source/base/memory/serializer.h diff --git a/source/base/memory/serializer.cc b/source/base/memory/serializer.cc new file mode 100644 index 0000000000..2050056ab9 --- /dev/null +++ b/source/base/memory/serializer.cc @@ -0,0 +1,68 @@ +// +// Aspia Project +// Copyright (C) 2016-2023 Dmitry Chapyshev +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#include "base/memory/serializer.h" + +namespace base { + +//-------------------------------------------------------------------------------------------------- +Serializer::Serializer() +{ + for (size_t i = 0; i < kPoolSize; ++i) + pool_[i].reserve(kBufferSize); +} + +//-------------------------------------------------------------------------------------------------- +Serializer::~Serializer() = default; + +//-------------------------------------------------------------------------------------------------- +base::ByteArray Serializer::serialize(const google::protobuf::MessageLite& message) +{ + const size_t size = message.ByteSizeLong(); + if (!size) + return base::ByteArray(); + + base::ByteArray buffer; + + if (free_) + { + buffer = std::move(pool_[free_ - 1]); + + if (buffer.capacity() < size) + buffer.reserve(size); + + --free_; + } + + buffer.resize(size); + + message.SerializeWithCachedSizesToArray(buffer.data()); + return buffer; +} + +//-------------------------------------------------------------------------------------------------- +void Serializer::addBuffer(base::ByteArray&& buffer) +{ + if (free_ < kPoolSize) + { + pool_[free_] = std::move(buffer); + ++free_; + } +} + +} // namespace base diff --git a/source/base/memory/serializer.h b/source/base/memory/serializer.h new file mode 100644 index 0000000000..368c16c95a --- /dev/null +++ b/source/base/memory/serializer.h @@ -0,0 +1,50 @@ +// +// Aspia Project +// Copyright (C) 2016-2023 Dmitry Chapyshev +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +#ifndef BASE_MEMORY_SERIALIZER_H +#define BASE_MEMORY_SERIALIZER_H + +#include "base/macros_magic.h" +#include "base/memory/byte_array.h" + +#include + +namespace base { + +class Serializer +{ +public: + Serializer(); + ~Serializer(); + + static constexpr size_t kPoolSize = 32; + static constexpr size_t kBufferSize = 1024; + + base::ByteArray serialize(const google::protobuf::MessageLite& message); + void addBuffer(base::ByteArray&& buffer); + +private: + std::array pool_; + size_t free_ = kPoolSize; + + DISALLOW_COPY_AND_ASSIGN(Serializer); +}; + +} // namespace base + +#endif // BASE_MEMORY_SERIALIZER_H