Pointer to memory allocated on the stack.
| 13 | |
| 14 | |
| 15 | class StackAllocatedPointer(IterDereferencable[T], BaseAllocatedPointer[T]): |
| 16 | """Pointer to memory allocated on the stack.""" |
| 17 | |
| 18 | def __init__( |
| 19 | self, |
| 20 | address: int, |
| 21 | size: int, |
| 22 | assigned: bool = False, |
| 23 | ) -> None: |
| 24 | """ |
| 25 | Args: |
| 26 | address: Address of the allocated memory. |
| 27 | size: Size of the allocated memory. |
| 28 | assigned: Whether an object is currently inside the memory. |
| 29 | """ |
| 30 | self._address = address |
| 31 | self._size = size |
| 32 | self._freed = False |
| 33 | self._assigned = assigned |
| 34 | |
| 35 | @property |
| 36 | def freed(self) -> bool: |
| 37 | return self._freed |
| 38 | |
| 39 | @freed.setter |
| 40 | def freed(self, value: bool) -> None: |
| 41 | self._freed = value |
| 42 | |
| 43 | @property |
| 44 | def address(self) -> Optional[int]: |
| 45 | return self._address |
| 46 | |
| 47 | @address.setter |
| 48 | def address(self, value: int) -> None: |
| 49 | self._address = value |
| 50 | |
| 51 | def __repr__(self) -> str: |
| 52 | return f"StackAllocatedPointer(address={self.address}, size={self.size})" # noqa |
| 53 | |
| 54 | def __add__(self, amount: int): |
| 55 | return StackAllocatedPointer( |
| 56 | self.ensure() + amount, |
| 57 | self.size, |
| 58 | self.assigned, |
| 59 | ) |
| 60 | |
| 61 | def __sub__(self, amount: int): |
| 62 | return StackAllocatedPointer( |
| 63 | self.ensure() - amount, |
| 64 | self.size, |
| 65 | self.assigned, |
| 66 | ) |
| 67 | |
| 68 | def free(self) -> None: |
| 69 | raise ValueError( |
| 70 | "pointers to items on the stack may not be freed dynamically", |
| 71 | ) |
| 72 |