mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-22 21:40:04 +02:00
parent
d1eac600e9
commit
b4db293181
@ -541,6 +541,7 @@ IF (MSGPACK_ENABLE_CXX)
|
|||||||
include/msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp
|
include/msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp
|
||||||
include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple.hpp
|
include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple.hpp
|
||||||
include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple_decl.hpp
|
include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple_decl.hpp
|
||||||
|
include/msgpack/v1/adaptor/detail/cpp11_convert_helper.hpp
|
||||||
include/msgpack/v1/adaptor/detail/cpp11_define_array.hpp
|
include/msgpack/v1/adaptor/detail/cpp11_define_array.hpp
|
||||||
include/msgpack/v1/adaptor/detail/cpp11_define_array_decl.hpp
|
include/msgpack/v1/adaptor/detail/cpp11_define_array_decl.hpp
|
||||||
include/msgpack/v1/adaptor/detail/cpp11_define_map.hpp
|
include/msgpack/v1/adaptor/detail/cpp11_define_map.hpp
|
||||||
|
45
include/msgpack/v1/adaptor/detail/cpp11_convert_helper.hpp
Normal file
45
include/msgpack/v1/adaptor/detail/cpp11_convert_helper.hpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// MessagePack for C++ static resolution routine
|
||||||
|
//
|
||||||
|
// Copyright (C) 2017 KONDO Takatoshi
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
#ifndef MSGPACK_V1_CPP11_CONVERT_HELPER_HPP
|
||||||
|
#define MSGPACK_V1_CPP11_CONVERT_HELPER_HPP
|
||||||
|
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include <msgpack/object_fwd.hpp>
|
||||||
|
|
||||||
|
namespace msgpack {
|
||||||
|
/// @cond
|
||||||
|
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
||||||
|
/// @endcond
|
||||||
|
namespace type {
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline typename std::enable_if<
|
||||||
|
has_as<T>::value
|
||||||
|
>::type
|
||||||
|
convert_helper(msgpack::object const& o, T& t) {
|
||||||
|
t = o.as<T>();
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline typename std::enable_if<
|
||||||
|
!has_as<T>::value
|
||||||
|
>::type
|
||||||
|
convert_helper(msgpack::object const& o, T& t) {
|
||||||
|
o.convert(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace type
|
||||||
|
|
||||||
|
/// @cond
|
||||||
|
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
||||||
|
/// @endcond
|
||||||
|
} // namespace msgpack
|
||||||
|
|
||||||
|
#endif // MSGPACK_V1_CPP11_CONVERT_HELPER_HPP
|
@ -11,6 +11,7 @@
|
|||||||
#define MSGPACK_V1_CPP11_DEFINE_ARRAY_HPP
|
#define MSGPACK_V1_CPP11_DEFINE_ARRAY_HPP
|
||||||
|
|
||||||
#include "msgpack/v1/adaptor/detail/cpp11_define_array_decl.hpp"
|
#include "msgpack/v1/adaptor/detail/cpp11_define_array_decl.hpp"
|
||||||
|
#include "msgpack/v1/adaptor/detail/cpp11_convert_helper.hpp"
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
@ -20,6 +21,39 @@ MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|||||||
/// @endcond
|
/// @endcond
|
||||||
namespace type {
|
namespace type {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
template <int N, typename... Ts>
|
||||||
|
struct get;
|
||||||
|
|
||||||
|
template <int N, typename T, typename... Ts>
|
||||||
|
struct get<N, std::tuple<T, Ts...>>
|
||||||
|
{
|
||||||
|
using type = typename get<N - 1, std::tuple<Ts...>>::type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename... Ts>
|
||||||
|
struct get<0, std::tuple<T, Ts...>>
|
||||||
|
{
|
||||||
|
using type = T;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline typename std::enable_if<
|
||||||
|
has_as<T>::value
|
||||||
|
>::type
|
||||||
|
unpack_impl(msgpack::object const& o, T& t) {
|
||||||
|
t = o.as<T>();
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline typename std::enable_if<
|
||||||
|
!has_as<T>::value
|
||||||
|
>::type
|
||||||
|
unpack_impl(msgpack::object const& o, T& t) {
|
||||||
|
o.convert(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
template <typename Tuple, std::size_t N>
|
template <typename Tuple, std::size_t N>
|
||||||
struct define_array_imp {
|
struct define_array_imp {
|
||||||
template <typename Packer>
|
template <typename Packer>
|
||||||
@ -31,7 +65,7 @@ struct define_array_imp {
|
|||||||
define_array_imp<Tuple, N-1>::unpack(o, t);
|
define_array_imp<Tuple, N-1>::unpack(o, t);
|
||||||
const size_t size = o.via.array.size;
|
const size_t size = o.via.array.size;
|
||||||
if(size <= N-1) { return; }
|
if(size <= N-1) { return; }
|
||||||
o.via.array.ptr[N-1].convert(std::get<N-1>(t));
|
convert_helper(o.via.array.ptr[N-1], std::get<N-1>(t));
|
||||||
}
|
}
|
||||||
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
||||||
define_array_imp<Tuple, N-1>::object(o, z, t);
|
define_array_imp<Tuple, N-1>::object(o, z, t);
|
||||||
@ -48,7 +82,7 @@ struct define_array_imp<Tuple, 1> {
|
|||||||
static void unpack(msgpack::object const& o, Tuple& t) {
|
static void unpack(msgpack::object const& o, Tuple& t) {
|
||||||
const size_t size = o.via.array.size;
|
const size_t size = o.via.array.size;
|
||||||
if(size <= 0) { return; }
|
if(size <= 0) { return; }
|
||||||
o.via.array.ptr[0].convert(std::get<0>(t));
|
convert_helper(o.via.array.ptr[0], std::get<0>(t));
|
||||||
}
|
}
|
||||||
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
||||||
o->via.array.ptr[0] = msgpack::object(std::get<0>(t), z);
|
o->via.array.ptr[0] = msgpack::object(std::get<0>(t), z);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#define MSGPACK_V1_CPP11_DEFINE_MAP_HPP
|
#define MSGPACK_V1_CPP11_DEFINE_MAP_HPP
|
||||||
|
|
||||||
#include "msgpack/v1/adaptor/detail/cpp11_define_map_decl.hpp"
|
#include "msgpack/v1/adaptor/detail/cpp11_define_map_decl.hpp"
|
||||||
|
#include "msgpack/v1/adaptor/detail/cpp11_convert_helper.hpp"
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -34,7 +35,7 @@ struct define_map_imp {
|
|||||||
define_map_imp<Tuple, N-2>::unpack(o, t, kvmap);
|
define_map_imp<Tuple, N-2>::unpack(o, t, kvmap);
|
||||||
auto it = kvmap.find(std::get<N-2>(t));
|
auto it = kvmap.find(std::get<N-2>(t));
|
||||||
if (it != kvmap.end()) {
|
if (it != kvmap.end()) {
|
||||||
it->second->convert(std::get<N-1>(t));
|
convert_helper(*it->second, std::get<N-1>(t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user