Dependents:   hello_message_pack

msgpack-c & msgpack-c++ https://github.com/msgpack/msgpack-c implementation for embedded systems (mbed / Arduino)

Committer:
hideakitai
Date:
Sat Feb 13 01:53:11 2016 +0000
Revision:
0:3f9dbf1e2cb0
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hideakitai 0:3f9dbf1e2cb0 1 //
hideakitai 0:3f9dbf1e2cb0 2 // MessagePack for C++ static resolution routine
hideakitai 0:3f9dbf1e2cb0 3 //
hideakitai 0:3f9dbf1e2cb0 4 // Copyright (C) 2015 KONDO Takatoshi
hideakitai 0:3f9dbf1e2cb0 5 //
hideakitai 0:3f9dbf1e2cb0 6 // Distributed under the Boost Software License, Version 1.0.
hideakitai 0:3f9dbf1e2cb0 7 // (See accompanying file LICENSE_1_0.txt or copy at
hideakitai 0:3f9dbf1e2cb0 8 // http://www.boost.org/LICENSE_1_0.txt)
hideakitai 0:3f9dbf1e2cb0 9 //
hideakitai 0:3f9dbf1e2cb0 10 #ifndef MSGPACK_TYPE_VECTOR_BOOL_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_TYPE_VECTOR_BOOL_HPP
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 14 #include "msgpack/object_fwd.hpp"
hideakitai 0:3f9dbf1e2cb0 15 #include <vector>
hideakitai 0:3f9dbf1e2cb0 16
hideakitai 0:3f9dbf1e2cb0 17 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 18
hideakitai 0:3f9dbf1e2cb0 19 /// @cond
hideakitai 0:3f9dbf1e2cb0 20 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 21 /// @endcond
hideakitai 0:3f9dbf1e2cb0 22
hideakitai 0:3f9dbf1e2cb0 23 namespace adaptor {
hideakitai 0:3f9dbf1e2cb0 24
hideakitai 0:3f9dbf1e2cb0 25 template <typename Alloc>
hideakitai 0:3f9dbf1e2cb0 26 struct convert<std::vector<bool, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 27 msgpack::object const& operator()(msgpack::object const& o, std::vector<bool, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 28 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 29 if (o.via.array.size > 0) {
hideakitai 0:3f9dbf1e2cb0 30 v.resize(o.via.array.size);
hideakitai 0:3f9dbf1e2cb0 31 msgpack::object* p = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 32 for (typename std::vector<bool, Alloc>::iterator it = v.begin(), end = v.end();
hideakitai 0:3f9dbf1e2cb0 33 it != end;
hideakitai 0:3f9dbf1e2cb0 34 ++it) {
hideakitai 0:3f9dbf1e2cb0 35 *it = p->as<bool>();
hideakitai 0:3f9dbf1e2cb0 36 ++p;
hideakitai 0:3f9dbf1e2cb0 37 }
hideakitai 0:3f9dbf1e2cb0 38 }
hideakitai 0:3f9dbf1e2cb0 39 return o;
hideakitai 0:3f9dbf1e2cb0 40 }
hideakitai 0:3f9dbf1e2cb0 41 };
hideakitai 0:3f9dbf1e2cb0 42
hideakitai 0:3f9dbf1e2cb0 43 template <typename Alloc>
hideakitai 0:3f9dbf1e2cb0 44 struct pack<std::vector<bool, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 45 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 46 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<bool, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 47 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 48 o.pack_array(size);
hideakitai 0:3f9dbf1e2cb0 49 for(typename std::vector<bool, Alloc>::const_iterator it(v.begin()), it_end(v.end());
hideakitai 0:3f9dbf1e2cb0 50 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 51 o.pack(static_cast<bool>(*it));
hideakitai 0:3f9dbf1e2cb0 52 }
hideakitai 0:3f9dbf1e2cb0 53 return o;
hideakitai 0:3f9dbf1e2cb0 54 }
hideakitai 0:3f9dbf1e2cb0 55 };
hideakitai 0:3f9dbf1e2cb0 56
hideakitai 0:3f9dbf1e2cb0 57 template <typename Alloc>
hideakitai 0:3f9dbf1e2cb0 58 struct object_with_zone<std::vector<bool, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 59 void operator()(msgpack::object::with_zone& o, const std::vector<bool, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 60 o.type = msgpack::type::ARRAY;
hideakitai 0:3f9dbf1e2cb0 61 if(v.empty()) {
hideakitai 0:3f9dbf1e2cb0 62 o.via.array.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 63 o.via.array.size = 0;
hideakitai 0:3f9dbf1e2cb0 64 } else {
hideakitai 0:3f9dbf1e2cb0 65 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 66 msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
hideakitai 0:3f9dbf1e2cb0 67 msgpack::object* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 68 o.via.array.ptr = p;
hideakitai 0:3f9dbf1e2cb0 69 o.via.array.size = size;
hideakitai 0:3f9dbf1e2cb0 70 typename std::vector<bool, Alloc>::const_iterator it(v.begin());
hideakitai 0:3f9dbf1e2cb0 71 do {
hideakitai 0:3f9dbf1e2cb0 72 *p = msgpack::object(static_cast<bool>(*it), o.zone);
hideakitai 0:3f9dbf1e2cb0 73 ++p;
hideakitai 0:3f9dbf1e2cb0 74 ++it;
hideakitai 0:3f9dbf1e2cb0 75 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 76 }
hideakitai 0:3f9dbf1e2cb0 77 }
hideakitai 0:3f9dbf1e2cb0 78 };
hideakitai 0:3f9dbf1e2cb0 79
hideakitai 0:3f9dbf1e2cb0 80 } // namespace adaptor
hideakitai 0:3f9dbf1e2cb0 81
hideakitai 0:3f9dbf1e2cb0 82 /// @cond
hideakitai 0:3f9dbf1e2cb0 83 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 84 /// @endcond
hideakitai 0:3f9dbf1e2cb0 85
hideakitai 0:3f9dbf1e2cb0 86 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 87
hideakitai 0:3f9dbf1e2cb0 88 #endif // MSGPACK_TYPE_VECTOR_BOOL_HPP