Dependents:   hello_message_pack

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

Committer:
hideakitai
Date:
Mon Feb 22 01:43:48 2016 +0000
Revision:
4:bd0c06dd6e92
Parent:
0:3f9dbf1e2cb0
fix throw error

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) 2008-2009 FURUHASHI Sadayuki
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_PAIR_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_TYPE_PAIR_HPP
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 14 #include "msgpack/adaptor/adaptor_base.hpp"
hideakitai 0:3f9dbf1e2cb0 15 #include "msgpack/meta.hpp"
hideakitai 0:3f9dbf1e2cb0 16
hideakitai 0:3f9dbf1e2cb0 17 #include <utility>
hideakitai 0:3f9dbf1e2cb0 18
hideakitai 0:3f9dbf1e2cb0 19 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 20
hideakitai 0:3f9dbf1e2cb0 21 /// @cond
hideakitai 0:3f9dbf1e2cb0 22 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 23 /// @endcond
hideakitai 0:3f9dbf1e2cb0 24
hideakitai 0:3f9dbf1e2cb0 25 namespace adaptor {
hideakitai 0:3f9dbf1e2cb0 26
hideakitai 0:3f9dbf1e2cb0 27 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 28
hideakitai 0:3f9dbf1e2cb0 29 template <typename T1, typename T2>
hideakitai 0:3f9dbf1e2cb0 30 struct as<std::pair<T1, T2>,
hideakitai 0:3f9dbf1e2cb0 31 typename std::enable_if<msgpack::all_of<msgpack::has_as, T1, T2>::value>::type> {
hideakitai 0:3f9dbf1e2cb0 32 std::pair<T1, T2> operator()(msgpack::object const& o) const {
hideakitai 0:3f9dbf1e2cb0 33 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 34 if (o.via.array.size != 2) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 35 return std::make_pair(o.via.array.ptr[0].as<T1>(), o.via.array.ptr[1].as<T2>());
hideakitai 0:3f9dbf1e2cb0 36 }
hideakitai 0:3f9dbf1e2cb0 37 };
hideakitai 0:3f9dbf1e2cb0 38
hideakitai 0:3f9dbf1e2cb0 39 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 40
hideakitai 0:3f9dbf1e2cb0 41 template <typename T1, typename T2>
hideakitai 0:3f9dbf1e2cb0 42 struct convert<std::pair<T1, T2> > {
hideakitai 0:3f9dbf1e2cb0 43 msgpack::object const& operator()(msgpack::object const& o, std::pair<T1, T2>& v) const {
hideakitai 0:3f9dbf1e2cb0 44 if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 45 if(o.via.array.size != 2) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 46 o.via.array.ptr[0].convert(v.first);
hideakitai 0:3f9dbf1e2cb0 47 o.via.array.ptr[1].convert(v.second);
hideakitai 0:3f9dbf1e2cb0 48 return o;
hideakitai 0:3f9dbf1e2cb0 49 }
hideakitai 0:3f9dbf1e2cb0 50 };
hideakitai 0:3f9dbf1e2cb0 51
hideakitai 0:3f9dbf1e2cb0 52 template <typename T1, typename T2>
hideakitai 0:3f9dbf1e2cb0 53 struct pack<std::pair<T1, T2> > {
hideakitai 0:3f9dbf1e2cb0 54 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 55 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::pair<T1, T2>& v) const {
hideakitai 0:3f9dbf1e2cb0 56 o.pack_array(2);
hideakitai 0:3f9dbf1e2cb0 57 o.pack(v.first);
hideakitai 0:3f9dbf1e2cb0 58 o.pack(v.second);
hideakitai 0:3f9dbf1e2cb0 59 return o;
hideakitai 0:3f9dbf1e2cb0 60 }
hideakitai 0:3f9dbf1e2cb0 61 };
hideakitai 0:3f9dbf1e2cb0 62
hideakitai 0:3f9dbf1e2cb0 63 template <typename T1, typename T2>
hideakitai 0:3f9dbf1e2cb0 64 struct object_with_zone<std::pair<T1, T2> > {
hideakitai 0:3f9dbf1e2cb0 65 void operator()(msgpack::object::with_zone& o, const std::pair<T1, T2>& v) const {
hideakitai 0:3f9dbf1e2cb0 66 o.type = msgpack::type::ARRAY;
hideakitai 0:3f9dbf1e2cb0 67 msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*2));
hideakitai 0:3f9dbf1e2cb0 68 o.via.array.ptr = p;
hideakitai 0:3f9dbf1e2cb0 69 o.via.array.size = 2;
hideakitai 0:3f9dbf1e2cb0 70 p[0] = msgpack::object(v.first, o.zone);
hideakitai 0:3f9dbf1e2cb0 71 p[1] = msgpack::object(v.second, o.zone);
hideakitai 0:3f9dbf1e2cb0 72 }
hideakitai 0:3f9dbf1e2cb0 73 };
hideakitai 0:3f9dbf1e2cb0 74
hideakitai 0:3f9dbf1e2cb0 75 } // namespace adaptor
hideakitai 0:3f9dbf1e2cb0 76
hideakitai 0:3f9dbf1e2cb0 77 /// @cond
hideakitai 0:3f9dbf1e2cb0 78 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 79 /// @endcond
hideakitai 0:3f9dbf1e2cb0 80
hideakitai 0:3f9dbf1e2cb0 81 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 82
hideakitai 0:3f9dbf1e2cb0 83 #endif // MSGPACK_TYPE_PAIR_HPP