From: Adam C. Emerson Date: Tue, 27 Dec 2016 17:55:18 +0000 (-0500) Subject: denc: Add support for std::array X-Git-Tag: v12.0.0~233^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=26d622c48fef32ddae0cee9dd4c9097efce3e609;p=ceph.git denc: Add support for std::array Signed-off-by: Adam C. Emerson --- diff --git a/src/include/denc.h b/src/include/denc.h index 58b542a453a3..4ab51ddc4b52 100644 --- a/src/include/denc.h +++ b/src/include/denc.h @@ -24,21 +24,24 @@ #ifndef _ENC_DEC_H #define _ENC_DEC_H -#include +#include +#include #include -#include +#include #include -#include #include -#include +#include + #include #include +#include -#include "include/int_types.h" #include "include/intarith.h" +#include "include/int_types.h" #include "include/memory.h" -#include "byteorder.h" + #include "buffer.h" +#include "byteorder.h" template struct denc_traits { @@ -863,6 +866,76 @@ struct denc_traits< A, B, Ts...>>, A, B, Ts...> {}; +template +struct denc_traits< + std::array, + typename std::enable_if::supported != 0>::type> { +private: + using container = std::array; +public: + using traits = denc_traits; + + enum { supported = true }; + enum { featured = traits::featured }; + enum { bounded = traits::bounded }; + + template + static typename std::enable_if::type + bound_encode(const container& s, size_t& p) { + for (const auto& e : s) + denc(e, p); + } + template + static typename std::enable_if::type + bound_encode(const container& s, size_t& p) { + size_t elem_size = 0; + denc(*(const T*)nullptr, elem_size); + p += elem_size * N; + } + template + static typename std::enable_if::type + bound_encode(const container& s, size_t& p, uint64_t f) { + for (const auto& e : s) + denc(e, p, f); + } + template + static typename std::enable_if::type + bound_encode(const container& s, size_t& p, uint64_t f) { + size_t elem_size = 0; + denc(*(const T*)nullptr, elem_size, f); + p += sizeof(uint32_t) + elem_size * s.size(); + } + + template + static typename std::enable_if::type + encode(const container& s, buffer::list::contiguous_appender& p) { + for (const auto& e : s) + denc(e, p); + } + template + static typename std::enable_if::type + encode(const container& s, buffer::list::contiguous_appender& p, + uint64_t f) { + for (const auto& e : s) + denc(e, p, f); + } + static void decode(container& s, buffer::ptr::iterator& p, uint64_t f = 0) { + for (auto& e : s) + denc(e, p, f); + } +}; + + // ---------------------------------------------------------------------- // class helpers diff --git a/src/include/encoding.h b/src/include/encoding.h index b8a358ef49a6..9ea25d316d1b 100644 --- a/src/include/encoding.h +++ b/src/include/encoding.h @@ -998,6 +998,29 @@ inline void decode(std::deque& ls, bufferlist::iterator& p) } } +// std::array +template> +inline typename std::enable_if::type +encode(const std::array& v, bufferlist& bl, uint64_t features) +{ + for (const auto& e : v) + encode(e, bl, features); +} +template> +inline typename std::enable_if::type +encode(const std::array& v, bufferlist& bl) +{ + for (const auto& e : v) + encode(e, bl); +} +template> +inline typename std::enable_if::type +decode(std::array& v, bufferlist::iterator& p) +{ + for (auto& e : v) + decode(e, p); +} + /* * guards diff --git a/src/test/test_denc.cc b/src/test/test_denc.cc index 12a5489f6c26..4c3fc5cd6a5f 100644 --- a/src/test/test_denc.cc +++ b/src/test/test_denc.cc @@ -504,3 +504,23 @@ TEST(denc, bufferptr_shallow_and_deep) { ASSERT_EQ('f', op[0]); } } + +TEST(denc, array) +{ + { + cout << "std::array" << std::endl; + std::array s = { "foo", "bar", "baz" }; + counts.reset(); + test_denc(s); + } + { + cout << "std::array" << std::endl; + std::array s = { 1UL, 2UL, 3UL }; + test_denc(s); + } + { + cout << "std::array" << std::endl; + std::array s = { legacy_t(1), legacy_t(2) }; + test_encode_decode(s); + } +}