return field
-# Get the "effective" field of `field`. If `field` is a variant, return the
-# currently selected field. If `field` is of any other type, return `field`
+# Get the "effective" field of `field`. If `field` is a variant, return
+# the currently selected field. If `field` is an option, return the
+# content field. If `field` is of any other type, return `field`
# directly.
def _get_leaf_field(field):
- if not isinstance(field, _VariantField):
- return field
+ if isinstance(field, _VariantField):
+ return _get_leaf_field(field.selected_option)
- return _get_leaf_field(field.selected_option)
+ if isinstance(field, _OptionField):
+ return _get_leaf_field(field.field)
+
+ return field
class _Field(object._UniqueObject):
return self._spec_eq(other)
@property
- def field_class(self):
+ def cls(self):
field_class_ptr = native_bt.field_borrow_class_const(self._ptr)
assert field_class_ptr is not None
return bt2_field_class._create_field_class_from_ptr_and_get_ref(field_class_ptr)
return self._repr()
+class _BitArrayField(_Field):
+ _NAME = 'Bit array'
+
+ @property
+ def value_as_integer(self):
+ return native_bt.field_bit_array_get_value_as_integer(self._ptr)
+
+ @value_as_integer.setter
+ def value_as_integer(self, value):
+ utils._check_uint64(value)
+ native_bt.field_bit_array_set_value_as_integer(self._ptr, value)
+
+ def _spec_eq(self, other):
+ if type(other) is not type(self):
+ return False
+
+ return self.value_as_integer == other.value_as_integer
+
+ def _repr(self):
+ return repr(self.value_as_integer)
+
+ def __str__(self):
+ return str(self.value_as_integer)
+
+ def __len__(self):
+ return self.cls.length
+
+
@functools.total_ordering
class _NumericField(_Field):
@staticmethod
def _extract_value(other):
- if isinstance(other, bool):
- return other
+ if isinstance(other, _BoolField) or isinstance(other, bool):
+ return bool(other)
if isinstance(other, numbers.Integral):
return int(other)
return ~self._value
+class _BoolField(_IntegralField, _Field):
+ _NAME = 'Boolean'
+
+ def __bool__(self):
+ return self._value
+
+ def _value_to_bool(self, value):
+ if isinstance(value, _BoolField):
+ value = value._value
+
+ if not isinstance(value, bool):
+ raise TypeError(
+ "'{}' object is not a 'bool' or '_BoolField' object".format(
+ value.__class__
+ )
+ )
+
+ return value
+
+ @property
+ def _value(self):
+ return bool(native_bt.field_bool_get_value(self._ptr))
+
+ def _set_value(self, value):
+ value = self._value_to_bool(value)
+ native_bt.field_bool_set_value(self._ptr, value)
+
+ value = property(fset=_set_value)
+
+
class _IntegerField(_IntegralField, _Field):
pass
_NAME = 'Structure'
def _count(self):
- return len(self.field_class)
+ return len(self.cls)
def __setitem__(self, key, value):
# raises if key is somehow invalid
def __iter__(self):
# same name iterator
- return iter(self.field_class)
+ return iter(self.cls)
def _spec_eq(self, other):
if not isinstance(other, collections.abc.Mapping):
)
+class _OptionField(_Field):
+ _NAME = 'Option'
+
+ @property
+ def field(self):
+ field_ptr = native_bt.field_option_borrow_field_const(self._ptr)
+
+ if field_ptr is None:
+ return
+
+ return _create_field_from_ptr(
+ field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
+ )
+
+ @property
+ def has_field(self):
+ return self.field is not None
+
+ @has_field.setter
+ def has_field(self, value):
+ utils._check_bool(value)
+ native_bt.field_option_set_has_field(self._ptr, value)
+
+ def _spec_eq(self, other):
+ return _get_leaf_field(self) == other
+
+ def __bool__(self):
+ return self.has_field
+
+ def __str__(self):
+ return str(self.field)
+
+ def _repr(self):
+ return repr(self.field)
+
+ def _set_value(self, value):
+ self.has_field = True
+ field = self.field
+ assert field is not None
+ field.value = value
+
+ value = property(fset=_set_value)
+
+
class _VariantField(_ContainerField, _Field):
_NAME = 'Variant'
_TYPE_ID_TO_OBJ = {
+ native_bt.FIELD_CLASS_TYPE_BOOL: _BoolField,
+ native_bt.FIELD_CLASS_TYPE_BIT_ARRAY: _BitArrayField,
native_bt.FIELD_CLASS_TYPE_UNSIGNED_INTEGER: _UnsignedIntegerField,
native_bt.FIELD_CLASS_TYPE_SIGNED_INTEGER: _SignedIntegerField,
native_bt.FIELD_CLASS_TYPE_REAL: _RealField,
native_bt.FIELD_CLASS_TYPE_STRUCTURE: _StructureField,
native_bt.FIELD_CLASS_TYPE_STATIC_ARRAY: _StaticArrayField,
native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY: _DynamicArrayField,
+ native_bt.FIELD_CLASS_TYPE_OPTION: _OptionField,
native_bt.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: _VariantField,
native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: _VariantField,
native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: _VariantField,