-class SelectableIntMappingMeta(type):
- @functools.total_ordering
- class Field(FieldSelectableInt):
- def __eq__(self, b):
- a = self.asint(msb0=True)
- return a.__eq__(b)
-
- def __lt__(self, b):
- a = self.asint(msb0=True)
- return a.__lt__(b)
-
- class FieldProperty:
- def __init__(self, field):
- self.__field = field
-
- def __get__(self, instance, owner):
- if instance is None:
- return self.__field
- res = FieldSelectableInt(si=instance, br=self.__field)
- print ("FieldProperty", res, type(res.br))
- return res.asint(msb0=True)
-
- class BitsProperty:
- def __init__(self, bits):
- self.__bits = bits
-
- def __get__(self, instance, owner):
- if instance is None:
- return self.__bits
- return instance.bits
-
- def __new__(metacls, name, bases, attrs, bits=None, fields=None):
- if fields is None:
- fields = {}
-
- def field(item):
- (key, value) = item
- if isinstance(value, dict):
- value = dict(map(field, value.items()))
- else:
- value = tuple(value)
- return (key, value)
-
- for (key, value) in map(field, fields.items()):
- attrs.setdefault(key, metacls.FieldProperty(value))
-
- if bits is None:
- for base in bases:
- bits = getattr(base, "bits", None)
- if bits is not None:
- break
-
- if not isinstance(bits, int):
- raise ValueError(bits)
- attrs.setdefault("bits", metacls.BitsProperty(bits))
-
- return super().__new__(metacls, name, bases, attrs)
-
- def __iter__(cls):
- for (key, value) in cls.__fields.items():
- yield (key, value)
-
-
-class SelectableIntMapping(SelectableInt, metaclass=SelectableIntMappingMeta,
- bits=0):
- def __init__(self, value=0, bits=None):
- if isinstance(value, int) and bits is None:
- bits = self.__class__.bits
- return super().__init__(value, bits)
-
-