X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Fbindings%2Fpython%2Fbt2%2Fbt2%2Ffield_class.py;h=03e6e4e3569c405dea401410da5e78f1a482a9fa;hp=d467bcc4129fa8a986fb3dc47054e3fd25e1f0ef;hb=f0a42b33ac3951cd5cb2ee0f66ac04437a681621;hpb=eddea57540fc76d56c8d38bdfc330c8b9f5b4961 diff --git a/src/bindings/python/bt2/bt2/field_class.py b/src/bindings/python/bt2/bt2/field_class.py index d467bcc4..03e6e4e3 100644 --- a/src/bindings/python/bt2/bt2/field_class.py +++ b/src/bindings/python/bt2/bt2/field_class.py @@ -28,9 +28,21 @@ from bt2 import value as bt2_value import bt2 -def _create_field_class_from_ptr_and_get_ref(ptr): +def _create_field_class_from_ptr_and_get_ref_template(type_map, ptr): typeid = native_bt.field_class_get_type(ptr) - return _FIELD_CLASS_TYPE_TO_OBJ[typeid]._create_from_ptr_and_get_ref(ptr) + return type_map[typeid]._create_from_ptr_and_get_ref(ptr) + + +def _create_field_class_from_ptr_and_get_ref(ptr): + return _create_field_class_from_ptr_and_get_ref_template( + _FIELD_CLASS_TYPE_TO_OBJ, ptr + ) + + +def _create_field_class_from_const_ptr_and_get_ref(ptr): + return _create_field_class_from_ptr_and_get_ref_template( + _FIELD_CLASS_TYPE_TO_CONST_OBJ, ptr + ) class IntegerDisplayBase: @@ -40,9 +52,15 @@ class IntegerDisplayBase: HEXADECIMAL = native_bt.FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL -class _FieldClass(object._SharedObject): +class _FieldClassConst(object._SharedObject): _get_ref = staticmethod(native_bt.field_class_get_ref) _put_ref = staticmethod(native_bt.field_class_put_ref) + _borrow_user_attributes_ptr = staticmethod( + native_bt.field_class_borrow_user_attributes_const + ) + _create_value_from_ptr_and_get_ref = staticmethod( + bt2_value._create_from_const_ptr_and_get_ref + ) def _check_create_status(self, ptr): if ptr is None: @@ -52,9 +70,18 @@ class _FieldClass(object._SharedObject): @property def user_attributes(self): - ptr = native_bt.field_class_borrow_user_attributes(self._ptr) + ptr = self._borrow_user_attributes_ptr(self._ptr) assert ptr is not None - return bt2_value._create_from_ptr_and_get_ref(ptr) + return self._create_value_from_ptr_and_get_ref(ptr) + + +class _FieldClass(_FieldClassConst): + _borrow_user_attributes_ptr = staticmethod( + native_bt.field_class_borrow_user_attributes + ) + _create_value_from_ptr_and_get_ref = staticmethod( + bt2_value._create_from_ptr_and_get_ref + ) def _user_attributes(self, user_attributes): value = bt2_value.create_value(user_attributes) @@ -64,12 +91,16 @@ class _FieldClass(object._SharedObject): _user_attributes = property(fset=_user_attributes) -class _BoolFieldClass(_FieldClass): +class _BoolFieldClassConst(_FieldClassConst): + _NAME = 'Const Boolean' + + +class _BoolFieldClass(_BoolFieldClassConst, _FieldClass): _NAME = 'Boolean' -class _BitArrayFieldClass(_FieldClass): - _NAME = 'Bit array' +class _BitArrayFieldClassConst(_FieldClassConst): + _NAME = 'Const Bit array' @property def length(self): @@ -78,13 +109,25 @@ class _BitArrayFieldClass(_FieldClass): return length -class _IntegerFieldClass(_FieldClass): +class _BitArrayFieldClass(_BitArrayFieldClassConst, _FieldClass): + _NAME = 'Bit array' + + +class _IntegerFieldClassConst(_FieldClassConst): @property def field_value_range(self): size = native_bt.field_class_integer_get_field_value_range(self._ptr) assert size >= 1 return size + @property + def preferred_display_base(self): + base = native_bt.field_class_integer_get_preferred_display_base(self._ptr) + assert base >= 0 + return base + + +class _IntegerFieldClass(_FieldClass, _IntegerFieldClassConst): def _field_value_range(self, size): if size < 1 or size > 64: raise ValueError("Value is outside valid range [1, 64] ({})".format(size)) @@ -92,12 +135,6 @@ class _IntegerFieldClass(_FieldClass): _field_value_range = property(fset=_field_value_range) - @property - def preferred_display_base(self): - base = native_bt.field_class_integer_get_preferred_display_base(self._ptr) - assert base >= 0 - return base - def _preferred_display_base(self, base): utils._check_uint64(base) @@ -114,21 +151,37 @@ class _IntegerFieldClass(_FieldClass): _preferred_display_base = property(fset=_preferred_display_base) -class _UnsignedIntegerFieldClass(_IntegerFieldClass): +class _UnsignedIntegerFieldClassConst(_IntegerFieldClassConst, _FieldClassConst): + _NAME = 'Const unsigned integer' + + +class _UnsignedIntegerFieldClass( + _UnsignedIntegerFieldClassConst, _IntegerFieldClass, _FieldClass +): _NAME = 'Unsigned integer' -class _SignedIntegerFieldClass(_IntegerFieldClass): +class _SignedIntegerFieldClassConst(_IntegerFieldClassConst, _FieldClassConst): + _NAME = 'Const signed integer' + + +class _SignedIntegerFieldClass( + _SignedIntegerFieldClassConst, _IntegerFieldClass, _FieldClass +): _NAME = 'Signed integer' -class _RealFieldClass(_FieldClass): - _NAME = 'Real' +class _RealFieldClassConst(_FieldClassConst): + _NAME = 'Const real' @property def is_single_precision(self): return native_bt.field_class_real_is_single_precision(self._ptr) + +class _RealFieldClass(_FieldClass, _RealFieldClassConst): + _NAME = 'Real' + def _is_single_precision(self, is_single_precision): utils._check_bool(is_single_precision) native_bt.field_class_real_set_is_single_precision( @@ -160,7 +213,7 @@ class _EnumerationFieldClassMapping: return self._ranges -class _UnsignedEnumerationFieldClassMapping(_EnumerationFieldClassMapping): +class _UnsignedEnumerationFieldClassMappingConst(_EnumerationFieldClassMapping): _ranges_type = bt2_integer_range_set.UnsignedIntegerRangeSet _as_enumeration_field_class_mapping_ptr = staticmethod( native_bt.field_class_enumeration_unsigned_mapping_as_mapping_const @@ -170,7 +223,7 @@ class _UnsignedEnumerationFieldClassMapping(_EnumerationFieldClassMapping): ) -class _SignedEnumerationFieldClassMapping(_EnumerationFieldClassMapping): +class _SignedEnumerationFieldClassMappingConst(_EnumerationFieldClassMapping): _ranges_type = bt2_integer_range_set.SignedIntegerRangeSet _as_enumeration_field_class_mapping_ptr = staticmethod( native_bt.field_class_enumeration_signed_mapping_as_mapping_const @@ -180,25 +233,15 @@ class _SignedEnumerationFieldClassMapping(_EnumerationFieldClassMapping): ) -class _EnumerationFieldClass(_IntegerFieldClass, collections.abc.Mapping): +class _EnumerationFieldClassConst(_IntegerFieldClassConst, collections.abc.Mapping): def __len__(self): count = native_bt.field_class_enumeration_get_mapping_count(self._ptr) assert count >= 0 return count - def add_mapping(self, label, ranges): - utils._check_str(label) - utils._check_type(ranges, self._range_set_type) - - if label in self: - raise ValueError("duplicate mapping label '{}'".format(label)) - - status = self._add_mapping(self._ptr, label, ranges._ptr) - utils._handle_func_status( - status, 'cannot add mapping to enumeration field class object' - ) - def mappings_for_value(self, value): + self._check_int_type(value) + status, labels = self._get_mapping_labels_for_value(self._ptr, value) utils._handle_func_status( status, 'cannot get mapping labels for value {}'.format(value) @@ -207,17 +250,31 @@ class _EnumerationFieldClass(_IntegerFieldClass, collections.abc.Mapping): def __iter__(self): for idx in range(len(self)): - mapping = self._get_mapping_by_index(self._ptr, idx) - yield mapping.label + mapping_ptr = self._borrow_mapping_ptr_by_index(self._ptr, idx) + yield self._mapping_pycls(mapping_ptr).label def __getitem__(self, label): utils._check_str(label) - mapping = self._get_mapping_by_label(self._ptr, label) + mapping_ptr = self._borrow_mapping_ptr_by_label(self._ptr, label) - if mapping is None: + if mapping_ptr is None: raise KeyError(label) - return mapping + return self._mapping_pycls(mapping_ptr) + + +class _EnumerationFieldClass(_EnumerationFieldClassConst, _IntegerFieldClass): + def add_mapping(self, label, ranges): + utils._check_str(label) + utils._check_type(ranges, self._range_set_type) + + if label in self: + raise ValueError("duplicate mapping label '{}'".format(label)) + + status = self._add_mapping(self._ptr, label, ranges._ptr) + utils._handle_func_status( + status, 'cannot add mapping to enumeration field class object' + ) def __iadd__(self, mappings): for label, ranges in mappings: @@ -226,77 +283,80 @@ class _EnumerationFieldClass(_IntegerFieldClass, collections.abc.Mapping): return self -class _UnsignedEnumerationFieldClass( - _EnumerationFieldClass, _UnsignedIntegerFieldClass +class _UnsignedEnumerationFieldClassConst( + _EnumerationFieldClassConst, _UnsignedIntegerFieldClassConst ): - _NAME = 'Unsigned enumeration' + _NAME = 'Const nsigned enumeration' _range_set_type = bt2_integer_range_set.UnsignedIntegerRangeSet - _add_mapping = staticmethod(native_bt.field_class_enumeration_unsigned_add_mapping) - - @staticmethod - def _get_mapping_by_index(enum_ptr, index): - mapping_ptr = native_bt.field_class_enumeration_unsigned_borrow_mapping_by_index_const( - enum_ptr, index - ) - assert mapping_ptr is not None - return _UnsignedEnumerationFieldClassMapping(mapping_ptr) + _borrow_mapping_ptr_by_label = staticmethod( + native_bt.field_class_enumeration_unsigned_borrow_mapping_by_label_const + ) + _borrow_mapping_ptr_by_index = staticmethod( + native_bt.field_class_enumeration_unsigned_borrow_mapping_by_index_const + ) + _mapping_pycls = property(lambda _: _UnsignedEnumerationFieldClassMappingConst) + _get_mapping_labels_for_value = staticmethod( + native_bt.field_class_enumeration_unsigned_get_mapping_labels_for_value + ) + _check_int_type = staticmethod(utils._check_uint64) - @staticmethod - def _get_mapping_by_label(enum_ptr, label): - mapping_ptr = native_bt.field_class_enumeration_unsigned_borrow_mapping_by_label_const( - enum_ptr, label - ) - if mapping_ptr is None: - return +class _UnsignedEnumerationFieldClass( + _UnsignedEnumerationFieldClassConst, + _EnumerationFieldClass, + _UnsignedIntegerFieldClass, +): + _NAME = 'Unsigned enumeration' + _add_mapping = staticmethod(native_bt.field_class_enumeration_unsigned_add_mapping) - return _UnsignedEnumerationFieldClassMapping(mapping_ptr) - @staticmethod - def _get_mapping_labels_for_value(enum_ptr, value): - utils._check_uint64(value) - return native_bt.field_class_enumeration_unsigned_get_mapping_labels_for_value( - enum_ptr, value - ) +class _SignedEnumerationFieldClassConst( + _EnumerationFieldClassConst, _SignedIntegerFieldClassConst +): + _NAME = 'Const signed enumeration' + _range_set_type = bt2_integer_range_set.SignedIntegerRangeSet + _borrow_mapping_ptr_by_label = staticmethod( + native_bt.field_class_enumeration_signed_borrow_mapping_by_label_const + ) + _borrow_mapping_ptr_by_index = staticmethod( + native_bt.field_class_enumeration_signed_borrow_mapping_by_index_const + ) + _mapping_pycls = property(lambda _: _SignedEnumerationFieldClassMappingConst) + _get_mapping_labels_for_value = staticmethod( + native_bt.field_class_enumeration_signed_get_mapping_labels_for_value + ) + _check_int_type = staticmethod(utils._check_int64) -class _SignedEnumerationFieldClass(_EnumerationFieldClass, _SignedIntegerFieldClass): +class _SignedEnumerationFieldClass( + _SignedEnumerationFieldClassConst, _EnumerationFieldClass, _SignedIntegerFieldClass +): _NAME = 'Signed enumeration' - _range_set_type = bt2_integer_range_set.SignedIntegerRangeSet _add_mapping = staticmethod(native_bt.field_class_enumeration_signed_add_mapping) - @staticmethod - def _get_mapping_by_index(enum_ptr, index): - mapping_ptr = native_bt.field_class_enumeration_signed_borrow_mapping_by_index_const( - enum_ptr, index - ) - assert mapping_ptr is not None - return _SignedEnumerationFieldClassMapping(mapping_ptr) - - @staticmethod - def _get_mapping_by_label(enum_ptr, label): - mapping_ptr = native_bt.field_class_enumeration_signed_borrow_mapping_by_label_const( - enum_ptr, label - ) - - if mapping_ptr is None: - return - return _SignedEnumerationFieldClassMapping(mapping_ptr) - - @staticmethod - def _get_mapping_labels_for_value(enum_ptr, value): - utils._check_int64(value) - return native_bt.field_class_enumeration_signed_get_mapping_labels_for_value( - enum_ptr, value - ) +class _StringFieldClassConst(_FieldClassConst): + _NAME = 'Const string' -class _StringFieldClass(_FieldClass): +class _StringFieldClass(_StringFieldClassConst, _FieldClass): _NAME = 'String' -class _StructureFieldClassMember: +class _StructureFieldClassMemberConst: + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_const_ptr_and_get_ref + ) + _borrow_field_class_ptr = staticmethod( + native_bt.field_class_structure_member_borrow_field_class_const + ) + _borrow_user_attributes_ptr = staticmethod( + native_bt.field_class_structure_member_borrow_user_attributes_const + ) + _create_value_from_ptr_and_get_ref = staticmethod( + bt2_value._create_from_const_ptr_and_get_ref + ) + def __init__(self, owning_struct_fc, member_ptr): # this field class owns the member; keeping it here maintains # the member alive as members are not shared objects @@ -311,17 +371,30 @@ class _StructureFieldClassMember: @property def field_class(self): - fc_ptr = native_bt.field_class_structure_member_borrow_field_class_const( - self._ptr - ) + fc_ptr = self._borrow_field_class_ptr(self._ptr) assert fc_ptr is not None - return _create_field_class_from_ptr_and_get_ref(fc_ptr) + return self._create_field_class_from_ptr_and_get_ref(fc_ptr) @property def user_attributes(self): - ptr = native_bt.field_class_structure_member_borrow_user_attributes(self._ptr) + ptr = self._borrow_user_attributes_ptr(self._ptr) assert ptr is not None - return bt2_value._create_from_ptr_and_get_ref(ptr) + return self._create_value_from_ptr_and_get_ref(ptr) + + +class _StructureFieldClassMember(_StructureFieldClassMemberConst): + _borrow_field_class_ptr = staticmethod( + native_bt.field_class_structure_member_borrow_field_class + ) + _borrow_user_attributes_ptr = staticmethod( + native_bt.field_class_structure_member_borrow_user_attributes + ) + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_ptr_and_get_ref + ) + _create_value_from_ptr_and_get_ref = staticmethod( + bt2_value._create_from_ptr_and_get_ref + ) def _user_attributes(self, user_attributes): value = bt2_value.create_value(user_attributes) @@ -333,8 +406,62 @@ class _StructureFieldClassMember: _user_attributes = property(fset=_user_attributes) -class _StructureFieldClass(_FieldClass, collections.abc.Mapping): +class _StructureFieldClassConst(_FieldClassConst, collections.abc.Mapping): + _NAME = 'Const structure' + _borrow_member_ptr_by_index = staticmethod( + native_bt.field_class_structure_borrow_member_by_index_const + ) + _borrow_member_ptr_by_name = staticmethod( + native_bt.field_class_structure_borrow_member_by_name_const + ) + _structure_member_field_class_pycls = property( + lambda _: _StructureFieldClassMemberConst + ) + + def __len__(self): + count = native_bt.field_class_structure_get_member_count(self._ptr) + assert count >= 0 + return count + + def __getitem__(self, key): + if not isinstance(key, str): + raise TypeError( + "key must be a 'str' object, got '{}'".format(key.__class__.__name__) + ) + + member_ptr = self._borrow_member_ptr_by_name(self._ptr, key) + + if member_ptr is None: + raise KeyError(key) + + return self._structure_member_field_class_pycls(self, member_ptr) + + def __iter__(self): + for idx in range(len(self)): + member_ptr = self._borrow_member_ptr_by_index(self._ptr, idx) + assert member_ptr is not None + yield native_bt.field_class_structure_member_get_name(member_ptr) + + def member_at_index(self, index): + utils._check_uint64(index) + + if index >= len(self): + raise IndexError + + member_ptr = self._borrow_member_ptr_by_index(self._ptr, index) + assert member_ptr is not None + return self._structure_member_field_class_pycls(self, member_ptr) + + +class _StructureFieldClass(_StructureFieldClassConst, _FieldClass): _NAME = 'Structure' + _borrow_member_by_index = staticmethod( + native_bt.field_class_structure_borrow_member_by_index + ) + _borrow_member_ptr_by_name = staticmethod( + native_bt.field_class_structure_borrow_member_by_name + ) + _structure_member_field_class_pycls = property(lambda _: _StructureFieldClassMember) def append_member(self, name, field_class, user_attributes=None): utils._check_str(name) @@ -359,72 +486,63 @@ class _StructureFieldClass(_FieldClass, collections.abc.Mapping): if user_attributes is not None: self[name]._user_attributes = user_attributes_value - def __len__(self): - count = native_bt.field_class_structure_get_member_count(self._ptr) - assert count >= 0 - return count - - def _create_member_from_ptr(self, member_ptr): - return _StructureFieldClassMember(self, member_ptr) - - def __getitem__(self, key): - if not isinstance(key, str): - raise TypeError( - "key must be a 'str' object, got '{}'".format(key.__class__.__name__) - ) - - member_ptr = native_bt.field_class_structure_borrow_member_by_name_const( - self._ptr, key - ) - - if member_ptr is None: - raise KeyError(key) - - return self._create_member_from_ptr(member_ptr) - - def __iter__(self): - for idx in range(len(self)): - member_ptr = native_bt.field_class_structure_borrow_member_by_index_const( - self._ptr, idx - ) - assert member_ptr is not None - yield native_bt.field_class_structure_member_get_name(member_ptr) - def __iadd__(self, members): for name, field_class in members: self.append_member(name, field_class) return self - def member_at_index(self, index): - utils._check_uint64(index) - - if index >= len(self): - raise IndexError - - member_ptr = native_bt.field_class_structure_borrow_member_by_index_const( - self._ptr, index - ) - assert member_ptr is not None - return self._create_member_from_ptr(member_ptr) +class _OptionFieldClassConst(_FieldClassConst): + _NAME = 'Const Option' + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_const_ptr_and_get_ref + ) + _borrow_field_class_ptr = staticmethod( + native_bt.field_class_option_borrow_field_class_const + ) + _borrow_selector_field_path = staticmethod( + native_bt.field_class_option_borrow_selector_field_path_const + ) -class _OptionFieldClass(_FieldClass): @property def field_class(self): - elem_fc_ptr = native_bt.field_class_option_borrow_field_class_const(self._ptr) - return _create_field_class_from_ptr_and_get_ref(elem_fc_ptr) + elem_fc_ptr = self._borrow_field_class_ptr(self._ptr) + return self._create_field_class_from_ptr_and_get_ref(elem_fc_ptr) @property def selector_field_path(self): - ptr = native_bt.field_class_option_borrow_selector_field_path_const(self._ptr) + ptr = self._borrow_selector_field_path(self._ptr) if ptr is None: return return bt2_field_path._FieldPath._create_from_ptr_and_get_ref(ptr) -class _VariantFieldClassOption: +class _OptionFieldClass(_OptionFieldClassConst, _FieldClass): + _NAME = 'Option' + _borrow_field_class_ptr = staticmethod( + native_bt.field_class_option_borrow_field_class + ) + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_ptr_and_get_ref + ) + + +class _VariantFieldClassOptionConst: + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_const_ptr_and_get_ref + ) + _borrow_field_class_ptr = staticmethod( + native_bt.field_class_variant_option_borrow_field_class_const + ) + _borrow_user_attributes_ptr = staticmethod( + native_bt.field_class_variant_option_borrow_user_attributes_const + ) + _create_value_from_ptr_and_get_ref = staticmethod( + bt2_value._create_from_const_ptr_and_get_ref + ) + def __init__(self, owning_var_fc, option_ptr): # this field class owns the option; keeping it here maintains # the option alive as options are not shared objects @@ -439,17 +557,30 @@ class _VariantFieldClassOption: @property def field_class(self): - fc_ptr = native_bt.field_class_variant_option_borrow_field_class_const( - self._ptr - ) + fc_ptr = self._borrow_field_class_ptr(self._ptr) assert fc_ptr is not None - return _create_field_class_from_ptr_and_get_ref(fc_ptr) + return self._create_field_class_from_ptr_and_get_ref(fc_ptr) @property def user_attributes(self): - ptr = native_bt.field_class_variant_option_borrow_user_attributes(self._ptr) + ptr = self._borrow_user_attributes_ptr(self._ptr) assert ptr is not None - return bt2_value._create_from_ptr_and_get_ref(ptr) + return self._create_value_from_ptr_and_get_ref(ptr) + + +class _VariantFieldClassOption(_VariantFieldClassOptionConst): + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_ptr_and_get_ref + ) + _borrow_field_class_ptr = staticmethod( + native_bt.field_class_variant_option_borrow_field_class + ) + _borrow_user_attributes_ptr = staticmethod( + native_bt.field_class_variant_option_borrow_user_attributes_const + ) + _create_value_from_ptr_and_get_ref = staticmethod( + bt2_value._create_from_ptr_and_get_ref + ) def _user_attributes(self, user_attributes): value = bt2_value.create_value(user_attributes) @@ -459,21 +590,78 @@ class _VariantFieldClassOption: _user_attributes = property(fset=_user_attributes) -class _VariantFieldClass(_FieldClass, collections.abc.Mapping): - _NAME = 'Variant' - _borrow_option_by_name_ptr = staticmethod( +class _VariantFieldClassWithSelectorOptionConst(_VariantFieldClassOptionConst): + def __init__(self, owning_var_fc, spec_opt_ptr): + self._spec_ptr = spec_opt_ptr + super().__init__(owning_var_fc, self._as_option_ptr(spec_opt_ptr)) + + @property + def ranges(self): + range_set_ptr = self._borrow_ranges_ptr(self._spec_ptr) + assert range_set_ptr is not None + return self._range_set_type._create_from_ptr_and_get_ref(range_set_ptr) + + +class _VariantFieldClassWithSelectorOption( + _VariantFieldClassWithSelectorOptionConst, _VariantFieldClassOption +): + pass + + +class _VariantFieldClassWithSignedSelectorOptionConst( + _VariantFieldClassWithSelectorOptionConst +): + _as_option_ptr = staticmethod( + native_bt.field_class_variant_with_selector_signed_option_as_option_const + ) + _borrow_ranges_ptr = staticmethod( + native_bt.field_class_variant_with_selector_signed_option_borrow_ranges_const + ) + _range_set_type = bt2_integer_range_set.SignedIntegerRangeSet + + +class _VariantFieldClassWithSignedSelectorOption( + _VariantFieldClassWithSignedSelectorOptionConst, + _VariantFieldClassWithSelectorOption, +): + pass + + +class _VariantFieldClassWithUnsignedSelectorOptionConst( + _VariantFieldClassWithSelectorOptionConst +): + _as_option_ptr = staticmethod( + native_bt.field_class_variant_with_selector_unsigned_option_as_option_const + ) + _borrow_ranges_ptr = staticmethod( + native_bt.field_class_variant_with_selector_unsigned_option_borrow_ranges_const + ) + _range_set_type = bt2_integer_range_set.UnsignedIntegerRangeSet + + +class _VariantFieldClassWithUnsignedSelectorOption( + _VariantFieldClassWithUnsignedSelectorOptionConst, + _VariantFieldClassWithSelectorOption, +): + pass + + +class _VariantFieldClassConst(_FieldClassConst, collections.abc.Mapping): + _NAME = 'Const Variant' + _borrow_option_ptr_by_name = staticmethod( native_bt.field_class_variant_borrow_option_by_name_const ) - _borrow_member_by_index_ptr = staticmethod( + _borrow_option_ptr_by_index = staticmethod( native_bt.field_class_variant_borrow_option_by_index_const ) + _variant_option_pycls = _VariantFieldClassOptionConst @staticmethod def _as_option_ptr(opt_ptr): return opt_ptr def _create_option_from_ptr(self, opt_ptr): - return _VariantFieldClassOption(self, opt_ptr) + return self._variant_option_pycls(self, opt_ptr) def __len__(self): count = native_bt.field_class_variant_get_option_count(self._ptr) @@ -486,7 +674,7 @@ class _VariantFieldClass(_FieldClass, collections.abc.Mapping): "key must be a 'str' object, got '{}'".format(key.__class__.__name__) ) - opt_ptr = self._borrow_option_by_name_ptr(self._ptr, key) + opt_ptr = self._borrow_option_ptr_by_name(self._ptr, key) if opt_ptr is None: raise KeyError(key) @@ -495,7 +683,7 @@ class _VariantFieldClass(_FieldClass, collections.abc.Mapping): def __iter__(self): for idx in range(len(self)): - opt_ptr = self._borrow_member_by_index_ptr(self._ptr, idx) + opt_ptr = self._borrow_option_ptr_by_index(self._ptr, idx) assert opt_ptr is not None base_opt_ptr = self._as_option_ptr(opt_ptr) yield native_bt.field_class_variant_option_get_name(base_opt_ptr) @@ -506,12 +694,29 @@ class _VariantFieldClass(_FieldClass, collections.abc.Mapping): if index >= len(self): raise IndexError - opt_ptr = self._borrow_member_by_index_ptr(self._ptr, index) + opt_ptr = self._borrow_option_ptr_by_index(self._ptr, index) assert opt_ptr is not None return self._create_option_from_ptr(opt_ptr) -class _VariantFieldClassWithoutSelector(_VariantFieldClass): +class _VariantFieldClass(_VariantFieldClassConst, _FieldClass, collections.abc.Mapping): + _NAME = 'Variant' + _borrow_option_ptr_by_name = staticmethod( + native_bt.field_class_variant_borrow_option_by_name + ) + _borrow_option_ptr_by_index = staticmethod( + native_bt.field_class_variant_borrow_option_by_index + ) + _variant_option_pycls = _VariantFieldClassOption + + +class _VariantFieldClassWithoutSelectorConst(_VariantFieldClassConst): + _NAME = 'Const Variant (without selector)' + + +class _VariantFieldClassWithoutSelector( + _VariantFieldClassWithoutSelectorConst, _VariantFieldClass +): _NAME = 'Variant (without selector)' def append_option(self, name, field_class, user_attributes=None): @@ -544,45 +749,8 @@ class _VariantFieldClassWithoutSelector(_VariantFieldClass): return self -class _VariantFieldClassWithSelectorOption(_VariantFieldClassOption): - def __init__(self, owning_var_fc, spec_opt_ptr): - self._spec_ptr = spec_opt_ptr - super().__init__(owning_var_fc, self._as_option_ptr(spec_opt_ptr)) - - @property - def ranges(self): - range_set_ptr = self._borrow_ranges_ptr(self._spec_ptr) - assert range_set_ptr is not None - return self._range_set_type._create_from_ptr_and_get_ref(range_set_ptr) - - -class _VariantFieldClassWithSignedSelectorOption(_VariantFieldClassWithSelectorOption): - _as_option_ptr = staticmethod( - native_bt.field_class_variant_with_selector_signed_option_as_option_const - ) - _borrow_ranges_ptr = staticmethod( - native_bt.field_class_variant_with_selector_signed_option_borrow_ranges_const - ) - _range_set_type = bt2_integer_range_set.SignedIntegerRangeSet - - -class _VariantFieldClassWithUnsignedSelectorOption( - _VariantFieldClassWithSelectorOption -): - _as_option_ptr = staticmethod( - native_bt.field_class_variant_with_selector_unsigned_option_as_option_const - ) - _borrow_ranges_ptr = staticmethod( - native_bt.field_class_variant_with_selector_unsigned_option_borrow_ranges_const - ) - _range_set_type = bt2_integer_range_set.UnsignedIntegerRangeSet - - -class _VariantFieldClassWithSelector(_VariantFieldClass): - _NAME = 'Variant (with selector)' - - def _create_option_from_ptr(self, opt_ptr): - return self._option_type(self, opt_ptr) +class _VariantFieldClassWithSelectorConst(_VariantFieldClassConst): + _NAME = 'Const Variant (with selector)' @property def selector_field_path(self): @@ -595,10 +763,16 @@ class _VariantFieldClassWithSelector(_VariantFieldClass): return bt2_field_path._FieldPath._create_from_ptr_and_get_ref(ptr) + +class _VariantFieldClassWithSelector( + _VariantFieldClassWithSelectorConst, _VariantFieldClass +): + _NAME = 'Variant (with selector)' + def append_option(self, name, field_class, ranges, user_attributes=None): utils._check_str(name) utils._check_type(field_class, _FieldClass) - utils._check_type(ranges, self._option_type._range_set_type) + utils._check_type(ranges, self._variant_option_pycls._range_set_type) if name in self: raise ValueError("duplicate option name '{}'".format(name)) @@ -629,52 +803,90 @@ class _VariantFieldClassWithSelector(_VariantFieldClass): return self -class _VariantFieldClassWithUnsignedSelector(_VariantFieldClassWithSelector): - _NAME = 'Variant (with unsigned selector)' - _borrow_option_by_name_ptr = staticmethod( +class _VariantFieldClassWithUnsignedSelectorConst(_VariantFieldClassWithSelectorConst): + _NAME = 'Const Variant (with unsigned selector)' + _borrow_option_ptr_by_name = staticmethod( native_bt.field_class_variant_with_selector_unsigned_borrow_option_by_name_const ) - _borrow_member_by_index_ptr = staticmethod( + _borrow_option_ptr_by_index = staticmethod( native_bt.field_class_variant_with_selector_unsigned_borrow_option_by_index_const ) _append_option = staticmethod( native_bt.field_class_variant_with_selector_unsigned_append_option ) - _option_type = _VariantFieldClassWithUnsignedSelectorOption - _as_option_ptr = staticmethod(_option_type._as_option_ptr) + _variant_option_pycls = _VariantFieldClassWithUnsignedSelectorOptionConst + _as_option_ptr = staticmethod(_variant_option_pycls._as_option_ptr) -class _VariantFieldClassWithSignedSelector(_VariantFieldClassWithSelector): - _NAME = 'Variant (with signed selector)' - _borrow_option_by_name_ptr = staticmethod( +class _VariantFieldClassWithUnsignedSelector( + _VariantFieldClassWithUnsignedSelectorConst, _VariantFieldClassWithSelector +): + _NAME = 'Variant (with unsigned selector)' + _variant_option_pycls = _VariantFieldClassWithUnsignedSelectorOption + _as_option_ptr = staticmethod(_variant_option_pycls._as_option_ptr) + + +class _VariantFieldClassWithSignedSelectorConst(_VariantFieldClassWithSelectorConst): + _NAME = 'Const Variant (with signed selector)' + _borrow_option_ptr_by_name = staticmethod( native_bt.field_class_variant_with_selector_signed_borrow_option_by_name_const ) - _borrow_member_by_index_ptr = staticmethod( + _borrow_option_ptr_by_index = staticmethod( native_bt.field_class_variant_with_selector_signed_borrow_option_by_index_const ) _append_option = staticmethod( native_bt.field_class_variant_with_selector_signed_append_option ) - _option_type = _VariantFieldClassWithSignedSelectorOption - _as_option_ptr = staticmethod(_option_type._as_option_ptr) + _variant_option_pycls = _VariantFieldClassWithSignedSelectorOptionConst + _as_option_ptr = staticmethod(_variant_option_pycls._as_option_ptr) + + +class _VariantFieldClassWithSignedSelector( + _VariantFieldClassWithSignedSelectorConst, _VariantFieldClassWithSelector +): + _NAME = 'Variant (with signed selector)' + _variant_option_pycls = _VariantFieldClassWithSignedSelectorOption + _as_option_ptr = staticmethod(_variant_option_pycls._as_option_ptr) -class _ArrayFieldClass(_FieldClass): +class _ArrayFieldClassConst(_FieldClassConst): + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_const_ptr_and_get_ref + ) + _borrow_element_field_class = staticmethod( + native_bt.field_class_array_borrow_element_field_class_const + ) + @property def element_field_class(self): - elem_fc_ptr = native_bt.field_class_array_borrow_element_field_class_const( - self._ptr - ) - return _create_field_class_from_ptr_and_get_ref(elem_fc_ptr) + elem_fc_ptr = self._borrow_element_field_class(self._ptr) + return self._create_field_class_from_ptr_and_get_ref(elem_fc_ptr) -class _StaticArrayFieldClass(_ArrayFieldClass): +class _ArrayFieldClass(_ArrayFieldClassConst, _FieldClass): + _create_field_class_from_ptr_and_get_ref = staticmethod( + _create_field_class_from_ptr_and_get_ref + ) + _borrow_element_field_class = staticmethod( + native_bt.field_class_array_borrow_element_field_class + ) + + +class _StaticArrayFieldClassConst(_ArrayFieldClassConst): + _NAME = 'Const static array' + @property def length(self): return native_bt.field_class_array_static_get_length(self._ptr) -class _DynamicArrayFieldClass(_ArrayFieldClass): +class _StaticArrayFieldClass(_StaticArrayFieldClassConst, _ArrayFieldClass): + _NAME = 'Static array' + + +class _DynamicArrayFieldClassConst(_ArrayFieldClassConst): + _NAME = 'Const dynamic array' + @property def length_field_path(self): ptr = native_bt.field_class_array_dynamic_borrow_length_field_path_const( @@ -686,6 +898,28 @@ class _DynamicArrayFieldClass(_ArrayFieldClass): return bt2_field_path._FieldPath._create_from_ptr_and_get_ref(ptr) +class _DynamicArrayFieldClass(_DynamicArrayFieldClassConst, _ArrayFieldClass): + _NAME = 'Dynamic Array' + + +_FIELD_CLASS_TYPE_TO_CONST_OBJ = { + native_bt.FIELD_CLASS_TYPE_BOOL: _BoolFieldClassConst, + native_bt.FIELD_CLASS_TYPE_BIT_ARRAY: _BitArrayFieldClassConst, + native_bt.FIELD_CLASS_TYPE_UNSIGNED_INTEGER: _UnsignedIntegerFieldClassConst, + native_bt.FIELD_CLASS_TYPE_SIGNED_INTEGER: _SignedIntegerFieldClassConst, + native_bt.FIELD_CLASS_TYPE_REAL: _RealFieldClassConst, + native_bt.FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: _UnsignedEnumerationFieldClassConst, + native_bt.FIELD_CLASS_TYPE_SIGNED_ENUMERATION: _SignedEnumerationFieldClassConst, + native_bt.FIELD_CLASS_TYPE_STRING: _StringFieldClassConst, + native_bt.FIELD_CLASS_TYPE_STRUCTURE: _StructureFieldClassConst, + native_bt.FIELD_CLASS_TYPE_STATIC_ARRAY: _StaticArrayFieldClassConst, + native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY: _DynamicArrayFieldClassConst, + native_bt.FIELD_CLASS_TYPE_OPTION: _OptionFieldClassConst, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: _VariantFieldClassWithoutSelectorConst, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: _VariantFieldClassWithUnsignedSelectorConst, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: _VariantFieldClassWithSignedSelectorConst, +} + _FIELD_CLASS_TYPE_TO_OBJ = { native_bt.FIELD_CLASS_TYPE_BOOL: _BoolFieldClass, native_bt.FIELD_CLASS_TYPE_BIT_ARRAY: _BitArrayFieldClass,