1 # The MIT License (MIT)
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 from bt2
import native_bt
, object, utils
24 import collections
.abc
25 from bt2
import field_path
as bt2_field_path
26 from bt2
import integer_range_set
as bt2_integer_range_set
27 from bt2
import value
as bt2_value
31 def _create_field_class_from_ptr_and_get_ref_template(type_map
, ptr
):
32 typeid
= native_bt
.field_class_get_type(ptr
)
33 return type_map
[typeid
]._create
_from
_ptr
_and
_get
_ref
(ptr
)
36 def _create_field_class_from_ptr_and_get_ref(ptr
):
37 return _create_field_class_from_ptr_and_get_ref_template(
38 _FIELD_CLASS_TYPE_TO_OBJ
, ptr
42 def _create_field_class_from_const_ptr_and_get_ref(ptr
):
43 return _create_field_class_from_ptr_and_get_ref_template(
44 _FIELD_CLASS_TYPE_TO_CONST_OBJ
, ptr
48 class IntegerDisplayBase
:
49 BINARY
= native_bt
.FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY
50 OCTAL
= native_bt
.FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL
51 DECIMAL
= native_bt
.FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL
52 HEXADECIMAL
= native_bt
.FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL
55 class _FieldClassConst(object._SharedObject
):
56 _get_ref
= staticmethod(native_bt
.field_class_get_ref
)
57 _put_ref
= staticmethod(native_bt
.field_class_put_ref
)
58 _borrow_user_attributes_ptr
= staticmethod(
59 native_bt
.field_class_borrow_user_attributes_const
61 _create_value_from_ptr_and_get_ref
= staticmethod(
62 bt2_value
._create
_from
_const
_ptr
_and
_get
_ref
65 def _check_create_status(self
, ptr
):
67 raise bt2
._MemoryError(
68 'cannot create {} field class object'.format(self
._NAME
.lower())
72 def user_attributes(self
):
73 ptr
= self
._borrow
_user
_attributes
_ptr
(self
._ptr
)
74 assert ptr
is not None
75 return self
._create
_value
_from
_ptr
_and
_get
_ref
(ptr
)
78 class _FieldClass(_FieldClassConst
):
79 _borrow_user_attributes_ptr
= staticmethod(
80 native_bt
.field_class_borrow_user_attributes
82 _create_value_from_ptr_and_get_ref
= staticmethod(
83 bt2_value
._create
_from
_ptr
_and
_get
_ref
86 def _user_attributes(self
, user_attributes
):
87 value
= bt2_value
.create_value(user_attributes
)
88 utils
._check
_type
(value
, bt2_value
.MapValue
)
89 native_bt
.field_class_set_user_attributes(self
._ptr
, value
._ptr
)
91 _user_attributes
= property(fset
=_user_attributes
)
94 class _BoolFieldClassConst(_FieldClassConst
):
95 _NAME
= 'Const Boolean'
98 class _BoolFieldClass(_BoolFieldClassConst
, _FieldClass
):
102 class _BitArrayFieldClassConst(_FieldClassConst
):
103 _NAME
= 'Const Bit array'
107 length
= native_bt
.field_class_bit_array_get_length(self
._ptr
)
112 class _BitArrayFieldClass(_BitArrayFieldClassConst
, _FieldClass
):
116 class _IntegerFieldClassConst(_FieldClassConst
):
118 def field_value_range(self
):
119 size
= native_bt
.field_class_integer_get_field_value_range(self
._ptr
)
124 def preferred_display_base(self
):
125 base
= native_bt
.field_class_integer_get_preferred_display_base(self
._ptr
)
130 class _IntegerFieldClass(_FieldClass
, _IntegerFieldClassConst
):
131 def _field_value_range(self
, size
):
132 if size
< 1 or size
> 64:
133 raise ValueError("Value is outside valid range [1, 64] ({})".format(size
))
134 native_bt
.field_class_integer_set_field_value_range(self
._ptr
, size
)
136 _field_value_range
= property(fset
=_field_value_range
)
138 def _preferred_display_base(self
, base
):
139 utils
._check
_uint
64(base
)
142 IntegerDisplayBase
.BINARY
,
143 IntegerDisplayBase
.OCTAL
,
144 IntegerDisplayBase
.DECIMAL
,
145 IntegerDisplayBase
.HEXADECIMAL
,
147 raise ValueError("Display base is not a valid IntegerDisplayBase value")
149 native_bt
.field_class_integer_set_preferred_display_base(self
._ptr
, base
)
151 _preferred_display_base
= property(fset
=_preferred_display_base
)
154 class _UnsignedIntegerFieldClassConst(_IntegerFieldClassConst
, _FieldClassConst
):
155 _NAME
= 'Const unsigned integer'
158 class _UnsignedIntegerFieldClass(
159 _UnsignedIntegerFieldClassConst
, _IntegerFieldClass
, _FieldClass
161 _NAME
= 'Unsigned integer'
164 class _SignedIntegerFieldClassConst(_IntegerFieldClassConst
, _FieldClassConst
):
165 _NAME
= 'Const signed integer'
168 class _SignedIntegerFieldClass(
169 _SignedIntegerFieldClassConst
, _IntegerFieldClass
, _FieldClass
171 _NAME
= 'Signed integer'
174 class _RealFieldClassConst(_FieldClassConst
):
178 def is_single_precision(self
):
179 return native_bt
.field_class_real_is_single_precision(self
._ptr
)
182 class _RealFieldClass(_FieldClass
, _RealFieldClassConst
):
185 def _is_single_precision(self
, is_single_precision
):
186 utils
._check
_bool
(is_single_precision
)
187 native_bt
.field_class_real_set_is_single_precision(
188 self
._ptr
, is_single_precision
191 _is_single_precision
= property(fset
=_is_single_precision
)
194 # an enumeration field class mapping does not have a reference count, so
195 # we copy the properties here to avoid eventual memory access errors.
196 class _EnumerationFieldClassMapping
:
197 def __init__(self
, mapping_ptr
):
198 base_mapping_ptr
= self
._as
_enumeration
_field
_class
_mapping
_ptr
(mapping_ptr
)
199 self
._label
= native_bt
.field_class_enumeration_mapping_get_label(
202 assert self
._label
is not None
203 ranges_ptr
= self
._mapping
_borrow
_ranges
_ptr
(mapping_ptr
)
204 assert ranges_ptr
is not None
205 self
._ranges
= self
._range
_set
_pycls
._create
_from
_ptr
_and
_get
_ref
(ranges_ptr
)
216 class _UnsignedEnumerationFieldClassMappingConst(_EnumerationFieldClassMapping
):
217 _range_set_pycls
= bt2_integer_range_set
.UnsignedIntegerRangeSet
218 _as_enumeration_field_class_mapping_ptr
= staticmethod(
219 native_bt
.field_class_enumeration_unsigned_mapping_as_mapping_const
221 _mapping_borrow_ranges_ptr
= staticmethod(
222 native_bt
.field_class_enumeration_unsigned_mapping_borrow_ranges_const
226 class _SignedEnumerationFieldClassMappingConst(_EnumerationFieldClassMapping
):
227 _range_set_pycls
= bt2_integer_range_set
.SignedIntegerRangeSet
228 _as_enumeration_field_class_mapping_ptr
= staticmethod(
229 native_bt
.field_class_enumeration_signed_mapping_as_mapping_const
231 _mapping_borrow_ranges_ptr
= staticmethod(
232 native_bt
.field_class_enumeration_signed_mapping_borrow_ranges_const
236 class _EnumerationFieldClassConst(_IntegerFieldClassConst
, collections
.abc
.Mapping
):
238 count
= native_bt
.field_class_enumeration_get_mapping_count(self
._ptr
)
242 def mappings_for_value(self
, value
):
243 self
._check
_int
_type
(value
)
245 status
, labels
= self
._get
_mapping
_labels
_for
_value
(self
._ptr
, value
)
246 utils
._handle
_func
_status
(
247 status
, 'cannot get mapping labels for value {}'.format(value
)
249 return [self
[label
] for label
in labels
]
252 for idx
in range(len(self
)):
253 mapping_ptr
= self
._borrow
_mapping
_ptr
_by
_index
(self
._ptr
, idx
)
254 yield self
._mapping
_pycls
(mapping_ptr
).label
256 def __getitem__(self
, label
):
257 utils
._check
_str
(label
)
258 mapping_ptr
= self
._borrow
_mapping
_ptr
_by
_label
(self
._ptr
, label
)
260 if mapping_ptr
is None:
261 raise KeyError(label
)
263 return self
._mapping
_pycls
(mapping_ptr
)
266 class _EnumerationFieldClass(_EnumerationFieldClassConst
, _IntegerFieldClass
):
267 def add_mapping(self
, label
, ranges
):
268 utils
._check
_str
(label
)
269 utils
._check
_type
(ranges
, self
._range
_set
_pycls
)
272 raise ValueError("duplicate mapping label '{}'".format(label
))
274 status
= self
._add
_mapping
(self
._ptr
, label
, ranges
._ptr
)
275 utils
._handle
_func
_status
(
276 status
, 'cannot add mapping to enumeration field class object'
279 def __iadd__(self
, mappings
):
280 for label
, ranges
in mappings
:
281 self
.add_mapping(label
, ranges
)
286 class _UnsignedEnumerationFieldClassConst(
287 _EnumerationFieldClassConst
, _UnsignedIntegerFieldClassConst
289 _NAME
= 'Const nsigned enumeration'
290 _range_set_pycls
= bt2_integer_range_set
.UnsignedIntegerRangeSet
291 _borrow_mapping_ptr_by_label
= staticmethod(
292 native_bt
.field_class_enumeration_unsigned_borrow_mapping_by_label_const
294 _borrow_mapping_ptr_by_index
= staticmethod(
295 native_bt
.field_class_enumeration_unsigned_borrow_mapping_by_index_const
297 _mapping_pycls
= property(lambda _
: _UnsignedEnumerationFieldClassMappingConst
)
298 _get_mapping_labels_for_value
= staticmethod(
299 native_bt
.field_class_enumeration_unsigned_get_mapping_labels_for_value
301 _check_int_type
= staticmethod(utils
._check
_uint
64)
304 class _UnsignedEnumerationFieldClass(
305 _UnsignedEnumerationFieldClassConst
,
306 _EnumerationFieldClass
,
307 _UnsignedIntegerFieldClass
,
309 _NAME
= 'Unsigned enumeration'
310 _add_mapping
= staticmethod(native_bt
.field_class_enumeration_unsigned_add_mapping
)
313 class _SignedEnumerationFieldClassConst(
314 _EnumerationFieldClassConst
, _SignedIntegerFieldClassConst
316 _NAME
= 'Const signed enumeration'
317 _range_set_pycls
= bt2_integer_range_set
.SignedIntegerRangeSet
318 _borrow_mapping_ptr_by_label
= staticmethod(
319 native_bt
.field_class_enumeration_signed_borrow_mapping_by_label_const
321 _borrow_mapping_ptr_by_index
= staticmethod(
322 native_bt
.field_class_enumeration_signed_borrow_mapping_by_index_const
324 _mapping_pycls
= property(lambda _
: _SignedEnumerationFieldClassMappingConst
)
325 _get_mapping_labels_for_value
= staticmethod(
326 native_bt
.field_class_enumeration_signed_get_mapping_labels_for_value
328 _check_int_type
= staticmethod(utils
._check
_int
64)
331 class _SignedEnumerationFieldClass(
332 _SignedEnumerationFieldClassConst
, _EnumerationFieldClass
, _SignedIntegerFieldClass
334 _NAME
= 'Signed enumeration'
335 _add_mapping
= staticmethod(native_bt
.field_class_enumeration_signed_add_mapping
)
338 class _StringFieldClassConst(_FieldClassConst
):
339 _NAME
= 'Const string'
342 class _StringFieldClass(_StringFieldClassConst
, _FieldClass
):
346 class _StructureFieldClassMemberConst
:
347 _create_field_class_from_ptr_and_get_ref
= staticmethod(
348 _create_field_class_from_const_ptr_and_get_ref
350 _borrow_field_class_ptr
= staticmethod(
351 native_bt
.field_class_structure_member_borrow_field_class_const
353 _borrow_user_attributes_ptr
= staticmethod(
354 native_bt
.field_class_structure_member_borrow_user_attributes_const
356 _create_value_from_ptr_and_get_ref
= staticmethod(
357 bt2_value
._create
_from
_const
_ptr
_and
_get
_ref
360 def __init__(self
, owning_struct_fc
, member_ptr
):
361 # this field class owns the member; keeping it here maintains
362 # the member alive as members are not shared objects
363 self
._owning
_struct
_fc
= owning_struct_fc
364 self
._ptr
= member_ptr
368 name
= native_bt
.field_class_structure_member_get_name(self
._ptr
)
369 assert name
is not None
373 def field_class(self
):
374 fc_ptr
= self
._borrow
_field
_class
_ptr
(self
._ptr
)
375 assert fc_ptr
is not None
376 return self
._create
_field
_class
_from
_ptr
_and
_get
_ref
(fc_ptr
)
379 def user_attributes(self
):
380 ptr
= self
._borrow
_user
_attributes
_ptr
(self
._ptr
)
381 assert ptr
is not None
382 return self
._create
_value
_from
_ptr
_and
_get
_ref
(ptr
)
385 class _StructureFieldClassMember(_StructureFieldClassMemberConst
):
386 _borrow_field_class_ptr
= staticmethod(
387 native_bt
.field_class_structure_member_borrow_field_class
389 _borrow_user_attributes_ptr
= staticmethod(
390 native_bt
.field_class_structure_member_borrow_user_attributes
392 _create_field_class_from_ptr_and_get_ref
= staticmethod(
393 _create_field_class_from_ptr_and_get_ref
395 _create_value_from_ptr_and_get_ref
= staticmethod(
396 bt2_value
._create
_from
_ptr
_and
_get
_ref
399 def _user_attributes(self
, user_attributes
):
400 value
= bt2_value
.create_value(user_attributes
)
401 utils
._check
_type
(value
, bt2_value
.MapValue
)
402 native_bt
.field_class_structure_member_set_user_attributes(
403 self
._ptr
, value
._ptr
406 _user_attributes
= property(fset
=_user_attributes
)
409 class _StructureFieldClassConst(_FieldClassConst
, collections
.abc
.Mapping
):
410 _NAME
= 'Const structure'
411 _borrow_member_ptr_by_index
= staticmethod(
412 native_bt
.field_class_structure_borrow_member_by_index_const
414 _borrow_member_ptr_by_name
= staticmethod(
415 native_bt
.field_class_structure_borrow_member_by_name_const
417 _structure_member_field_class_pycls
= property(
418 lambda _
: _StructureFieldClassMemberConst
422 count
= native_bt
.field_class_structure_get_member_count(self
._ptr
)
426 def __getitem__(self
, key
):
427 if not isinstance(key
, str):
429 "key must be a 'str' object, got '{}'".format(key
.__class
__.__name
__)
432 member_ptr
= self
._borrow
_member
_ptr
_by
_name
(self
._ptr
, key
)
434 if member_ptr
is None:
437 return self
._structure
_member
_field
_class
_pycls
(self
, member_ptr
)
440 for idx
in range(len(self
)):
441 member_ptr
= self
._borrow
_member
_ptr
_by
_index
(self
._ptr
, idx
)
442 assert member_ptr
is not None
443 yield native_bt
.field_class_structure_member_get_name(member_ptr
)
445 def member_at_index(self
, index
):
446 utils
._check
_uint
64(index
)
448 if index
>= len(self
):
451 member_ptr
= self
._borrow
_member
_ptr
_by
_index
(self
._ptr
, index
)
452 assert member_ptr
is not None
453 return self
._structure
_member
_field
_class
_pycls
(self
, member_ptr
)
456 class _StructureFieldClass(_StructureFieldClassConst
, _FieldClass
):
458 _borrow_member_by_index
= staticmethod(
459 native_bt
.field_class_structure_borrow_member_by_index
461 _borrow_member_ptr_by_name
= staticmethod(
462 native_bt
.field_class_structure_borrow_member_by_name
464 _structure_member_field_class_pycls
= property(lambda _
: _StructureFieldClassMember
)
466 def append_member(self
, name
, field_class
, user_attributes
=None):
467 utils
._check
_str
(name
)
468 utils
._check
_type
(field_class
, _FieldClass
)
471 raise ValueError("duplicate member name '{}'".format(name
))
473 user_attributes_value
= None
475 if user_attributes
is not None:
476 # check now that user attributes are valid
477 user_attributes_value
= bt2
.create_value(user_attributes
)
479 status
= native_bt
.field_class_structure_append_member(
480 self
._ptr
, name
, field_class
._ptr
482 utils
._handle
_func
_status
(
483 status
, 'cannot append member to structure field class object'
486 if user_attributes
is not None:
487 self
[name
]._user
_attributes
= user_attributes_value
489 def __iadd__(self
, members
):
490 for name
, field_class
in members
:
491 self
.append_member(name
, field_class
)
496 class _OptionFieldClassConst(_FieldClassConst
):
497 _NAME
= 'Const Option'
498 _create_field_class_from_ptr_and_get_ref
= staticmethod(
499 _create_field_class_from_const_ptr_and_get_ref
501 _borrow_field_class_ptr
= staticmethod(
502 native_bt
.field_class_option_borrow_field_class_const
504 _borrow_selector_field_path
= staticmethod(
505 native_bt
.field_class_option_borrow_selector_field_path_const
509 def field_class(self
):
510 elem_fc_ptr
= self
._borrow
_field
_class
_ptr
(self
._ptr
)
511 return self
._create
_field
_class
_from
_ptr
_and
_get
_ref
(elem_fc_ptr
)
514 def selector_field_path(self
):
515 ptr
= self
._borrow
_selector
_field
_path
(self
._ptr
)
519 return bt2_field_path
._FieldPath
._create
_from
_ptr
_and
_get
_ref
(ptr
)
522 class _OptionFieldClass(_OptionFieldClassConst
, _FieldClass
):
524 _borrow_field_class_ptr
= staticmethod(
525 native_bt
.field_class_option_borrow_field_class
527 _create_field_class_from_ptr_and_get_ref
= staticmethod(
528 _create_field_class_from_ptr_and_get_ref
532 class _VariantFieldClassOptionConst
:
533 _create_field_class_from_ptr_and_get_ref
= staticmethod(
534 _create_field_class_from_const_ptr_and_get_ref
536 _borrow_field_class_ptr
= staticmethod(
537 native_bt
.field_class_variant_option_borrow_field_class_const
539 _borrow_user_attributes_ptr
= staticmethod(
540 native_bt
.field_class_variant_option_borrow_user_attributes_const
542 _create_value_from_ptr_and_get_ref
= staticmethod(
543 bt2_value
._create
_from
_const
_ptr
_and
_get
_ref
546 def __init__(self
, owning_var_fc
, option_ptr
):
547 # this field class owns the option; keeping it here maintains
548 # the option alive as options are not shared objects
549 self
._owning
_var
_fc
= owning_var_fc
550 self
._ptr
= option_ptr
554 name
= native_bt
.field_class_variant_option_get_name(self
._ptr
)
555 assert name
is not None
559 def field_class(self
):
560 fc_ptr
= self
._borrow
_field
_class
_ptr
(self
._ptr
)
561 assert fc_ptr
is not None
562 return self
._create
_field
_class
_from
_ptr
_and
_get
_ref
(fc_ptr
)
565 def user_attributes(self
):
566 ptr
= self
._borrow
_user
_attributes
_ptr
(self
._ptr
)
567 assert ptr
is not None
568 return self
._create
_value
_from
_ptr
_and
_get
_ref
(ptr
)
571 class _VariantFieldClassOption(_VariantFieldClassOptionConst
):
572 _create_field_class_from_ptr_and_get_ref
= staticmethod(
573 _create_field_class_from_ptr_and_get_ref
575 _borrow_field_class_ptr
= staticmethod(
576 native_bt
.field_class_variant_option_borrow_field_class
578 _borrow_user_attributes_ptr
= staticmethod(
579 native_bt
.field_class_variant_option_borrow_user_attributes_const
581 _create_value_from_ptr_and_get_ref
= staticmethod(
582 bt2_value
._create
_from
_ptr
_and
_get
_ref
585 def _user_attributes(self
, user_attributes
):
586 value
= bt2_value
.create_value(user_attributes
)
587 utils
._check
_type
(value
, bt2_value
.MapValue
)
588 native_bt
.field_class_variant_option_set_user_attributes(self
._ptr
, value
._ptr
)
590 _user_attributes
= property(fset
=_user_attributes
)
593 class _VariantFieldClassWithSelectorOptionConst(_VariantFieldClassOptionConst
):
594 def __init__(self
, owning_var_fc
, spec_opt_ptr
):
595 self
._spec
_ptr
= spec_opt_ptr
596 super().__init
__(owning_var_fc
, self
._as
_option
_ptr
(spec_opt_ptr
))
600 range_set_ptr
= self
._borrow
_ranges
_ptr
(self
._spec
_ptr
)
601 assert range_set_ptr
is not None
602 return self
._range
_set
_pycls
._create
_from
_ptr
_and
_get
_ref
(range_set_ptr
)
605 class _VariantFieldClassWithSelectorOption(
606 _VariantFieldClassWithSelectorOptionConst
, _VariantFieldClassOption
611 class _VariantFieldClassWithSignedSelectorOptionConst(
612 _VariantFieldClassWithSelectorOptionConst
614 _as_option_ptr
= staticmethod(
615 native_bt
.field_class_variant_with_selector_signed_option_as_option_const
617 _borrow_ranges_ptr
= staticmethod(
618 native_bt
.field_class_variant_with_selector_signed_option_borrow_ranges_const
620 _range_set_pycls
= bt2_integer_range_set
.SignedIntegerRangeSet
623 class _VariantFieldClassWithSignedSelectorOption(
624 _VariantFieldClassWithSignedSelectorOptionConst
,
625 _VariantFieldClassWithSelectorOption
,
630 class _VariantFieldClassWithUnsignedSelectorOptionConst(
631 _VariantFieldClassWithSelectorOptionConst
633 _as_option_ptr
= staticmethod(
634 native_bt
.field_class_variant_with_selector_unsigned_option_as_option_const
636 _borrow_ranges_ptr
= staticmethod(
637 native_bt
.field_class_variant_with_selector_unsigned_option_borrow_ranges_const
639 _range_set_pycls
= bt2_integer_range_set
.UnsignedIntegerRangeSet
642 class _VariantFieldClassWithUnsignedSelectorOption(
643 _VariantFieldClassWithUnsignedSelectorOptionConst
,
644 _VariantFieldClassWithSelectorOption
,
649 class _VariantFieldClassConst(_FieldClassConst
, collections
.abc
.Mapping
):
650 _NAME
= 'Const Variant'
651 _borrow_option_ptr_by_name
= staticmethod(
652 native_bt
.field_class_variant_borrow_option_by_name_const
654 _borrow_option_ptr_by_index
= staticmethod(
655 native_bt
.field_class_variant_borrow_option_by_index_const
657 _variant_option_pycls
= _VariantFieldClassOptionConst
660 def _as_option_ptr(opt_ptr
):
663 def _create_option_from_ptr(self
, opt_ptr
):
664 return self
._variant
_option
_pycls
(self
, opt_ptr
)
667 count
= native_bt
.field_class_variant_get_option_count(self
._ptr
)
671 def __getitem__(self
, key
):
672 if not isinstance(key
, str):
674 "key must be a 'str' object, got '{}'".format(key
.__class
__.__name
__)
677 opt_ptr
= self
._borrow
_option
_ptr
_by
_name
(self
._ptr
, key
)
682 return self
._create
_option
_from
_ptr
(opt_ptr
)
685 for idx
in range(len(self
)):
686 opt_ptr
= self
._borrow
_option
_ptr
_by
_index
(self
._ptr
, idx
)
687 assert opt_ptr
is not None
688 base_opt_ptr
= self
._as
_option
_ptr
(opt_ptr
)
689 yield native_bt
.field_class_variant_option_get_name(base_opt_ptr
)
691 def option_at_index(self
, index
):
692 utils
._check
_uint
64(index
)
694 if index
>= len(self
):
697 opt_ptr
= self
._borrow
_option
_ptr
_by
_index
(self
._ptr
, index
)
698 assert opt_ptr
is not None
699 return self
._create
_option
_from
_ptr
(opt_ptr
)
702 class _VariantFieldClass(_VariantFieldClassConst
, _FieldClass
, collections
.abc
.Mapping
):
704 _borrow_option_ptr_by_name
= staticmethod(
705 native_bt
.field_class_variant_borrow_option_by_name
707 _borrow_option_ptr_by_index
= staticmethod(
708 native_bt
.field_class_variant_borrow_option_by_index
710 _variant_option_pycls
= _VariantFieldClassOption
713 class _VariantFieldClassWithoutSelectorConst(_VariantFieldClassConst
):
714 _NAME
= 'Const Variant (without selector)'
717 class _VariantFieldClassWithoutSelector(
718 _VariantFieldClassWithoutSelectorConst
, _VariantFieldClass
720 _NAME
= 'Variant (without selector)'
722 def append_option(self
, name
, field_class
, user_attributes
=None):
723 utils
._check
_str
(name
)
724 utils
._check
_type
(field_class
, _FieldClass
)
727 raise ValueError("duplicate option name '{}'".format(name
))
729 user_attributes_value
= None
731 if user_attributes
is not None:
732 # check now that user attributes are valid
733 user_attributes_value
= bt2
.create_value(user_attributes
)
735 status
= native_bt
.field_class_variant_without_selector_append_option(
736 self
._ptr
, name
, field_class
._ptr
738 utils
._handle
_func
_status
(
739 status
, 'cannot append option to variant field class object'
742 if user_attributes
is not None:
743 self
[name
]._user
_attributes
= user_attributes_value
745 def __iadd__(self
, options
):
746 for name
, field_class
in options
:
747 self
.append_option(name
, field_class
)
752 class _VariantFieldClassWithSelectorConst(_VariantFieldClassConst
):
753 _NAME
= 'Const Variant (with selector)'
756 def selector_field_path(self
):
757 ptr
= native_bt
.field_class_variant_with_selector_borrow_selector_field_path_const(
764 return bt2_field_path
._FieldPath
._create
_from
_ptr
_and
_get
_ref
(ptr
)
767 class _VariantFieldClassWithSelector(
768 _VariantFieldClassWithSelectorConst
, _VariantFieldClass
770 _NAME
= 'Variant (with selector)'
772 def append_option(self
, name
, field_class
, ranges
, user_attributes
=None):
773 utils
._check
_str
(name
)
774 utils
._check
_type
(field_class
, _FieldClass
)
775 utils
._check
_type
(ranges
, self
._variant
_option
_pycls
._range
_set
_pycls
)
778 raise ValueError("duplicate option name '{}'".format(name
))
781 raise ValueError('range set is empty')
783 user_attributes_value
= None
785 if user_attributes
is not None:
786 # check now that user attributes are valid
787 user_attributes_value
= bt2
.create_value(user_attributes
)
789 # TODO: check overlaps (precondition of self._append_option())
791 status
= self
._append
_option
(self
._ptr
, name
, field_class
._ptr
, ranges
._ptr
)
792 utils
._handle
_func
_status
(
793 status
, 'cannot append option to variant field class object'
796 if user_attributes
is not None:
797 self
[name
]._user
_attributes
= user_attributes_value
799 def __iadd__(self
, options
):
800 for name
, field_class
, ranges
in options
:
801 self
.append_option(name
, field_class
, ranges
)
806 class _VariantFieldClassWithUnsignedSelectorConst(_VariantFieldClassWithSelectorConst
):
807 _NAME
= 'Const Variant (with unsigned selector)'
808 _borrow_option_ptr_by_name
= staticmethod(
809 native_bt
.field_class_variant_with_selector_unsigned_borrow_option_by_name_const
811 _borrow_option_ptr_by_index
= staticmethod(
812 native_bt
.field_class_variant_with_selector_unsigned_borrow_option_by_index_const
814 _append_option
= staticmethod(
815 native_bt
.field_class_variant_with_selector_unsigned_append_option
817 _variant_option_pycls
= _VariantFieldClassWithUnsignedSelectorOptionConst
818 _as_option_ptr
= staticmethod(_variant_option_pycls
._as
_option
_ptr
)
821 class _VariantFieldClassWithUnsignedSelector(
822 _VariantFieldClassWithUnsignedSelectorConst
, _VariantFieldClassWithSelector
824 _NAME
= 'Variant (with unsigned selector)'
825 _variant_option_pycls
= _VariantFieldClassWithUnsignedSelectorOption
826 _as_option_ptr
= staticmethod(_variant_option_pycls
._as
_option
_ptr
)
829 class _VariantFieldClassWithSignedSelectorConst(_VariantFieldClassWithSelectorConst
):
830 _NAME
= 'Const Variant (with signed selector)'
831 _borrow_option_ptr_by_name
= staticmethod(
832 native_bt
.field_class_variant_with_selector_signed_borrow_option_by_name_const
834 _borrow_option_ptr_by_index
= staticmethod(
835 native_bt
.field_class_variant_with_selector_signed_borrow_option_by_index_const
837 _append_option
= staticmethod(
838 native_bt
.field_class_variant_with_selector_signed_append_option
840 _variant_option_pycls
= _VariantFieldClassWithSignedSelectorOptionConst
841 _as_option_ptr
= staticmethod(_variant_option_pycls
._as
_option
_ptr
)
844 class _VariantFieldClassWithSignedSelector(
845 _VariantFieldClassWithSignedSelectorConst
, _VariantFieldClassWithSelector
847 _NAME
= 'Variant (with signed selector)'
848 _variant_option_pycls
= _VariantFieldClassWithSignedSelectorOption
849 _as_option_ptr
= staticmethod(_variant_option_pycls
._as
_option
_ptr
)
852 class _ArrayFieldClassConst(_FieldClassConst
):
853 _create_field_class_from_ptr_and_get_ref
= staticmethod(
854 _create_field_class_from_const_ptr_and_get_ref
856 _borrow_element_field_class
= staticmethod(
857 native_bt
.field_class_array_borrow_element_field_class_const
861 def element_field_class(self
):
862 elem_fc_ptr
= self
._borrow
_element
_field
_class
(self
._ptr
)
863 return self
._create
_field
_class
_from
_ptr
_and
_get
_ref
(elem_fc_ptr
)
866 class _ArrayFieldClass(_ArrayFieldClassConst
, _FieldClass
):
867 _create_field_class_from_ptr_and_get_ref
= staticmethod(
868 _create_field_class_from_ptr_and_get_ref
870 _borrow_element_field_class
= staticmethod(
871 native_bt
.field_class_array_borrow_element_field_class
875 class _StaticArrayFieldClassConst(_ArrayFieldClassConst
):
876 _NAME
= 'Const static array'
880 return native_bt
.field_class_array_static_get_length(self
._ptr
)
883 class _StaticArrayFieldClass(_StaticArrayFieldClassConst
, _ArrayFieldClass
):
884 _NAME
= 'Static array'
887 class _DynamicArrayFieldClassConst(_ArrayFieldClassConst
):
888 _NAME
= 'Const dynamic array'
891 def length_field_path(self
):
892 ptr
= native_bt
.field_class_array_dynamic_borrow_length_field_path_const(
898 return bt2_field_path
._FieldPath
._create
_from
_ptr
_and
_get
_ref
(ptr
)
901 class _DynamicArrayFieldClass(_DynamicArrayFieldClassConst
, _ArrayFieldClass
):
902 _NAME
= 'Dynamic Array'
905 _FIELD_CLASS_TYPE_TO_CONST_OBJ
= {
906 native_bt
.FIELD_CLASS_TYPE_BOOL
: _BoolFieldClassConst
,
907 native_bt
.FIELD_CLASS_TYPE_BIT_ARRAY
: _BitArrayFieldClassConst
,
908 native_bt
.FIELD_CLASS_TYPE_UNSIGNED_INTEGER
: _UnsignedIntegerFieldClassConst
,
909 native_bt
.FIELD_CLASS_TYPE_SIGNED_INTEGER
: _SignedIntegerFieldClassConst
,
910 native_bt
.FIELD_CLASS_TYPE_REAL
: _RealFieldClassConst
,
911 native_bt
.FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
: _UnsignedEnumerationFieldClassConst
,
912 native_bt
.FIELD_CLASS_TYPE_SIGNED_ENUMERATION
: _SignedEnumerationFieldClassConst
,
913 native_bt
.FIELD_CLASS_TYPE_STRING
: _StringFieldClassConst
,
914 native_bt
.FIELD_CLASS_TYPE_STRUCTURE
: _StructureFieldClassConst
,
915 native_bt
.FIELD_CLASS_TYPE_STATIC_ARRAY
: _StaticArrayFieldClassConst
,
916 native_bt
.FIELD_CLASS_TYPE_DYNAMIC_ARRAY
: _DynamicArrayFieldClassConst
,
917 native_bt
.FIELD_CLASS_TYPE_OPTION
: _OptionFieldClassConst
,
918 native_bt
.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
: _VariantFieldClassWithoutSelectorConst
,
919 native_bt
.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
: _VariantFieldClassWithUnsignedSelectorConst
,
920 native_bt
.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
: _VariantFieldClassWithSignedSelectorConst
,
923 _FIELD_CLASS_TYPE_TO_OBJ
= {
924 native_bt
.FIELD_CLASS_TYPE_BOOL
: _BoolFieldClass
,
925 native_bt
.FIELD_CLASS_TYPE_BIT_ARRAY
: _BitArrayFieldClass
,
926 native_bt
.FIELD_CLASS_TYPE_UNSIGNED_INTEGER
: _UnsignedIntegerFieldClass
,
927 native_bt
.FIELD_CLASS_TYPE_SIGNED_INTEGER
: _SignedIntegerFieldClass
,
928 native_bt
.FIELD_CLASS_TYPE_REAL
: _RealFieldClass
,
929 native_bt
.FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
: _UnsignedEnumerationFieldClass
,
930 native_bt
.FIELD_CLASS_TYPE_SIGNED_ENUMERATION
: _SignedEnumerationFieldClass
,
931 native_bt
.FIELD_CLASS_TYPE_STRING
: _StringFieldClass
,
932 native_bt
.FIELD_CLASS_TYPE_STRUCTURE
: _StructureFieldClass
,
933 native_bt
.FIELD_CLASS_TYPE_STATIC_ARRAY
: _StaticArrayFieldClass
,
934 native_bt
.FIELD_CLASS_TYPE_DYNAMIC_ARRAY
: _DynamicArrayFieldClass
,
935 native_bt
.FIELD_CLASS_TYPE_OPTION
: _OptionFieldClass
,
936 native_bt
.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR
: _VariantFieldClassWithoutSelector
,
937 native_bt
.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR
: _VariantFieldClassWithUnsignedSelector
,
938 native_bt
.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR
: _VariantFieldClassWithSignedSelector
,