From 056791619ed5bcfff6c46d0a4730a0bf8e72f039 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Sat, 22 Feb 2014 21:37:31 +0400 Subject: [PATCH] StaticArray specialization for std::bitset<> --- .../internal/marshalling/static_array.hpp | 39 +++++++++++++++++++ libuavcan/test/marshalling/static_array.cpp | 4 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/libuavcan/include/uavcan/internal/marshalling/static_array.hpp b/libuavcan/include/uavcan/internal/marshalling/static_array.hpp index 0e843e604b..ba5e5b31cf 100644 --- a/libuavcan/include/uavcan/internal/marshalling/static_array.hpp +++ b/libuavcan/include/uavcan/internal/marshalling/static_array.hpp @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include @@ -115,6 +116,44 @@ public: typedef const ValueType* const_iterator; }; + +/// Special case - bit array +template +class StaticArray, Size_ > : public std::bitset +{ +public: + enum { IsDynamic = 0 }; + enum { Size = Size_ }; + + typedef IntegerSpec<1, SignednessUnsigned, CastMode> RawValueType; + typedef typename StorageType::Type ValueType; + + static int encode(const StaticArray& array, ScalarCodec& codec) + { + for (std::size_t i = 0; i < Size; i++) + { + const int res = RawValueType::encode(bool(array[i]), codec); + if (res <= 0) + return res; + } + return 1; + } + + static int decode(StaticArray& array, ScalarCodec& codec) + { + for (std::size_t i = 0; i < Size; i++) + { + ValueType value = 0; + const int res = RawValueType::decode(value, codec); + array[i] = value; + if (res <= 0) + return res; + } + return 1; + } +}; + + template class StaticArray; // Invalid instantiation } diff --git a/libuavcan/test/marshalling/static_array.cpp b/libuavcan/test/marshalling/static_array.cpp index 22a60979d1..4c5dad3d57 100644 --- a/libuavcan/test/marshalling/static_array.cpp +++ b/libuavcan/test/marshalling/static_array.cpp @@ -96,8 +96,8 @@ TEST(StaticArray, Basic) { ASSERT_EQ(0, it->a); ASSERT_EQ(0, it->b); - for (A3::ValueType::C::const_iterator it2 = it->c.begin(); it2 != it->c.end(); ++it2) - ASSERT_EQ(0, *it2); + for (int i = 0; i < 8; i++) + ASSERT_EQ(0, it->c[i]); } /*