| 5621 | |
| 5622 | # Fast Binary Encoding StructOptional model |
| 5623 | class StructOptionalModel(fbe.Model): |
| 5624 | __slots__ = "_model", |
| 5625 | |
| 5626 | def __init__(self, buffer=None): |
| 5627 | super().__init__(buffer) |
| 5628 | self._model = FieldModelStructOptional(self.buffer, 4) |
| 5629 | |
| 5630 | @property |
| 5631 | def model(self): |
| 5632 | return self._model |
| 5633 | |
| 5634 | # Get the model size |
| 5635 | @property |
| 5636 | def fbe_size(self): |
| 5637 | return self._model.fbe_size + self._model.fbe_extra |
| 5638 | |
| 5639 | # Get the model type |
| 5640 | @property |
| 5641 | def fbe_type(self): |
| 5642 | return self.TYPE |
| 5643 | |
| 5644 | TYPE = FieldModelStructOptional.TYPE |
| 5645 | |
| 5646 | # Check if the struct value is valid |
| 5647 | def verify(self): |
| 5648 | if (self.buffer.offset + self._model.fbe_offset - 4) > self.buffer.size: |
| 5649 | return False |
| 5650 | |
| 5651 | fbe_full_size = self.read_uint32(self._model.fbe_offset - 4) |
| 5652 | if fbe_full_size < self._model.fbe_size: |
| 5653 | return False |
| 5654 | |
| 5655 | return self._model.verify() |
| 5656 | |
| 5657 | # Create a new model (begin phase) |
| 5658 | def create_begin(self): |
| 5659 | fbe_begin = self.buffer.allocate(4 + self._model.fbe_size) |
| 5660 | return fbe_begin |
| 5661 | |
| 5662 | # Create a new model (end phase) |
| 5663 | def create_end(self, fbe_begin): |
| 5664 | fbe_end = self.buffer.size |
| 5665 | fbe_full_size = fbe_end - fbe_begin |
| 5666 | self.write_uint32(self._model.fbe_offset - 4, fbe_full_size) |
| 5667 | return fbe_full_size |
| 5668 | |
| 5669 | # Serialize the struct value |
| 5670 | def serialize(self, value): |
| 5671 | fbe_begin = self.create_begin() |
| 5672 | self._model.set(value) |
| 5673 | fbe_full_size = self.create_end(fbe_begin) |
| 5674 | return fbe_full_size |
| 5675 | |
| 5676 | # Deserialize the struct value |
| 5677 | def deserialize(self, value=None): |
| 5678 | if value is None: |
| 5679 | value = StructOptional() |
| 5680 | |