From 15b6682b177dda1bc64384c7ff1a82e88917c2e5 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Thu, 5 Jan 2023 18:19:44 +0100 Subject: Moved archive.h to libreichwein --- Makefile | 1 - archive.h | 227 ------------------------------------------------- statistics.h | 2 +- tests/Makefile | 1 - tests/test-archive.cpp | 28 ------ tests/test-https.cpp | 2 +- 6 files changed, 2 insertions(+), 259 deletions(-) delete mode 100644 archive.h delete mode 100644 tests/test-archive.cpp diff --git a/Makefile b/Makefile index 58da00f..adfc525 100644 --- a/Makefile +++ b/Makefile @@ -119,7 +119,6 @@ clean: -rm -rf result DISTFILES= \ - archive.h \ auth.cpp \ auth.h \ config.cpp \ diff --git a/archive.h b/archive.h deleted file mode 100644 index 9c9d256..0000000 --- a/archive.h +++ /dev/null @@ -1,227 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -typedef boost::coroutines2::coroutine coro_t; - -// Serialization, similar to Boost Serialization -// but for portable binary archive -// using big endian coding (network byte order) -namespace Serialization { - -class OArchive -{ -public: - OArchive(std::ostream& os): os(os) {} - ~OArchive() {} - - template - OArchive& operator &(T& v) { - v.serialize(*this); - - return *this; - }; - - template - OArchive& write_fundamental(T& v) - { - T value = boost::endian::native_to_big(v); - os.write((char*)&value, sizeof(value)); - return *this; - } - - OArchive& operator &(uint8_t& v) - { - return write_fundamental(v); - }; - - OArchive& operator &(uint16_t& v) - { - return write_fundamental(v); - }; - - OArchive& operator &(uint32_t& v) - { - return write_fundamental(v); - }; - - OArchive& operator &(uint64_t& v) - { - return write_fundamental(v); - }; - - OArchive& operator &(int64_t& v) - { - return write_fundamental(*reinterpret_cast(v)); - }; - - OArchive& operator &(std::vector& v) - { - uint32_t size = static_cast(v.size()); - *this & size; - os.write((char*)v.data(), size); - return *this; - }; - - OArchive& operator &(std::string& v) - { - uint32_t size = static_cast(v.size()); - *this & size; - os.write((char*)v.data(), v.size()); - return *this; - }; - -private: - std::ostream &os; -}; - -class IArchive -{ -public: - IArchive(std::istream& is): is(is) {} - IArchive(std::stringstream& is, coro_t::pull_type& coro) : is(is), mStringStream(&is), mCoro(&coro) {} - ~IArchive() {} - - template - IArchive& operator &(T& v) - { - v.serialize(*this); - - return *this; - }; - - template - IArchive& read_fundamental(T& v) - { - // in coroutine case, wait for input, if necessary - if (mCoro && mStringStream) { - while (true) { - auto pindex {mStringStream->tellp()}; - auto gindex {mStringStream->tellg()}; - if (pindex != std::stringstream::pos_type(-1) && gindex != std::stringstream::pos_type(-1) && pindex > gindex) { - if (static_cast(pindex - gindex) < sizeof(v)) - (*mCoro)(); - else - break; - } else { - std::cerr << "Error: read_fundamental: Bad stringstream indices: " << pindex << ", " << gindex << std::endl; - break; - } - } - } - - // now, we have enough bytes available - T value; - is.read((char*)&value, sizeof(value)); - v = boost::endian::big_to_native(value); - return *this; - } - - IArchive& operator &(uint8_t& v) - { - return read_fundamental(v); - }; - - IArchive& operator &(uint16_t& v) - { - return read_fundamental(v); - }; - - IArchive& operator &(uint32_t& v) - { - return read_fundamental(v); - }; - - IArchive& operator &(uint64_t& v) - { - return read_fundamental(v); - }; - - IArchive& operator &(int64_t& v) - { - uint64_t uv; - read_fundamental(uv); - v = *reinterpret_cast(uv); - return *this; - }; - - template - IArchive& read_bytes_vector(T& v) - { - uint32_t size; - *this & size; - - v.resize(size); - - // in coroutine case, wait for input, if necessary - if (mCoro && mStringStream) { - while (true) { - auto pindex {mStringStream->tellp()}; - auto gindex {mStringStream->tellg()}; - if (pindex != std::stringstream::pos_type(-1) && gindex != std::stringstream::pos_type(-1) && pindex > gindex) { - if (static_cast(pindex - gindex) < size) - (*mCoro)(); - else - break; - } else { - std::cerr << "Error: read_bytes_vector: Bad stringstream indices: " << pindex << ", " << gindex << std::endl; - break; - } - } - } - - // now, we have enough bytes available - is.read((char*)v.data(), size); - return *this; - } - - IArchive& operator &(std::vector& v) - { - return read_bytes_vector(v); - }; - - IArchive& operator &(std::string& v) - { - return read_bytes_vector(v); - }; - -private: - std::istream &is; - std::stringstream* mStringStream{ }; // for i/o sizes access - coro_t::pull_type* mCoro{ }; // optional for coroutine -}; - -// - Free functions ---------------------------------------------------------- - -template -void serialize(Archive& ar, T& v) -{ - ar & v; -} - -template -OArchive& operator <<(OArchive& ar, T& v) -{ - serialize(ar, v); - - return ar; -}; - -template -IArchive& operator >>(IArchive& ar, T& v) -{ - serialize(ar, v); - - return ar; -}; - -} diff --git a/statistics.h b/statistics.h index 7e4da7e..c38ef66 100644 --- a/statistics.h +++ b/statistics.h @@ -1,6 +1,6 @@ #pragma once -#include "archive.h" +#include "libreichwein/archive.h" #include #include diff --git a/tests/Makefile b/tests/Makefile index 00c50a1..9ce3dad 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -44,7 +44,6 @@ UNITS=\ webserver.cpp TESTSRC=\ - test-archive.cpp \ test-auth.cpp \ test-config.cpp \ test-environment.cpp \ diff --git a/tests/test-archive.cpp b/tests/test-archive.cpp deleted file mode 100644 index e6b5894..0000000 --- a/tests/test-archive.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "archive.h" - -using namespace std::string_literals; - -class ArchiveFixture -{ -public: - ArchiveFixture(){} - ~ArchiveFixture(){} - void setup(){} - void teardown(){} -}; - -BOOST_FIXTURE_TEST_CASE(archivetest, ArchiveFixture) -{ -} - diff --git a/tests/test-https.cpp b/tests/test-https.cpp index dcd33d7..cb917e9 100644 --- a/tests/test-https.cpp +++ b/tests/test-https.cpp @@ -9,7 +9,7 @@ #include #include -#include "archive.h" +#include "https.h" using namespace std::string_literals; -- cgit v1.2.3