bt2: add bit array field class and field support
[babeltrace.git] / src / bindings / python / bt2 / bt2 / field.py
index 2406b90e89e432c4898b195c0da7eeaa67a7fb3e..512271bd95c9a055f6b6108be2035cb5344f043a 100644 (file)
@@ -37,16 +37,20 @@ def _create_field_from_ptr(ptr, owner_ptr, owner_get_ref, owner_put_ref):
     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):
@@ -67,6 +71,34 @@ class _Field(object._UniqueObject):
         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.field_class.length
+
+
 @functools.total_ordering
 class _NumericField(_Field):
     @staticmethod
@@ -480,6 +512,50 @@ class _StructureField(_ContainerField, collections.abc.MutableMapping):
         )
 
 
+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'
 
@@ -622,6 +698,7 @@ class _DynamicArrayField(_ArrayField, _Field):
 
 _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,
@@ -631,6 +708,7 @@ _TYPE_ID_TO_OBJ = {
     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,
This page took 0.026741 seconds and 4 git commands to generate.