Unify setters for DynamicList and DynamicStruct
This commit is contained in:
160
capnp/capnp.pyx
160
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(<long long>value)
|
||||
else:
|
||||
temp = C_DynamicValue.Reader(<unsigned long long>value)
|
||||
self.thisptr.set(index, temp)
|
||||
|
||||
cdef _setitemDouble(self, index, value):
|
||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(<double>value)
|
||||
self.thisptr.set(index, temp)
|
||||
|
||||
cdef _setitemBool(self, index, value):
|
||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(<cbool>value)
|
||||
self.thisptr.set(index, temp)
|
||||
|
||||
cdef _setitemString(self, index, value):
|
||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(<char*>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(<long long>value)
|
||||
else:
|
||||
temp = C_DynamicValue.Reader(<unsigned long long>value)
|
||||
thisptr.set(field, temp)
|
||||
elif value_type is float:
|
||||
temp = C_DynamicValue.Reader(<double>value)
|
||||
thisptr.set(field, temp)
|
||||
elif value_type is bool:
|
||||
temp = C_DynamicValue.Reader(<cbool>value)
|
||||
thisptr.set(field, temp)
|
||||
elif value_type is str:
|
||||
temp = C_DynamicValue.Reader(<char*>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(<long long>value)
|
||||
else:
|
||||
temp = C_DynamicValue.Reader(<unsigned long long>value)
|
||||
self.thisptr.set(field, temp)
|
||||
|
||||
cdef _setattrDouble(self, field, value):
|
||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(<double>value)
|
||||
self.thisptr.set(field, temp)
|
||||
|
||||
cdef _setattrBool(self, field, value):
|
||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(<cbool>value)
|
||||
self.thisptr.set(field, temp)
|
||||
|
||||
cdef _setattrString(self, field, value):
|
||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(<char*>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)
|
||||
|
||||
Reference in New Issue
Block a user