flags.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. """
  2. Basic Flag and Flags data structures.
  3. """
  4. from __future__ import annotations
  5. from collections.abc import Iterable, Iterator, MutableSet
  6. from typing import NamedTuple
  7. class Flag(NamedTuple):
  8. name: str
  9. bit: int
  10. class Flags(MutableSet): # type: ignore
  11. """
  12. A simple MutableSet implementation that will only accept known flags as
  13. elements.
  14. Will behave like a regular set(), except that a ValueError will be thrown
  15. when .add()ing unexpected flags.
  16. """
  17. def __init__(self, defined_flags: Iterable[Flag]) -> None:
  18. self._valid_flags = {flag.name for flag in defined_flags}
  19. self._flags: set[str] = set()
  20. def __repr__(self) -> str:
  21. return repr(sorted(self._flags))
  22. def __contains__(self, x: object) -> bool:
  23. return self._flags.__contains__(x)
  24. def __iter__(self) -> Iterator[str]:
  25. return self._flags.__iter__()
  26. def __len__(self) -> int:
  27. return self._flags.__len__()
  28. def discard(self, value: str) -> None:
  29. return self._flags.discard(value)
  30. def add(self, value: str) -> None:
  31. if value not in self._valid_flags:
  32. msg = f"Unexpected flag: {value}. Valid flags are: {self._valid_flags}"
  33. raise ValueError(msg)
  34. return self._flags.add(value)