From bf712bc9e59d17fc5a1cf06ed4f04db83630ec67 Mon Sep 17 00:00:00 2001 From: fraillt Date: Thu, 23 Feb 2017 10:25:33 +0200 Subject: [PATCH] added more BufferReader ctors --- include/Bitsery.h | 2 +- include/BufferReader.h | 27 +++++++++--- tests/BufferBytesOpTests.cpp | 85 ++++++++++++++++++++++++++++++++---- 3 files changed, 99 insertions(+), 15 deletions(-) diff --git a/include/Bitsery.h b/include/Bitsery.h index 9bc4c28..a43f494 100644 --- a/include/Bitsery.h +++ b/include/Bitsery.h @@ -25,7 +25,7 @@ #define BITSERY_BITSERY_H #define BITSERY_MAJOR_VERSION 1 -#define BITSERY_MINOR_VERSION 0 +#define BITSERY_MINOR_VERSION 1 #define BITSERY_PATCH_VERSION 0 #define BITSERY_QUOTE_MACRO(name) #name diff --git a/include/BufferReader.h b/include/BufferReader.h index d2a6966..780bd40 100644 --- a/include/BufferReader.h +++ b/include/BufferReader.h @@ -36,10 +36,25 @@ namespace bitsery { using value_type = uint8_t; - BufferReader(const std::vector &buf) : _buf{buf}, _pos{std::begin(buf)} { + BufferReader(const std::vector &buf) + : _pos{buf.data()}, + _end{buf.data() + buf.size()} { } + BufferReader(const uint8_t* data, size_t size) + : _pos{data}, + _end{data + size} + { + } + template + BufferReader(const uint8_t (&data)[N]) + : _pos{data}, + _end{data + N} + { + } + + template bool readBytes(T &v) { static_assert(std::is_integral(), ""); @@ -78,7 +93,7 @@ namespace bitsery { const auto bytesRequired = bitsCount > m_scratchBits ? ((bitsCount - 1 - m_scratchBits) >> 3) + 1u : 0u; - if (static_cast(std::distance(_pos, std::end(_buf))) < bytesRequired) + if (static_cast(std::distance(_pos, _end)) < bytesRequired) return false; readBitsInternal(v, bitsCount); return true; @@ -94,18 +109,18 @@ namespace bitsery { } bool isCompleted() const { - return _pos == std::end(_buf); + return _pos == _end; } private: - const std::vector &_buf; - decltype(std::begin(_buf)) _pos; + const value_type* _pos; + const value_type* _end; template bool directRead(T *v, size_t count) { static_assert(!std::is_const::value, ""); const auto bytesCount = sizeof(T) * count; - if (static_cast(std::distance(_pos, std::end(_buf))) < bytesCount) + if (static_cast(std::distance(_pos, _end)) < bytesCount) return false; std::copy_n(_pos, bytesCount, reinterpret_cast(v)); std::advance(_pos, bytesCount); diff --git a/tests/BufferBytesOpTests.cpp b/tests/BufferBytesOpTests.cpp index 16f7943..56828d7 100644 --- a/tests/BufferBytesOpTests.cpp +++ b/tests/BufferBytesOpTests.cpp @@ -41,9 +41,7 @@ struct IntegralTypes { int8_t f[2]; }; - -TEST(BufferBytesOperations, WriteAndReadBytes) { - //setup data +IntegralTypes getInitializedIntegralTypes() { IntegralTypes data; data.a = -4894541654564; data.b = 94545646; @@ -52,11 +50,10 @@ TEST(BufferBytesOperations, WriteAndReadBytes) { data.e = -98; data.f[0] = 43; data.f[1] = -45; + return data; +} - //create and write to buffer - std::vector buf{}; - BufferWriter bw{buf}; - +void writeIntegralTypesToBuffer(BufferWriter& bw, const IntegralTypes& data) { bw.writeBytes<4>(data.b); bw.writeBytes<1>(data.f[0]); bw.writeBytes<2>(data.c); @@ -64,6 +61,17 @@ TEST(BufferBytesOperations, WriteAndReadBytes) { bw.writeBytes<8>(data.a); bw.writeBytes<1>(data.e); bw.writeBytes<1>(data.f[1]); +} + + +TEST(BufferBytesOperations, WriteAndReadBytes) { + //setup data + auto data =getInitializedIntegralTypes(); + //create and write to buffer + std::vector buf{}; + BufferWriter bw{buf}; + writeIntegralTypesToBuffer(bw, data); + EXPECT_THAT(std::distance(buf.begin(), buf.end()), Eq(18)); //read from buffer BufferReader br{buf}; @@ -86,6 +94,68 @@ TEST(BufferBytesOperations, WriteAndReadBytes) { } +TEST(BufferBytesOperations, BufferReaderUsingDataPlusSizeCtor) { + //setup data + auto data =getInitializedIntegralTypes(); + //create and write to buffer + std::vector buf{}; + BufferWriter bw{buf}; + writeIntegralTypesToBuffer(bw, data); + + EXPECT_THAT(std::distance(buf.begin(), buf.end()), Eq(18)); + //read from buffer + BufferReader br{buf.data(), buf.size()}; + IntegralTypes res{}; + EXPECT_THAT(br.readBytes<4>(res.b), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.f[0]), Eq(true)); + EXPECT_THAT(br.readBytes<2>(res.c), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.d), Eq(true)); + EXPECT_THAT(br.readBytes<8>(res.a), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.e), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.f[1]), Eq(true)); + //assert results + + EXPECT_THAT(data.a, Eq(res.a)); + EXPECT_THAT(data.b, Eq(res.b)); + EXPECT_THAT(data.c, Eq(res.c)); + EXPECT_THAT(data.d, Eq(res.d)); + EXPECT_THAT(data.e, Eq(res.e)); + EXPECT_THAT(data.f, ContainerEq(res.f)); +} + +TEST(BufferBytesOperations, BufferReaderUsingCArrayCtor) { + //setup data + auto data =getInitializedIntegralTypes(); + //create and write to buffer + std::vector buf{}; + BufferWriter bw{buf}; + writeIntegralTypesToBuffer(bw, data); + + ASSERT_THAT(std::distance(buf.begin(), buf.end()), Eq(18)); + uint8_t cArrBuf[18]; + std::copy(buf.begin(), buf.end(), cArrBuf); + //read from buffer + BufferReader br{cArrBuf}; + IntegralTypes res{}; + EXPECT_THAT(br.readBytes<4>(res.b), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.f[0]), Eq(true)); + EXPECT_THAT(br.readBytes<2>(res.c), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.d), Eq(true)); + EXPECT_THAT(br.readBytes<8>(res.a), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.e), Eq(true)); + EXPECT_THAT(br.readBytes<1>(res.f[1]), Eq(true)); + //assert results + + EXPECT_THAT(data.a, Eq(res.a)); + EXPECT_THAT(data.b, Eq(res.b)); + EXPECT_THAT(data.c, Eq(res.c)); + EXPECT_THAT(data.d, Eq(res.d)); + EXPECT_THAT(data.e, Eq(res.e)); + EXPECT_THAT(data.f, ContainerEq(res.f)); +} + + + TEST(BufferBytesOperations, ReadReturnsFalseIfNotEnoughBufferSize) { //setup data uint8_t a = 111; @@ -146,5 +216,4 @@ TEST(BufferBytesOperations, ReadIsCompletedWhenAllBytesAreRead) { EXPECT_THAT(br1.readBytes<1>(res.d), Eq(true)); EXPECT_THAT(br1.isCompleted(), Eq(true)); - }