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