Change orphan list semantics a bit
This commit is contained in:
@@ -11,7 +11,7 @@ print = lambda *x: x
|
|||||||
def writeAddressBook(fd):
|
def writeAddressBook(fd):
|
||||||
message = capnp.MallocMessageBuilder()
|
message = capnp.MallocMessageBuilder()
|
||||||
addressBook = message.initRoot(addressbook.AddressBook)
|
addressBook = message.initRoot(addressbook.AddressBook)
|
||||||
people = addressBook.init('people', 0)
|
people = addressBook.initResizableList('people')
|
||||||
|
|
||||||
alice = people.add()
|
alice = people.add()
|
||||||
alice.id = 123
|
alice.id = 123
|
||||||
@@ -31,6 +31,8 @@ def writeAddressBook(fd):
|
|||||||
bobPhones[1].number = "555-7654"
|
bobPhones[1].number = "555-7654"
|
||||||
bobPhones[1].type = 'work'
|
bobPhones[1].type = 'work'
|
||||||
|
|
||||||
|
people.finish()
|
||||||
|
|
||||||
capnp.writePackedMessageToFd(fd, message)
|
capnp.writePackedMessageToFd(fd, message)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,5 +35,5 @@ Example Usage::
|
|||||||
"""
|
"""
|
||||||
from .version import version as __version__
|
from .version import version as __version__
|
||||||
from .capnp import *
|
from .capnp import *
|
||||||
from .capnp import _DynamicStructReader, _DynamicStructBuilder, _DynamicOrphanListBuilder, _DynamicListReader, _DynamicListBuilder, _DynamicOrphan
|
from .capnp import _DynamicStructReader, _DynamicStructBuilder, _DynamicResizableListBuilder, _DynamicListReader, _DynamicListBuilder, _DynamicOrphan
|
||||||
del capnp
|
del capnp
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ cdef class _DynamicListReader:
|
|||||||
def __len__(self):
|
def __len__(self):
|
||||||
return self.thisptr.size()
|
return self.thisptr.size()
|
||||||
|
|
||||||
cdef class _DynamicOrphanListBuilder:
|
cdef class _DynamicResizableListBuilder:
|
||||||
cdef public object _parent, _message, _field, _schema
|
cdef public object _parent, _message, _field, _schema
|
||||||
cdef public list _list
|
cdef public list _list
|
||||||
def __init__(self, parent, field, schema):
|
def __init__(self, parent, field, schema):
|
||||||
@@ -156,9 +156,6 @@ cdef class _DynamicOrphanListBuilder:
|
|||||||
self._list = list()
|
self._list = list()
|
||||||
|
|
||||||
cpdef add(self):
|
cpdef add(self):
|
||||||
if len(self) == 0:
|
|
||||||
self._message._addSerializeEvent(self._serialize)
|
|
||||||
|
|
||||||
orphan = self._message.newOrphan(self._schema)
|
orphan = self._message.newOrphan(self._schema)
|
||||||
orphan_val = orphan.get()
|
orphan_val = orphan.get()
|
||||||
self._list.append((orphan, orphan_val))
|
self._list.append((orphan, orphan_val))
|
||||||
@@ -173,7 +170,7 @@ cdef class _DynamicOrphanListBuilder:
|
|||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self._list)
|
return len(self._list)
|
||||||
|
|
||||||
def _serialize(self):
|
def finish(self):
|
||||||
cdef int i = 0
|
cdef int i = 0
|
||||||
new_list = self._parent.init(self._field, len(self))
|
new_list = self._parent.init(self._field, len(self))
|
||||||
for orphan, _ in self._list:
|
for orphan, _ in self._list:
|
||||||
@@ -466,11 +463,12 @@ cdef class _DynamicStructBuilder:
|
|||||||
"""
|
"""
|
||||||
if size is None:
|
if size is None:
|
||||||
return toPython(self.thisptr.init(field), self._parent)
|
return toPython(self.thisptr.init(field), self._parent)
|
||||||
elif size == 0:
|
|
||||||
return _DynamicOrphanListBuilder(self, field, _StructSchema()._init((<C_DynamicValue.Builder>self.thisptr.get(field)).asList().getStructElementType()))
|
|
||||||
else:
|
else:
|
||||||
return toPython(self.thisptr.init(field, size), self._parent)
|
return toPython(self.thisptr.init(field, size), self._parent)
|
||||||
|
|
||||||
|
cpdef initResizableList(self, field):
|
||||||
|
return _DynamicResizableListBuilder(self, field, _StructSchema()._init((<C_DynamicValue.Builder>self.thisptr.get(field)).asList().getStructElementType()))
|
||||||
|
|
||||||
cpdef which(self) except +ValueError:
|
cpdef which(self) except +ValueError:
|
||||||
"""Returns the enum corresponding to the union in this struct
|
"""Returns the enum corresponding to the union in this struct
|
||||||
|
|
||||||
@@ -625,7 +623,6 @@ cdef class MessageBuilder:
|
|||||||
.. warning:: Don't ever instantiate this class directly. It is only used for inheritance.
|
.. warning:: Don't ever instantiate this class directly. It is only used for inheritance.
|
||||||
"""
|
"""
|
||||||
cdef schema_cpp.MessageBuilder * thisptr
|
cdef schema_cpp.MessageBuilder * thisptr
|
||||||
cdef public list _serializeEvents
|
|
||||||
def __dealloc__(self):
|
def __dealloc__(self):
|
||||||
del self.thisptr
|
del self.thisptr
|
||||||
|
|
||||||
@@ -703,13 +700,6 @@ cdef class MessageBuilder:
|
|||||||
|
|
||||||
return _DynamicOrphan()._init(self.thisptr.newOrphan(s.thisptr), self)
|
return _DynamicOrphan()._init(self.thisptr.newOrphan(s.thisptr), self)
|
||||||
|
|
||||||
def _addSerializeEvent(self, event):
|
|
||||||
self._serializeEvents.append(event)
|
|
||||||
|
|
||||||
def _serialize(self):
|
|
||||||
for event in self._serializeEvents:
|
|
||||||
event()
|
|
||||||
|
|
||||||
cdef class MallocMessageBuilder(MessageBuilder):
|
cdef class MallocMessageBuilder(MessageBuilder):
|
||||||
"""The main class for building Cap'n Proto messages
|
"""The main class for building Cap'n Proto messages
|
||||||
|
|
||||||
@@ -727,7 +717,6 @@ cdef class MallocMessageBuilder(MessageBuilder):
|
|||||||
"""
|
"""
|
||||||
def __cinit__(self):
|
def __cinit__(self):
|
||||||
self.thisptr = new schema_cpp.MallocMessageBuilder()
|
self.thisptr = new schema_cpp.MallocMessageBuilder()
|
||||||
self._serializeEvents = list()
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
@@ -823,7 +812,6 @@ def writeMessageToFd(int fd, MessageBuilder message):
|
|||||||
|
|
||||||
:rtype: void
|
:rtype: void
|
||||||
"""
|
"""
|
||||||
message._serialize()
|
|
||||||
schema_cpp.writeMessageToFd(fd, deref(message.thisptr))
|
schema_cpp.writeMessageToFd(fd, deref(message.thisptr))
|
||||||
|
|
||||||
def writePackedMessageToFd(int fd, MessageBuilder message):
|
def writePackedMessageToFd(int fd, MessageBuilder message):
|
||||||
@@ -850,7 +838,6 @@ def writePackedMessageToFd(int fd, MessageBuilder message):
|
|||||||
|
|
||||||
:rtype: void
|
:rtype: void
|
||||||
"""
|
"""
|
||||||
message._serialize()
|
|
||||||
schema_cpp.writePackedMessageToFd(fd, deref(message.thisptr))
|
schema_cpp.writePackedMessageToFd(fd, deref(message.thisptr))
|
||||||
|
|
||||||
from types import ModuleType as _ModuleType
|
from types import ModuleType as _ModuleType
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ addressbook = capnp.load(os.path.join(this_dir, 'addressbook.capnp'))
|
|||||||
def writeAddressBook(fd):
|
def writeAddressBook(fd):
|
||||||
message = capnp.MallocMessageBuilder()
|
message = capnp.MallocMessageBuilder()
|
||||||
addressBook = message.initRoot(addressbook.AddressBook)
|
addressBook = message.initRoot(addressbook.AddressBook)
|
||||||
people = addressBook.init('people', 0)
|
people = addressBook.initResizableList('people')
|
||||||
|
|
||||||
alice = people.add()
|
alice = people.add()
|
||||||
alice.id = 123
|
alice.id = 123
|
||||||
@@ -30,6 +30,8 @@ def writeAddressBook(fd):
|
|||||||
bobPhones[1].type = 'work'
|
bobPhones[1].type = 'work'
|
||||||
bob.employment.unemployed = None
|
bob.employment.unemployed = None
|
||||||
|
|
||||||
|
people.finish()
|
||||||
|
|
||||||
capnp.writePackedMessageToFd(fd, message)
|
capnp.writePackedMessageToFd(fd, message)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user