Change orphan list semantics a bit

This commit is contained in:
Jason Paryani
2013-08-27 10:55:06 -07:00
parent 448ea93891
commit 172c2fd900
4 changed files with 12 additions and 21 deletions

View File

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

View File

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

View File

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

View File

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