1// 2// MessagePack for C++ static resolution routine 3// 4// Copyright (C) 2014-2015 KONDO Takatoshi 5// 6// Distributed under the Boost Software License, Version 1.0. 7// (See accompanying file LICENSE_1_0.txt or copy at 8// http://www.boost.org/LICENSE_1_0.txt) 9// 10#ifndef MSGPACK_TYPE_ARRAY_CHAR_HPP 11#define MSGPACK_TYPE_ARRAY_CHAR_HPP 12 13#include "msgpack/versioning.hpp" 14#include "msgpack/adaptor/adaptor_base.hpp" 15#include "msgpack/adaptor/check_container_size.hpp" 16 17#include <array> 18 19namespace msgpack { 20 21/// @cond 22MSGPACK_API_VERSION_NAMESPACE(v1) { 23/// @endcond 24 25namespace adaptor { 26 27template <std::size_t N> 28struct convert<std::array<char, N>> { 29 msgpack::object const& operator()(msgpack::object const& o, std::array<char, N>& v) const { 30 switch (o.type) { 31 case msgpack::type::BIN: 32 if(o.via.bin.size != N) { throw msgpack::type_error(); } 33 std::memcpy(v.data(), o.via.bin.ptr, o.via.bin.size); 34 break; 35 case msgpack::type::STR: 36 if(o.via.str.size != N) { throw msgpack::type_error(); } 37 std::memcpy(v.data(), o.via.str.ptr, N); 38 break; 39 default: 40 throw msgpack::type_error(); 41 break; 42 } 43 return o; 44 } 45}; 46 47template <std::size_t N> 48struct pack<std::array<char, N>> { 49 template <typename Stream> 50 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::array<char, N>& v) const { 51 uint32_t size = checked_get_container_size(v.size()); 52 o.pack_bin(size); 53 o.pack_bin_body(v.data(), size); 54 55 return o; 56 } 57}; 58 59template <std::size_t N> 60struct object<std::array<char, N>> { 61 void operator()(msgpack::object& o, const std::array<char, N>& v) const { 62 uint32_t size = checked_get_container_size(v.size()); 63 o.type = msgpack::type::BIN; 64 o.via.bin.ptr = v.data(); 65 o.via.bin.size = size; 66 } 67}; 68 69template <std::size_t N> 70struct object_with_zone<std::array<char, N>> { 71 void operator()(msgpack::object::with_zone& o, const std::array<char, N>& v) const { 72 uint32_t size = checked_get_container_size(v.size()); 73 o.type = msgpack::type::BIN; 74 char* ptr = static_cast<char*>(o.zone.allocate_align(size)); 75 o.via.bin.ptr = ptr; 76 o.via.bin.size = size; 77 std::memcpy(ptr, v.data(), size); 78 } 79}; 80 81} // namespace adaptor 82 83/// @cond 84} // MSGPACK_API_VERSION_NAMESPACE(v1) 85/// @endcond 86 87} // namespace msgpack 88 89#endif // MSGPACK_TYPE_ARRAY_CHAR_HPP 90