A fully working version of the scheduling language with added examples
This commit is contained in:
parent
ec42f74960
commit
ebfd85a666
126 changed files with 7235 additions and 981 deletions
83
transformation/schedule/schedule_lib/data.py
Normal file
83
transformation/schedule/schedule_lib/data.py
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
from symtable import Class
|
||||
from typing import Any, Generator, Callable, Iterator, TYPE_CHECKING, override
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from transformation.schedule.schedule_lib import DataNode
|
||||
|
||||
|
||||
class DataState:
|
||||
def __init__(self, data: Any):
|
||||
self.data: list[dict[Any, Any]] = []
|
||||
|
||||
class Data:
|
||||
__slots__ = ("state", "_parent")
|
||||
|
||||
def __init__(self, parent: "DataNode") -> None:
|
||||
self.state: dict[int, DataState] = dict()
|
||||
self._parent = parent
|
||||
|
||||
def __dir__(self):
|
||||
return [attr for attr in super().__dir__() if attr != "_super"]
|
||||
|
||||
def get_data(self, exec_id: int) -> list[dict[str, str]]:
|
||||
state = self.get_state(exec_id)
|
||||
return state.data
|
||||
|
||||
def get_state(self, exec_id) -> DataState:
|
||||
return self.state[exec_id]
|
||||
|
||||
def store_data(self, exec_id: int, data_gen: Generator, n: int) -> bool:
|
||||
state = self.get_state(exec_id)
|
||||
state.data.clear()
|
||||
if n == 0:
|
||||
return True
|
||||
i: int = 0
|
||||
while (match := next(data_gen, None)) is not None:
|
||||
state.data.append(match)
|
||||
i += 1
|
||||
if i >= n:
|
||||
break
|
||||
else:
|
||||
if n == float("inf"):
|
||||
return bool(len(state.data))
|
||||
state.data.clear()
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_parent(self) -> "DataNode":
|
||||
return self._parent
|
||||
|
||||
def replace(self, exec_id: int, data: list[dict[str, str]]) -> None:
|
||||
state = self.get_state(exec_id)
|
||||
state.data.clear()
|
||||
state.data.extend(data)
|
||||
|
||||
def append(self, exec_id: int, data: dict[str, str]) -> None:
|
||||
self.get_state(exec_id).data.append(data)
|
||||
|
||||
def extend(self, exec_id: int, data: list[dict[str, str]]) -> None:
|
||||
self.get_state(exec_id).data.extend(data)
|
||||
|
||||
def clear(self, exec_id: int) -> None:
|
||||
self.get_state(exec_id).data.clear()
|
||||
|
||||
def pop(self, exec_id: int, index: int =-1) -> Any:
|
||||
return self.get_state(exec_id).data.pop(index)
|
||||
|
||||
def empty(self, exec_id: int) -> bool:
|
||||
return len(self.get_state(exec_id).data) == 0
|
||||
|
||||
def __getitem__(self, index):
|
||||
raise NotImplementedError
|
||||
|
||||
def __iter__(self, exec_id: int) -> Iterator[dict[str, str]]:
|
||||
return self.get_state(exec_id).data.__iter__()
|
||||
|
||||
def __len__(self, exec_id: int) -> int:
|
||||
return self.get_state(exec_id).data.__len__()
|
||||
|
||||
def generate_stack_frame(self, exec_id: int) -> None:
|
||||
self.state[exec_id] = DataState(exec_id)
|
||||
|
||||
def delete_stack_frame(self, exec_id: int) -> None:
|
||||
self.state.pop(exec_id)
|
||||
Loading…
Add table
Add a link
Reference in a new issue