mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-10-13 14:45:38 +02:00
lang/c/msgpack: C++ binding: implemented built-in buffer.
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@55 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
This commit is contained in:
@@ -5,6 +5,10 @@
|
||||
#include "msgpack/zone.hpp"
|
||||
#include <stdexcept>
|
||||
|
||||
#ifndef MSGPACK_UNPACKER_INITIAL_BUFFER_SIZE
|
||||
#define MSGPACK_UNPACKER_INITIAL_BUFFER_SIZE 8*1024
|
||||
#endif
|
||||
|
||||
namespace msgpack {
|
||||
|
||||
|
||||
@@ -16,26 +20,58 @@ struct unpack_error : public std::runtime_error {
|
||||
|
||||
class unpacker {
|
||||
public:
|
||||
unpacker(zone& z);
|
||||
unpacker();
|
||||
~unpacker();
|
||||
|
||||
public:
|
||||
size_t execute(const void* data, size_t len, size_t off);
|
||||
bool is_finished() { return m_finished; }
|
||||
void reserve_buffer(size_t len);
|
||||
void* buffer();
|
||||
size_t buffer_capacity() const;
|
||||
void buffer_consumed(size_t len);
|
||||
bool execute();
|
||||
zone* release_zone(); // never throw
|
||||
object data();
|
||||
void reset();
|
||||
|
||||
private:
|
||||
zone* m_zone;
|
||||
|
||||
struct context;
|
||||
context* m_ctx;
|
||||
zone& m_zone;
|
||||
bool m_finished;
|
||||
|
||||
void* m_buffer;
|
||||
size_t m_used;
|
||||
size_t m_free;
|
||||
size_t m_off;
|
||||
void expand_buffer(size_t len);
|
||||
|
||||
private:
|
||||
unpacker();
|
||||
unpacker(const unpacker&);
|
||||
|
||||
public:
|
||||
static object unpack(const void* data, size_t len, zone& z);
|
||||
};
|
||||
|
||||
|
||||
inline void unpacker::reserve_buffer(size_t len)
|
||||
{
|
||||
if(m_free >= len) { return; }
|
||||
expand_buffer(len);
|
||||
}
|
||||
|
||||
inline void* unpacker::buffer()
|
||||
{ return (void*)(((char*)m_buffer)+m_used); }
|
||||
|
||||
inline size_t unpacker::buffer_capacity() const
|
||||
{ return m_free; }
|
||||
|
||||
inline void unpacker::buffer_consumed(size_t len)
|
||||
{
|
||||
m_used += len;
|
||||
m_free -= len;
|
||||
}
|
||||
|
||||
|
||||
inline object unpack(const void* data, size_t len, zone& z)
|
||||
{
|
||||
return unpacker::unpack(data, len, z);
|
||||
|
Reference in New Issue
Block a user