Source code for gtirb.offset

from typing import TYPE_CHECKING, NamedTuple, Optional, Union
from uuid import UUID

from .node import Node
from .proto import Offset_pb2
from .util import DeserializationError

if TYPE_CHECKING:  # pragma: no cover
    # Ignore flake8 "imported but unused" errors.
    from .ir import IR  # noqa: F401


[docs]class Offset( NamedTuple( "NamedTuple", (("element_id", Union[UUID, Node]), ("displacement", int)), ) ): """ An Offset describes a location inside a :class:`gtirb.Node`, such as a :class:`gtirb.DataBlock` or :class:`gtirb.ByteInterval`. :ivar ~.element_id: The :class:`gtirb.Node` containing the location of interest. :ivar ~.displacement: The offset inside the Node to point to. """ @classmethod def _from_protobuf( cls, offset: Offset_pb2.Offset, ir: Optional["IR"] ) -> "Offset": """Decode a Protobuf object to an offset. :param offset: The Protobuf object. """ assert ir element_id = UUID(bytes=offset.element_id) element = ir.get_by_uuid(element_id) if not element: raise DeserializationError( "Offset: UUID %s does not refer to a Node" % element_id ) return cls(element, offset.displacement) def _to_protobuf(self) -> Offset_pb2.Offset: """Encode this offset into a Protobuf object.""" proto_offset = Offset_pb2.Offset() if isinstance(self.element_id, UUID): proto_offset.element_id = self.element_id.bytes else: proto_offset.element_id = self.element_id.uuid.bytes proto_offset.displacement = self.displacement return proto_offset