Data-MessagePack-Stream
view release on metacpan or search on metacpan
msgpack-3.3.0/include/msgpack/v1/unpack.hpp view on Meta::CPAN
inline void incr_count(void* buffer)
{
#if defined(MSGPACK_USE_CPP03)
_msgpack_sync_incr_and_fetch(reinterpret_cast<volatile _msgpack_atomic_counter_t*>(buffer));
#else // defined(MSGPACK_USE_CPP03)
++*reinterpret_cast<std::atomic<unsigned int>*>(buffer);
#endif // defined(MSGPACK_USE_CPP03)
}
#if defined(MSGPACK_USE_CPP03)
inline _msgpack_atomic_counter_t get_count(void* buffer)
{
return *reinterpret_cast<volatile _msgpack_atomic_counter_t*>(buffer);
}
#else // defined(MSGPACK_USE_CPP03)
inline std::atomic<unsigned int> const& get_count(void* buffer)
{
return *reinterpret_cast<std::atomic<unsigned int>*>(buffer);
}
#endif // defined(MSGPACK_USE_CPP03)
template <typename T>
struct value {
typedef T type;
};
template <>
struct value<fix_tag> {
typedef uint32_t type;
};
template <typename T>
inline typename msgpack::enable_if<sizeof(T) == sizeof(fix_tag)>::type load(uint32_t& dst, const char* n) {
dst = static_cast<uint32_t>(*reinterpret_cast<const uint8_t*>(n)) & 0x0f;
}
template <typename T>
inline typename msgpack::enable_if<sizeof(T) == 1>::type load(T& dst, const char* n) {
dst = static_cast<T>(*reinterpret_cast<const uint8_t*>(n));
}
template <typename T>
inline typename msgpack::enable_if<sizeof(T) == 2>::type load(T& dst, const char* n) {
_msgpack_load16(T, n, &dst);
}
template <typename T>
inline typename msgpack::enable_if<sizeof(T) == 4>::type load(T& dst, const char* n) {
_msgpack_load32(T, n, &dst);
}
template <typename T>
inline typename msgpack::enable_if<sizeof(T) == 8>::type load(T& dst, const char* n) {
_msgpack_load64(T, n, &dst);
}
class context {
public:
context(unpack_reference_func f, void* user_data, unpack_limit const& limit)
:m_trail(0), m_user(f, user_data, limit), m_cs(MSGPACK_CS_HEADER)
{
m_stack.reserve(MSGPACK_EMBED_STACK_SIZE);
m_stack.push_back(unpack_stack());
}
void init()
{
m_cs = MSGPACK_CS_HEADER;
m_trail = 0;
m_stack.resize(1);
m_stack[0].set_obj(msgpack::object());
}
msgpack::object const& data() const
{
return m_stack[0].obj();
}
unpack_user& user()
{
return m_user;
}
unpack_user const& user() const
{
return m_user;
}
int execute(const char* data, std::size_t len, std::size_t& off);
private:
template <typename T>
static uint32_t next_cs(T p)
{
return static_cast<uint32_t>(*p) & 0x1f;
}
template <typename T, typename Func>
int push_aggregate(
Func const& f,
uint32_t container_type,
msgpack::object& obj,
const char* load_pos,
std::size_t& off) {
typename value<T>::type tmp;
load<T>(tmp, load_pos);
f(m_user, tmp, m_stack.back().obj());
if(tmp == 0) {
obj = m_stack.back().obj();
int ret = push_proc(obj, off);
if (ret != 0) return ret;
}
else {
m_stack.back().set_container_type(container_type);
m_stack.back().set_count(tmp);
if (m_stack.size() <= m_user.limit().depth()) {
m_stack.push_back(unpack_stack());
}
else {
throw msgpack::depth_size_overflow("depth size overflow");
}
m_cs = MSGPACK_CS_HEADER;
( run in 0.409 second using v1.01-cache-2.11-cpan-5511b514fd6 )