Unify setters for DynamicList and DynamicStruct

This commit is contained in:
Jason Paryani
2013-08-31 20:00:57 -07:00
parent fe991e7857
commit 684f8ead70
2 changed files with 47 additions and 117 deletions

View File

@@ -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)

View File

@@ -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)