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:
frsyuki
2009-02-15 09:09:56 +00:00
parent 249d3e9c90
commit 990ac38ccd
9 changed files with 299 additions and 66 deletions

View File

@@ -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);