mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-10-16 18:56:54 +02:00
lang/c/msgpack: added C++ binding
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@50 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
This commit is contained in:
123
cpp/zone.hpp.erb
Normal file
123
cpp/zone.hpp.erb
Normal file
@@ -0,0 +1,123 @@
|
||||
#ifndef MSGPACK_ZONE_HPP__
|
||||
#define MSGPACK_ZONE_HPP__
|
||||
|
||||
#include "msgpack/object.hpp"
|
||||
#include <iostream>
|
||||
|
||||
#ifndef MSGPACK_ZONE_CHUNK_SIZE
|
||||
#define MSGPACK_ZONE_CHUNK_SIZE 64
|
||||
#endif
|
||||
|
||||
namespace msgpack {
|
||||
|
||||
|
||||
class zone {
|
||||
public:
|
||||
zone() : m_used(0), m_pool(1) { }
|
||||
~zone() { clear(); }
|
||||
|
||||
public:
|
||||
template <typename T>
|
||||
void push_finalizer(void (*func)(void* obj, void* user), T* obj, void* user);
|
||||
|
||||
public:
|
||||
object_nil* nnil() { return new (alloc()) object_nil(); }
|
||||
object_true* ntrue() { return new (alloc()) object_true(); }
|
||||
object_false* nfalse() { return new (alloc()) object_false(); }
|
||||
object_u8* nu8( uint8_t v) { return new (alloc()) object_u8(v); }
|
||||
object_u16* nu16(uint16_t v) { return new (alloc()) object_u16(v); }
|
||||
object_u32* nu32(uint32_t v) { return new (alloc()) object_u32(v); }
|
||||
object_u64* nu64(uint64_t v) { return new (alloc()) object_u64(v); }
|
||||
object_i8* ni8( int8_t v) { return new (alloc()) object_i8(v); }
|
||||
object_i16* ni16( int16_t v) { return new (alloc()) object_i16(v); }
|
||||
object_i32* ni32( int32_t v) { return new (alloc()) object_i32(v); }
|
||||
object_i64* ni64( int64_t v) { return new (alloc()) object_i64(v); }
|
||||
object_float* nfloat( float v) { return new (alloc()) object_float(v); }
|
||||
object_double* ndouble( double v) { return new (alloc()) object_double(v); }
|
||||
|
||||
object_raw* nraw(void* ptr, uint32_t len)
|
||||
{ return new (alloc()) object_raw(ptr, len); }
|
||||
|
||||
object_const_raw* nraw(const void* ptr, uint32_t len)
|
||||
{ return new (alloc()) object_const_raw(ptr, len); }
|
||||
|
||||
object_array* narray()
|
||||
{ return new (alloc()) object_array(); }
|
||||
|
||||
object_array* narray(size_t reserve_size)
|
||||
{ return new (alloc()) object_array(reserve_size); }
|
||||
|
||||
object_map* nmap()
|
||||
{ return new (alloc()) object_map(); }
|
||||
|
||||
<% GENERATION_SIZE = 16 %>
|
||||
<% 1.upto(GENERATION_SIZE) {|i| %>
|
||||
object_array* narray(<% 1.upto(i-1) {|n| %>object o<%=n%>, <% } %>object o<%=i%>)
|
||||
{ object_array* a = new (alloc()) object_array(<%=i%>);
|
||||
<% 1.upto(i) {|n| %>a->push_back(o<%=n%>);
|
||||
<% } %>return a; }
|
||||
<% } %>
|
||||
|
||||
<% 1.upto(GENERATION_SIZE) {|i| %>
|
||||
object_map* nmap(<% 1.upto(i-1) {|n| %>object k<%=n%>, object v<%=n%>, <% } %>object k<%=i%>, object v<%=i%>)
|
||||
{ object_map* m = new (alloc()) object_map();
|
||||
<% 1.upto(i) {|n| %>m->store(k<%=n%>, v<%=n%>);
|
||||
<% } %>return m; }
|
||||
<% } %>
|
||||
|
||||
public:
|
||||
void clear();
|
||||
|
||||
private:
|
||||
void* alloc();
|
||||
|
||||
private:
|
||||
size_t m_used;
|
||||
|
||||
static const size_t MAX_OBJECT_SIZE =
|
||||
sizeof(object_raw) > sizeof(object_array)
|
||||
? ( sizeof(object_raw) > sizeof(object_map)
|
||||
? sizeof(object_raw)
|
||||
: sizeof(object_map)
|
||||
)
|
||||
: ( sizeof(object_array) > sizeof(object_map)
|
||||
? sizeof(object_array)
|
||||
: sizeof(object_map)
|
||||
)
|
||||
;
|
||||
|
||||
struct cell_t {
|
||||
char data[MAX_OBJECT_SIZE];
|
||||
};
|
||||
|
||||
struct chunk_t {
|
||||
cell_t cells[MSGPACK_ZONE_CHUNK_SIZE];
|
||||
};
|
||||
|
||||
typedef std::vector<chunk_t> pool_t;
|
||||
pool_t m_pool;
|
||||
|
||||
|
||||
class finalizer {
|
||||
public:
|
||||
finalizer(void (*func)(void*, void*), void* obj, void* user) :
|
||||
m_obj(obj), m_user(user), m_func(func) {}
|
||||
void call() { (*m_func)(m_obj, m_user); }
|
||||
private:
|
||||
void* m_obj;
|
||||
void* m_user;
|
||||
void (*m_func)(void*, void*);
|
||||
};
|
||||
|
||||
typedef std::vector<finalizer> user_finalizer_t;
|
||||
user_finalizer_t m_user_finalizer;
|
||||
|
||||
private:
|
||||
zone(const zone&);
|
||||
};
|
||||
|
||||
|
||||
} // namespace msgpack
|
||||
|
||||
#endif /* msgpack/zone.hpp */
|
||||
|
Reference in New Issue
Block a user