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
|
_DynamicStructReader
|
||||||
_DynamicStructBuilder
|
_DynamicStructBuilder
|
||||||
|
|
||||||
|
ctypedef fused _DynamicSetterClasses:
|
||||||
|
C_DynamicList.Builder
|
||||||
|
C_DynamicStruct.Builder
|
||||||
|
|
||||||
def _make_enum(enum_name, *sequential, **named):
|
def _make_enum(enum_name, *sequential, **named):
|
||||||
enums = dict(zip(sequential, range(len(sequential))), **named)
|
enums = dict(zip(sequential, range(len(sequential))), **named)
|
||||||
reverse = dict((value, key) for key, value in enums.iteritems())
|
reverse = dict((value, key) for key, value in enums.iteritems())
|
||||||
@@ -259,43 +263,6 @@ cdef class _DynamicListBuilder:
|
|||||||
index = index % size
|
index = index % size
|
||||||
return self._get(index)
|
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):
|
def __setitem__(self, index, value):
|
||||||
# TODO: share code with _DynamicStructBuilder.__setattr__
|
# TODO: share code with _DynamicStructBuilder.__setattr__
|
||||||
|
|
||||||
@@ -303,26 +270,7 @@ cdef class _DynamicListBuilder:
|
|||||||
if index >= size:
|
if index >= size:
|
||||||
raise IndexError('Out of bounds')
|
raise IndexError('Out of bounds')
|
||||||
index = index % size
|
index = index % size
|
||||||
value_type = type(value)
|
_setDynamicField(self.thisptr, index, value, self._parent)
|
||||||
|
|
||||||
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")
|
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return self.thisptr.size()
|
return self.thisptr.size()
|
||||||
@@ -447,6 +395,45 @@ cdef toPython(C_DynamicValue.Builder self, object parent):
|
|||||||
else:
|
else:
|
||||||
raise ValueError("Cannot convert type to Python. Type is unhandled by capnproto library")
|
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:
|
cdef class _DynamicStructReader:
|
||||||
"""Reads Cap'n Proto structs
|
"""Reads Cap'n Proto structs
|
||||||
|
|
||||||
@@ -567,65 +554,8 @@ cdef class _DynamicStructBuilder:
|
|||||||
def __getattr__(self, field):
|
def __getattr__(self, field):
|
||||||
return self._get(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):
|
def __setattr__(self, field, value):
|
||||||
# TODO: share code with _DynamicListBuilder.__setitem__
|
_setDynamicField(self.thisptr, field, value, self._parent)
|
||||||
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")
|
|
||||||
|
|
||||||
def _has(self, field):
|
def _has(self, field):
|
||||||
return self.thisptr.has(field)
|
return self.thisptr.has(field)
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp":
|
|||||||
Builder(Builder &)
|
Builder(Builder &)
|
||||||
DynamicValueForward.Builder get(char *)
|
DynamicValueForward.Builder get(char *)
|
||||||
bint has(char *) except +ValueError
|
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 *, uint size)
|
||||||
DynamicValueForward.Builder init(char *)
|
DynamicValueForward.Builder init(char *)
|
||||||
StructSchema getSchema()
|
StructSchema getSchema()
|
||||||
@@ -130,7 +130,7 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp":
|
|||||||
Builder(Builder &)
|
Builder(Builder &)
|
||||||
DynamicValueForward.Builder operator[](uint)
|
DynamicValueForward.Builder operator[](uint)
|
||||||
uint size()
|
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
|
DynamicValueForward.Builder init(uint index, uint size) except +ValueError
|
||||||
void adopt(uint, DynamicOrphan)
|
void adopt(uint, DynamicOrphan)
|
||||||
DynamicOrphan disown(uint)
|
DynamicOrphan disown(uint)
|
||||||
|
|||||||
Reference in New Issue
Block a user