From 15a0d61a646c411c30497401ef97a6e94a763e13 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Mon, 4 Aug 2014 15:14:39 +0900 Subject: [PATCH] Added the new mapping: std::vector is mapped to BIN. So, currently BIN, STR, and ARRAY mappings are as follows: std::vector is mapped to BIN std::string is mapped to STR std::vector is mapped to ARRAY // T is not char --- include/msgpack/adaptor/vector_char.hpp | 72 +++++++++++++++++++++++++ include/msgpack/type.hpp | 1 + test/msgpack_test.cpp | 19 +++++++ 3 files changed, 92 insertions(+) create mode 100644 include/msgpack/adaptor/vector_char.hpp diff --git a/include/msgpack/adaptor/vector_char.hpp b/include/msgpack/adaptor/vector_char.hpp new file mode 100644 index 00000000..642e97c6 --- /dev/null +++ b/include/msgpack/adaptor/vector_char.hpp @@ -0,0 +1,72 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2014 KONDO Takatoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_VECTOR_CHAR_HPP +#define MSGPACK_TYPE_VECTOR_CHAR_HPP + +#include "msgpack/object.hpp" +#include + +namespace msgpack { + +inline std::vector& operator>> (object const& o, std::vector& v) +{ + switch (o.type) { + case type::BIN: + v.resize(o.via.bin.size); + std::memcpy(v.data(), o.via.bin.ptr, o.via.bin.size); + break; + case type::STR: + v.resize(o.via.str.size); + std::memcpy(v.data(), o.via.str.ptr, o.via.str.size); + break; + default: + throw type_error(); + break; + } + return v; +} + +template +inline packer& operator<< (packer& o, const std::vector& v) +{ + o.pack_bin(v.size()); + o.pack_bin_body(v.data(), v.size()); + + return o; +} + +inline void operator<< (object& o, const std::vector& v) +{ + o.type = type::BIN; + o.via.bin.ptr = v.data(); + o.via.bin.size = static_cast(v.size()); +} + +inline void operator<< (object::with_zone& o, const std::vector& v) +{ + o.type = type::BIN; + char* ptr = static_cast(o.zone->allocate_align(v.size())); + o.via.bin.ptr = ptr; + o.via.bin.size = static_cast(v.size()); + std::memcpy(ptr, v.data(), v.size()); +} + +} // namespace msgpack + +#endif // MSGPACK_TYPE_VECTOR_CHAR_HPP + diff --git a/include/msgpack/type.hpp b/include/msgpack/type.hpp index b3da55d4..29ab7348 100644 --- a/include/msgpack/type.hpp +++ b/include/msgpack/type.hpp @@ -12,6 +12,7 @@ #include "adaptor/set.hpp" #include "adaptor/string.hpp" #include "adaptor/vector.hpp" +#include "adaptor/vector_char.hpp" #include "adaptor/msgpack_tuple.hpp" #include "adaptor/define.hpp" #include "adaptor/tr1/unordered_map.hpp" diff --git a/test/msgpack_test.cpp b/test/msgpack_test.cpp index e678385f..0eeee25a 100644 --- a/test/msgpack_test.cpp +++ b/test/msgpack_test.cpp @@ -288,6 +288,7 @@ TEST(MSGPACK_STL, simple_buffer_string) msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::STR); string val2 = ret.get().as(); EXPECT_EQ(val1.size(), val2.size()); EXPECT_EQ(val1, val2); @@ -304,12 +305,30 @@ TEST(MSGPACK_STL, simple_buffer_vector) msgpack::pack(sbuf, val1); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::ARRAY); vector val2 = ret.get().as >(); EXPECT_EQ(val1.size(), val2.size()); EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); } } +TEST(MSGPACK_STL, simple_buffer_vector_char) +{ + for (unsigned int k = 0; k < kLoop; k++) { + vector val1; + for (unsigned int i = 0; i < kElements; i++) + val1.push_back(rand()); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::BIN); + vector val2 = ret.get().as >(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); + } +} + TEST(MSGPACK_STL, simple_buffer_map) { for (unsigned int k = 0; k < kLoop; k++) {