diff --git a/capnp/capnp.pyx b/capnp/capnp.pyx index b738f57..805eed0 100644 --- a/capnp/capnp.pyx +++ b/capnp/capnp.pyx @@ -37,6 +37,10 @@ ctypedef fused _DynamicStructReaderOrBuilder: _DynamicStructReader _DynamicStructBuilder +ctypedef fused _DynamicSetterClasses: + C_DynamicList.Builder + C_DynamicStruct.Builder + def _make_enum(enum_name, *sequential, **named): enums = dict(zip(sequential, range(len(sequential))), **named) reverse = dict((value, key) for key, value in enums.iteritems()) @@ -259,43 +263,6 @@ cdef class _DynamicListBuilder: index = index % size return self._get(index) - cdef _setitemInt(self, index, value): - cdef C_DynamicValue.Reader temp - if value < 0: - temp = C_DynamicValue.Reader(value) - else: - temp = C_DynamicValue.Reader(value) - self.thisptr.set(index, temp) - - cdef _setitemDouble(self, index, value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) - self.thisptr.set(index, temp) - - cdef _setitemBool(self, index, value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) - self.thisptr.set(index, temp) - - cdef _setitemString(self, index, value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) - self.thisptr.set(index, temp) - - cdef _setitemVoid(self, index): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(VOID) - self.thisptr.set(index, temp) - - cdef _setitemList(self, index, value): - builder = toPython(self.thisptr.init(index, len(value)), self._parent) - for (i, v) in enumerate(value): - builder[i] = v - - cdef _setitemDynamicStructBuilder(self, index, _DynamicStructBuilder value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value.thisptr.asReader()) - self.thisptr.set(index, temp) - - cdef _setitemDynamicStructReader(self, index, _DynamicStructReader value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value.thisptr) - self.thisptr.set(index, temp) - def __setitem__(self, index, value): # TODO: share code with _DynamicStructBuilder.__setattr__ @@ -303,26 +270,7 @@ cdef class _DynamicListBuilder: if index >= size: raise IndexError('Out of bounds') index = index % size - value_type = type(value) - - if value_type is int or value_type is long: - self._setitemInt(index, value) - elif value_type is float: - self._setitemDouble(index, value) - elif value_type is bool: - self._setitemBool(index, value) - elif value_type is str: - self._setitemString(index, value) - elif value_type is list: - self._setitemList(index, value) - elif value is None: - self._setitemVoid(index) - elif value_type is _DynamicStructBuilder: - self._setattrDynamicStructBuilder(index, value) - elif value_type is _DynamicStructReader: - self._setattrDynamicStructReader(index, value) - else: - raise ValueError("Non primitive type") + _setDynamicField(self.thisptr, index, value, self._parent) def __len__(self): return self.thisptr.size() @@ -447,6 +395,45 @@ cdef toPython(C_DynamicValue.Builder self, object parent): else: raise ValueError("Cannot convert type to Python. Type is unhandled by capnproto library") +cdef C_DynamicValue.Reader _extractDynamicStructBuilder(_DynamicStructBuilder value): + return C_DynamicValue.Reader(value.thisptr.asReader()) + +cdef C_DynamicValue.Reader _extractDynamicStructReader(_DynamicStructReader value): + return C_DynamicValue.Reader(value.thisptr) + +cdef _setDynamicField(_DynamicSetterClasses thisptr, field, value, parent): + cdef C_DynamicValue.Reader temp + value_type = type(value) + + if value_type is int or value_type is long: + if value < 0: + temp = C_DynamicValue.Reader(value) + else: + temp = C_DynamicValue.Reader(value) + thisptr.set(field, temp) + elif value_type is float: + temp = C_DynamicValue.Reader(value) + thisptr.set(field, temp) + elif value_type is bool: + temp = C_DynamicValue.Reader(value) + thisptr.set(field, temp) + elif value_type is str: + temp = C_DynamicValue.Reader(value) + thisptr.set(field, temp) + elif value_type is list: + builder = toPython(thisptr.init(field, len(value)), parent) + for (i, v) in enumerate(value): + builder[i] = v + elif value is None: + temp = C_DynamicValue.Reader(VOID) + thisptr.set(field, temp) + elif value_type is _DynamicStructBuilder: + thisptr.set(field, _extractDynamicStructBuilder(value)) + elif value_type is _DynamicStructReader: + thisptr.set(field, _extractDynamicStructReader(value)) + else: + raise ValueError("Non primitive type") + cdef class _DynamicStructReader: """Reads Cap'n Proto structs @@ -567,65 +554,8 @@ cdef class _DynamicStructBuilder: def __getattr__(self, field): return self._get(field) - cdef _setattrInt(self, field, value): - cdef C_DynamicValue.Reader temp - if value < 0: - temp = C_DynamicValue.Reader(value) - else: - temp = C_DynamicValue.Reader(value) - self.thisptr.set(field, temp) - - cdef _setattrDouble(self, field, value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) - self.thisptr.set(field, temp) - - cdef _setattrBool(self, field, value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) - self.thisptr.set(field, temp) - - cdef _setattrString(self, field, value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value) - self.thisptr.set(field, temp) - - cdef _setattrVoid(self, field): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(VOID) - self.thisptr.set(field, temp) - - cdef _setattrList(self, field, value): - builder = toPython(self.thisptr.init(field, len(value)), self._parent) - for (i, v) in enumerate(value): - builder[i] = v - - cdef _setattrDynamicStructBuilder(self, field, _DynamicStructBuilder value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value.thisptr.asReader()) - self.thisptr.set(field, temp) - - cdef _setattrDynamicStructReader(self, field, _DynamicStructReader value): - cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(value.thisptr) - self.thisptr.set(field, temp) - def __setattr__(self, field, value): - # TODO: share code with _DynamicListBuilder.__setitem__ - value_type = type(value) - - if value_type is int or value_type is long: - self._setattrInt(field, value) - elif value_type is float: - self._setattrDouble(field, value) - elif value_type is bool: - self._setattrBool(field, value) - elif value_type is str: - self._setattrString(field, value) - elif value_type is list: - self._setattrList(field, value) - elif value is None: - self._setattrVoid(field) - elif value_type is _DynamicStructBuilder: - self._setattrDynamicStructBuilder(field, value) - elif value_type is _DynamicStructReader: - self._setattrDynamicStructReader(field, value) - else: - raise ValueError("Non primitive type") + _setDynamicField(self.thisptr, field, value, self._parent) def _has(self, field): return self.thisptr.has(field) diff --git a/capnp/capnp_cpp.pxd b/capnp/capnp_cpp.pxd index f00f2c6..38e2e89 100644 --- a/capnp/capnp_cpp.pxd +++ b/capnp/capnp_cpp.pxd @@ -103,7 +103,7 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp": Builder(Builder &) DynamicValueForward.Builder get(char *) bint has(char *) except +ValueError - void set(char *, DynamicValueForward.Reader&) except +ValueError + void set(char *, DynamicValueForward.Reader) except +ValueError DynamicValueForward.Builder init(char *, uint size) DynamicValueForward.Builder init(char *) StructSchema getSchema() @@ -130,7 +130,7 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp": Builder(Builder &) DynamicValueForward.Builder operator[](uint) uint size() - void set(uint index, DynamicValueForward.Reader& value) except +ValueError + void set(uint index, DynamicValueForward.Reader value) except +ValueError DynamicValueForward.Builder init(uint index, uint size) except +ValueError void adopt(uint, DynamicOrphan) DynamicOrphan disown(uint)