cpp11_msgpack_tuple.hpp
Go to the documentation of this file.
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and 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_MSGPACK_TUPLE_HPP
#define MSGPACK_V1_CPP11_MSGPACK_TUPLE_HPP
#include "msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/pack.hpp"
namespace msgpack {
MSGPACK_API_VERSION_NAMESPACE(v1) {
namespace type {
template <class... Args>
inline tuple<Args...> make_tuple(Args&&... args) {
return tuple<Args...>(std::forward<Args>(args)...);
}
template<class... Args>
inline tuple<Args&&...> forward_as_tuple (Args&&... args) noexcept {
return tuple<Args&&...>(std::forward<Args>(args)...);
}
template <class... Tuples>
inline auto tuple_cat(Tuples&&... args) ->
decltype(
std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...)
) {
return std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...);
}
template <class... Args>
inline tuple<Args&...> tie(Args&... args) {
return tuple<Args&...>(args...);
}
} // namespace type
// --- Pack from tuple to packer stream ---
template <typename Stream, typename Tuple, std::size_t N>
struct MsgpackTuplePacker {
static void pack(
msgpack::packer<Stream>& o,
const Tuple& v) {
MsgpackTuplePacker<Stream, Tuple, N-1>::pack(o, v);
o.pack(type::get<N-1>(v));
}
};
template <typename Stream, typename Tuple>
struct MsgpackTuplePacker<Stream, Tuple, 1> {
static void pack (
msgpack::packer<Stream>& o,
const Tuple& v) {
o.pack(type::get<0>(v));
}
};
template <typename Stream, typename Tuple>
struct MsgpackTuplePacker<Stream, Tuple, 0> {
static void pack (
msgpack::packer<Stream>&,
const Tuple&) {
}
};
namespace adaptor {
template <typename... Args>
struct pack<msgpack::type::tuple<Args...>> {
template <typename Stream>
msgpack::packer<Stream>& operator()(
msgpack::packer<Stream>& o,
const msgpack::type::tuple<Args...>& v) const {
o.pack_array(sizeof...(Args));
MsgpackTuplePacker<Stream, decltype(v), sizeof...(Args)>::pack(o, v);
return o;
}
};
} // namespace adaptor
// --- Convert from tuple to object ---
template <typename T, typename... Args>
struct MsgpackTupleAsImpl {
static msgpack::type::tuple<T, Args...> as(msgpack::object const& o) {
return msgpack::type::tuple_cat(
msgpack::type::make_tuple(o.via.array.ptr[o.via.array.size - sizeof...(Args) - 1].as<T>()),
MsgpackTupleAs<Args...>::as(o));
}
};
template <typename... Args>
struct MsgpackTupleAs {
static msgpack::type::tuple<Args...> as(msgpack::object const& o) {
return MsgpackTupleAsImpl<Args...>::as(o);
}
};
template <>
struct MsgpackTupleAs<> {
static msgpack::type::tuple<> as (msgpack::object const&) {
return msgpack::type::tuple<>();
}
};
template <typename Tuple, std::size_t N>
struct MsgpackTupleConverter {
static void convert(
msgpack::object const& o,
Tuple& v) {
MsgpackTupleConverter<Tuple, N-1>::convert(o, v);
if (o.via.array.size >= N)
o.via.array.ptr[N-1].convert<typename std::remove_reference<decltype(type::get<N-1>(v))>::type>(type::get<N-1>(v));
}
};
template <typename Tuple>
struct MsgpackTupleConverter<Tuple, 1> {
static void convert (
msgpack::object const& o,
Tuple& v) {
o.via.array.ptr[0].convert<typename std::remove_reference<decltype(type::get<0>(v))>::type>(type::get<0>(v));
}
};
template <typename Tuple>
struct MsgpackTupleConverter<Tuple, 0> {
static void convert (
msgpack::object const&,
Tuple&) {
}
};
namespace adaptor {
template <typename... Args>
struct as<msgpack::type::tuple<Args...>, typename std::enable_if<msgpack::any_of<msgpack::has_as, Args...>::value>::type> {
msgpack::type::tuple<Args...> operator()(
msgpack::object const& o) const {
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
return MsgpackTupleAs<Args...>::as(o);
}
};
template <typename... Args>
struct convert<msgpack::type::tuple<Args...>> {
msgpack::object const& operator()(
msgpack::object const& o,
msgpack::type::tuple<Args...>& v) const {
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
MsgpackTupleConverter<decltype(v), sizeof...(Args)>::convert(o, v);
return o;
}
};
} // namespace adaptor
// --- Convert from tuple to object with zone ---
template <typename Tuple, std::size_t N>
struct MsgpackTupleToObjectWithZone {
static void convert(
msgpack::object::with_zone& o,
const Tuple& v) {
MsgpackTupleToObjectWithZone<Tuple, N-1>::convert(o, v);
o.via.array.ptr[N-1] = msgpack::object(type::get<N-1>(v), o.zone);
}
};
template <typename Tuple>
struct MsgpackTupleToObjectWithZone<Tuple, 1> {
static void convert (
msgpack::object::with_zone& o,
const Tuple& v) {
o.via.array.ptr[0] = msgpack::object(type::get<0>(v), o.zone);
}
};
template <typename Tuple>
struct MsgpackTupleToObjectWithZone<Tuple, 0> {
static void convert (
msgpack::object::with_zone&,
const Tuple&) {
}
};
namespace adaptor {
template <typename... Args>
struct object_with_zone<msgpack::type::tuple<Args...>> {
void operator()(
msgpack::object::with_zone& o,
msgpack::type::tuple<Args...> const& v) const {
o.type = msgpack::type::ARRAY;
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*sizeof...(Args), MSGPACK_ZONE_ALIGNOF(msgpack::object)));
o.via.array.size = sizeof...(Args);
MsgpackTupleToObjectWithZone<decltype(v), sizeof...(Args)>::convert(o, v);
}
};
} // namespace adaptor
} // MSGPACK_API_VERSION_NAMESPACE(v1)
} // namespace msgpack
#endif // MSGPACK_CPP11_MSGPACK_TUPLE_HPP
msgpack::adaptor::pack< msgpack::type::tuple< Args... > >::operator()
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const msgpack::type::tuple< Args... > &v) const
Definition: cpp11_msgpack_tuple.hpp:82
msgpack::type::forward_as_tuple
tuple< Args &&... > forward_as_tuple(Args &&... args) noexcept
Definition: cpp11_msgpack_tuple.hpp:31
msgpack::type::tuple_cat
auto tuple_cat(Tuples &&... args) -> decltype(std::tuple_cat(std::forward< typename std::remove_reference< Tuples >::type::base >(args)...))
Definition: cpp11_msgpack_tuple.hpp:36
msgpack::object_array::size
uint32_t size
Definition: object_fwd.hpp:23
msgpack::zone::allocate_align
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:246
cpp11_msgpack_tuple_decl.hpp
msgpack::MsgpackTupleAs::as
static msgpack::type::tuple< Args... > as(msgpack::object const &o)
Definition: cpp11_msgpack_tuple.hpp:106
msgpack::MsgpackTupleToObjectWithZone< Tuple, 0 >::convert
static void convert(msgpack::object::with_zone &, const Tuple &)
Definition: cpp11_msgpack_tuple.hpp:192
pack.hpp
msgpack::adaptor::as
Definition: object_fwd_decl.hpp:62
msgpack::object::via
union_type via
Definition: object_fwd.hpp:93
msgpack::object::as
std::enable_if< msgpack::has_as< T >::value, T >::type as() const
Get value as T.
Definition: object.hpp:593
msgpack::MsgpackTupleToObjectWithZone::convert
static void convert(msgpack::object::with_zone &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:173
adaptor_base.hpp
msgpack::object::with_zone::zone
msgpack::zone & zone
Definition: object.hpp:36
msgpack::adaptor::object_with_zone< msgpack::type::tuple< Args... > >::operator()
void operator()(msgpack::object::with_zone &o, msgpack::type::tuple< Args... > const &v) const
Definition: cpp11_msgpack_tuple.hpp:202
msgpack::object_array::ptr
msgpack::object * ptr
Definition: object_fwd.hpp:24
msgpack::MsgpackTupleConverter< Tuple, 1 >::convert
static void convert(msgpack::object const &o, Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:131
msgpack::packer::pack_array
packer< Stream > & pack_array(uint32_t n)
Packing array header and size.
Definition: pack.hpp:1160
msgpack
Definition: adaptor_base.hpp:15
msgpack::MsgpackTuplePacker::pack
static void pack(msgpack::packer< Stream > &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:52
msgpack::MsgpackTupleToObjectWithZone< Tuple, 1 >::convert
static void convert(msgpack::object::with_zone &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:183
msgpack::MsgpackTupleToObjectWithZone
Definition: cpp11_msgpack_tuple.hpp:172
msgpack::convert
void convert(T &v, msgpack::object const &o)
Definition: object.hpp:666
msgpack::object::with_zone
Definition: object.hpp:34
msgpack::packer::pack
packer< Stream > & pack(const T &v)
Packing function template.
msgpack::MsgpackTuplePacker
Definition: cpp11_msgpack_tuple.hpp:51
msgpack::type::tuple<>
Definition: cpp03_msgpack_tuple.hpp:9165
msgpack::type::tie
tuple< Args &... > tie(Args &... args)
Definition: cpp11_msgpack_tuple.hpp:44
msgpack::adaptor::object_with_zone
Definition: adaptor_base.hpp:43
msgpack::adaptor::as< msgpack::type::tuple< Args... >, typename std::enable_if< msgpack::any_of< msgpack::has_as, Args... >::value >::type >::operator()
msgpack::type::tuple< Args... > operator()(msgpack::object const &o) const
Definition: cpp11_msgpack_tuple.hpp:150
msgpack::adaptor::convert< msgpack::type::tuple< Args... > >::operator()
msgpack::object const & operator()(msgpack::object const &o, msgpack::type::tuple< Args... > &v) const
Definition: cpp11_msgpack_tuple.hpp:159
msgpack::type::make_tuple
tuple make_tuple()
Definition: cpp03_msgpack_tuple.hpp:10408
msgpack::type_error
Definition: object_fwd.hpp:236
msgpack::MsgpackTuplePacker< Stream, Tuple, 0 >::pack
static void pack(msgpack::packer< Stream > &, const Tuple &)
Definition: cpp11_msgpack_tuple.hpp:71
msgpack::adaptor::pack
Definition: adaptor_base.hpp:32
msgpack::object::union_type::array
msgpack::object_array array
Definition: object_fwd.hpp:85
msgpack::pack
void pack(msgpack::packer< Stream > &o, const T &v)
Definition: object.hpp:673
msgpack::MsgpackTupleAs<>::as
static msgpack::type::tuple as(msgpack::object const &)
Definition: cpp11_msgpack_tuple.hpp:113
msgpack::MsgpackTuplePacker< Stream, Tuple, 1 >::pack
static void pack(msgpack::packer< Stream > &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:62
msgpack::object
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
msgpack::MsgpackTupleConverter::convert
static void convert(msgpack::object const &o, Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:120
msgpack::MsgpackTupleAs
Definition: cpp11_msgpack_tuple.hpp:105
msgpack::object::type
msgpack::type::object_type type
Definition: object_fwd.hpp:92
MSGPACK_API_VERSION_NAMESPACE
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
msgpack::type::ARRAY
Definition: object_fwd_decl.hpp:41
msgpack::MsgpackTupleConverter< Tuple, 0 >::convert
static void convert(msgpack::object const &, Tuple &)
Definition: cpp11_msgpack_tuple.hpp:140
msgpack::type::tuple
Definition: cpp11_msgpack_tuple_decl.hpp:35
MSGPACK_ZONE_ALIGNOF
#define MSGPACK_ZONE_ALIGNOF(type)
Definition: cpp03_zone_decl.hpp:30
msgpack::object::convert
msgpack::enable_if< !msgpack::is_array< T >::value &&!msgpack::is_pointer< T >::value, T &>::type convert(T &v) const
Convert the object.
Definition: object.hpp:543
msgpack::packer
The class template that supports continuous packing.
Definition: adaptor_base_decl.hpp:24
msgpack::MsgpackTupleAsImpl::as
static msgpack::type::tuple< T, Args... > as(msgpack::object const &o)
Definition: cpp11_msgpack_tuple.hpp:97
msgpack::MsgpackTupleConverter
Definition: cpp11_msgpack_tuple.hpp:119
msgpack::MsgpackTupleAsImpl
Definition: cpp11_msgpack_tuple.hpp:96
msgpack::adaptor::convert
Definition: adaptor_base.hpp:27