added float serialization support

This commit is contained in:
TobiasSimon 2012-08-20 21:56:55 +02:00
parent f74ce3caaa
commit e63a943753

View file

@ -30,6 +30,7 @@ cdef extern from "pack.h":
int msgpack_pack_long(msgpack_packer* pk, long d)
int msgpack_pack_long_long(msgpack_packer* pk, long long d)
int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d)
int msgpack_pack_float(msgpack_packer* pk, float d)
int msgpack_pack_double(msgpack_packer* pk, double d)
int msgpack_pack_array(msgpack_packer* pk, size_t l)
int msgpack_pack_map(msgpack_packer* pk, size_t l)
@ -58,6 +59,7 @@ cdef class Packer(object):
cdef object _berrors
cdef char *encoding
cdef char *unicode_errors
cdef bool use_float
def __cinit__(self):
cdef int buf_size = 1024*1024
@ -67,7 +69,8 @@ cdef class Packer(object):
self.pk.buf_size = buf_size
self.pk.length = 0
def __init__(self, default=None, encoding='utf-8', unicode_errors='strict'):
def __init__(self, default=None, encoding='utf-8', unicode_errors='strict', use_float=False):
self.use_float = use_float
if default is not None:
if not PyCallable_Check(default):
raise TypeError("default must be a callable.")
@ -94,7 +97,8 @@ cdef class Packer(object):
cdef long long llval
cdef unsigned long long ullval
cdef long longval
cdef double fval
cdef float fval
cdef double dval
cdef char* rawval
cdef int ret
cdef dict d
@ -120,8 +124,12 @@ cdef class Packer(object):
longval = o
ret = msgpack_pack_long(&self.pk, longval)
elif PyFloat_Check(o):
fval = o
ret = msgpack_pack_double(&self.pk, fval)
if self.use_float:
fval = o
ret = msgpack_pack_float(&self.pk, fval)
else:
dval = o
ret = msgpack_pack_double(&self.pk, dval)
elif PyBytes_Check(o):
rawval = o
ret = msgpack_pack_raw(&self.pk, len(o))