From 2b8996b82c5ce9ed5b9712dba75744dd5862ff9d Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Mon, 24 Feb 2014 21:15:03 +0400 Subject: [PATCH] Fixed array MaxBitLen --- libuavcan/include/uavcan/internal/marshalling/array.hpp | 5 ++++- libuavcan/test/marshalling/array.cpp | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libuavcan/include/uavcan/internal/marshalling/array.hpp b/libuavcan/include/uavcan/internal/marshalling/array.hpp index a1d0db2be4..017cb556e1 100644 --- a/libuavcan/include/uavcan/internal/marshalling/array.hpp +++ b/libuavcan/include/uavcan/internal/marshalling/array.hpp @@ -21,6 +21,7 @@ template class StaticArrayBase { public: + enum { SizeBitLen = 0 }; typedef unsigned int SizeType; SizeType size() const { return Size; } SizeType capacity() const { return Size; } @@ -85,6 +86,8 @@ protected: } public: + enum { SizeBitLen = RawSizeType::BitLen }; + SizeType size() const { assert(size_ ? ((size_ - 1u) <= (MaxSize - 1u)) : 1); // -Werror=type-limits @@ -212,7 +215,7 @@ public: enum { IsDynamic = ArrayMode == ArrayModeDynamic }; enum { MaxSize = MaxSize_ }; enum { MinBitLen = IsDynamic ? 0 : (RawValueType::MinBitLen * MaxSize) }; - enum { MaxBitLen = RawValueType::MaxBitLen * MaxSize }; + enum { MaxBitLen = (RawValueType::MaxBitLen * MaxSize) + (IsDynamic ? Base::SizeBitLen : 0) }; static int encode(const SelfType& array, ScalarCodec& codec) { diff --git a/libuavcan/test/marshalling/array.cpp b/libuavcan/test/marshalling/array.cpp index 7f7de116fe..bde222833b 100644 --- a/libuavcan/test/marshalling/array.cpp +++ b/libuavcan/test/marshalling/array.cpp @@ -99,6 +99,10 @@ TEST(Array, Basic) ASSERT_EQ(1, A3::ValueType::C::RawValueType::BitLen); + ASSERT_EQ(8 * 4, A1::MaxBitLen); + ASSERT_EQ(16 * 2, A2::MaxBitLen); + ASSERT_EQ((8 + 16 + 5 + 3) * 2, A3::MaxBitLen); + /* * Zero initialization check */ @@ -249,6 +253,9 @@ TEST(Array, Dynamic) A a; B b; + ASSERT_EQ(3 + 5, A::MaxBitLen); + ASSERT_EQ(8 + 255 * 8, B::MaxBitLen); + ASSERT_TRUE(a.empty()); ASSERT_TRUE(b.empty());