flags.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. # -*- coding: utf-8 -*-
  2. """
  3. hyperframe/flags
  4. ~~~~~~~~~~~~~~~~
  5. Defines basic Flag and Flags data structures.
  6. """
  7. import collections
  8. Flag = collections.namedtuple("Flag", ["name", "bit"])
  9. class Flags(collections.MutableSet):
  10. """
  11. A simple MutableSet implementation that will only accept known flags as elements.
  12. Will behave like a regular set(), except that a ValueError will be thrown when .add()ing
  13. unexpected flags.
  14. """
  15. def __init__(self, defined_flags):
  16. self._valid_flags = set(flag.name for flag in defined_flags)
  17. self._flags = set()
  18. def __contains__(self, x):
  19. return self._flags.__contains__(x)
  20. def __iter__(self):
  21. return self._flags.__iter__()
  22. def __len__(self):
  23. return self._flags.__len__()
  24. def discard(self, value):
  25. return self._flags.discard(value)
  26. def add(self, value):
  27. if value not in self._valid_flags:
  28. raise ValueError("Unexpected flag: {}. Valid flags are: {}".format(value, self._valid_flags))
  29. return self._flags.add(value)