sink.ctf.fs: write bit array field classes and fields
[babeltrace.git] / src / bindings / python / bt2 / bt2 / field.py
CommitLineData
81447b5b
PP
1# The MIT License (MIT)
2#
f6a5e476 3# Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
81447b5b
PP
4#
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:
11#
12# The above copyright notice and this permission notice shall be included in
13# all copies or substantial portions of the Software.
14#
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
21# THE SOFTWARE.
22
23from bt2 import native_bt, object, utils
c946c9de 24from bt2 import field_class as bt2_field_class
81447b5b
PP
25import collections.abc
26import functools
27import numbers
28import math
81447b5b
PP
29
30
27d97a3f
SM
31def _create_field_from_ptr(ptr, owner_ptr, owner_get_ref, owner_put_ref):
32 field_class_ptr = native_bt.field_borrow_class_const(ptr)
27d97a3f
SM
33 typeid = native_bt.field_class_get_type(field_class_ptr)
34 field = _TYPE_ID_TO_OBJ[typeid]._create_from_ptr_and_get_ref(
61d96b89
FD
35 ptr, owner_ptr, owner_get_ref, owner_put_ref
36 )
81447b5b
PP
37 return field
38
39
84eba0d9
PP
40# Get the "effective" field of `field`. If `field` is a variant, return
41# the currently selected field. If `field` is an option, return the
42# content field. If `field` is of any other type, return `field`
4470d3a6 43# directly.
81447b5b 44
61d96b89 45
4470d3a6 46def _get_leaf_field(field):
84eba0d9
PP
47 if isinstance(field, _VariantField):
48 return _get_leaf_field(field.selected_option)
4470d3a6 49
84eba0d9
PP
50 if isinstance(field, _OptionField):
51 return _get_leaf_field(field.field)
52
53 return field
81447b5b 54
80d037bc 55
4470d3a6
SM
56class _Field(object._UniqueObject):
57 def __eq__(self, other):
80d037bc
JG
58 other = _get_leaf_field(other)
59 return self._spec_eq(other)
60
81447b5b 61 @property
32656995 62 def field_class(self):
e8d2391b
SM
63 field_class_ptr = native_bt.field_borrow_class_const(self._ptr)
64 assert field_class_ptr is not None
c946c9de 65 return bt2_field_class._create_field_class_from_ptr_and_get_ref(field_class_ptr)
81447b5b 66
dc78ca2f
JG
67 def _repr(self):
68 raise NotImplementedError
69
70 def __repr__(self):
4470d3a6 71 return self._repr()
dc78ca2f 72
81447b5b
PP
73
74@functools.total_ordering
75class _NumericField(_Field):
76 @staticmethod
77 def _extract_value(other):
a07f15cb
PP
78 if isinstance(other, _BoolField) or isinstance(other, bool):
79 return bool(other)
81447b5b
PP
80
81 if isinstance(other, numbers.Integral):
82 return int(other)
83
84 if isinstance(other, numbers.Real):
85 return float(other)
86
87 if isinstance(other, numbers.Complex):
88 return complex(other)
89
61d96b89
FD
90 raise TypeError(
91 "'{}' object is not a number object".format(other.__class__.__name__)
92 )
81447b5b
PP
93
94 def __int__(self):
80d037bc 95 return int(self._value)
81447b5b
PP
96
97 def __float__(self):
80d037bc 98 return float(self._value)
81447b5b 99
dc78ca2f 100 def _repr(self):
e100fef0 101 return repr(self._value)
81447b5b
PP
102
103 def __lt__(self, other):
104 if not isinstance(other, numbers.Number):
61d96b89
FD
105 raise TypeError(
106 'unorderable types: {}() < {}()'.format(
107 self.__class__.__name__, other.__class__.__name__
108 )
109 )
81447b5b 110
5f953519 111 return self._value < self._extract_value(other)
81447b5b 112
80d037bc 113 def _spec_eq(self, other):
0bde7b52
PP
114 try:
115 return self._value == self._extract_value(other)
116 except:
117 return False
81447b5b
PP
118
119 def __rmod__(self, other):
80d037bc 120 return self._extract_value(other) % self._value
81447b5b
PP
121
122 def __mod__(self, other):
80d037bc 123 return self._value % self._extract_value(other)
81447b5b
PP
124
125 def __rfloordiv__(self, other):
80d037bc 126 return self._extract_value(other) // self._value
81447b5b
PP
127
128 def __floordiv__(self, other):
80d037bc 129 return self._value // self._extract_value(other)
81447b5b
PP
130
131 def __round__(self, ndigits=None):
132 if ndigits is None:
80d037bc 133 return round(self._value)
81447b5b 134 else:
80d037bc 135 return round(self._value, ndigits)
81447b5b
PP
136
137 def __ceil__(self):
80d037bc 138 return math.ceil(self._value)
81447b5b
PP
139
140 def __floor__(self):
80d037bc 141 return math.floor(self._value)
81447b5b
PP
142
143 def __trunc__(self):
80d037bc 144 return int(self._value)
81447b5b
PP
145
146 def __abs__(self):
80d037bc 147 return abs(self._value)
81447b5b
PP
148
149 def __add__(self, other):
80d037bc 150 return self._value + self._extract_value(other)
81447b5b
PP
151
152 def __radd__(self, other):
153 return self.__add__(other)
154
155 def __neg__(self):
80d037bc 156 return -self._value
81447b5b
PP
157
158 def __pos__(self):
80d037bc 159 return +self._value
81447b5b
PP
160
161 def __mul__(self, other):
80d037bc 162 return self._value * self._extract_value(other)
81447b5b
PP
163
164 def __rmul__(self, other):
165 return self.__mul__(other)
166
167 def __truediv__(self, other):
80d037bc 168 return self._value / self._extract_value(other)
81447b5b
PP
169
170 def __rtruediv__(self, other):
80d037bc 171 return self._extract_value(other) / self._value
81447b5b
PP
172
173 def __pow__(self, exponent):
80d037bc 174 return self._value ** self._extract_value(exponent)
81447b5b
PP
175
176 def __rpow__(self, base):
80d037bc 177 return self._extract_value(base) ** self._value
81447b5b 178
81447b5b
PP
179
180class _IntegralField(_NumericField, numbers.Integral):
181 def __lshift__(self, other):
80d037bc 182 return self._value << self._extract_value(other)
81447b5b
PP
183
184 def __rlshift__(self, other):
80d037bc 185 return self._extract_value(other) << self._value
81447b5b
PP
186
187 def __rshift__(self, other):
80d037bc 188 return self._value >> self._extract_value(other)
81447b5b
PP
189
190 def __rrshift__(self, other):
80d037bc 191 return self._extract_value(other) >> self._value
81447b5b
PP
192
193 def __and__(self, other):
80d037bc 194 return self._value & self._extract_value(other)
81447b5b
PP
195
196 def __rand__(self, other):
80d037bc 197 return self._extract_value(other) & self._value
81447b5b
PP
198
199 def __xor__(self, other):
80d037bc 200 return self._value ^ self._extract_value(other)
81447b5b
PP
201
202 def __rxor__(self, other):
80d037bc 203 return self._extract_value(other) ^ self._value
81447b5b
PP
204
205 def __or__(self, other):
80d037bc 206 return self._value | self._extract_value(other)
81447b5b
PP
207
208 def __ror__(self, other):
80d037bc 209 return self._extract_value(other) | self._value
81447b5b
PP
210
211 def __invert__(self):
80d037bc 212 return ~self._value
81447b5b 213
81447b5b 214
a07f15cb
PP
215class _BoolField(_IntegralField, _Field):
216 _NAME = 'Boolean'
217
218 def __bool__(self):
219 return self._value
220
221 def _value_to_bool(self, value):
222 if isinstance(value, _BoolField):
223 value = value._value
224
225 if not isinstance(value, bool):
226 raise TypeError(
227 "'{}' object is not a 'bool' or '_BoolField' object".format(
228 value.__class__
229 )
230 )
231
232 return value
233
234 @property
235 def _value(self):
236 return bool(native_bt.field_bool_get_value(self._ptr))
237
238 def _set_value(self, value):
239 value = self._value_to_bool(value)
240 native_bt.field_bool_set_value(self._ptr, value)
241
242 value = property(fset=_set_value)
243
244
27d97a3f 245class _IntegerField(_IntegralField, _Field):
81447b5b
PP
246 pass
247
248
27d97a3f
SM
249class _UnsignedIntegerField(_IntegerField, _Field):
250 _NAME = 'Unsigned integer'
4470d3a6 251
81447b5b 252 def _value_to_int(self, value):
e2cf9726
PP
253 if not isinstance(value, numbers.Integral):
254 raise TypeError('expecting an integral number object')
81447b5b
PP
255
256 value = int(value)
27d97a3f 257 utils._check_uint64(value)
81447b5b
PP
258
259 return value
260
261 @property
80d037bc 262 def _value(self):
60bbfc7c 263 return native_bt.field_integer_unsigned_get_value(self._ptr)
81447b5b 264
27d97a3f
SM
265 def _set_value(self, value):
266 value = self._value_to_int(value)
60bbfc7c 267 native_bt.field_integer_unsigned_set_value(self._ptr, value)
27d97a3f
SM
268
269 value = property(fset=_set_value)
270
271
272class _SignedIntegerField(_IntegerField, _Field):
273 _NAME = 'Signed integer'
4470d3a6 274
27d97a3f 275 def _value_to_int(self, value):
e2cf9726
PP
276 if not isinstance(value, numbers.Integral):
277 raise TypeError('expecting an integral number object')
80d037bc 278
27d97a3f
SM
279 value = int(value)
280 utils._check_int64(value)
f6a5e476 281
81447b5b
PP
282 return value
283
27d97a3f
SM
284 @property
285 def _value(self):
60bbfc7c 286 return native_bt.field_integer_signed_get_value(self._ptr)
27d97a3f 287
80d037bc 288 def _set_value(self, value):
81447b5b 289 value = self._value_to_int(value)
60bbfc7c 290 native_bt.field_integer_signed_set_value(self._ptr, value)
81447b5b 291
80d037bc 292 value = property(fset=_set_value)
81447b5b 293
5c8b3186 294
27d97a3f
SM
295class _RealField(_NumericField, numbers.Real):
296 _NAME = 'Real'
81447b5b
PP
297
298 def _value_to_float(self, value):
299 if not isinstance(value, numbers.Real):
300 raise TypeError("expecting a real number object")
301
302 return float(value)
303
304 @property
80d037bc 305 def _value(self):
27d97a3f 306 return native_bt.field_real_get_value(self._ptr)
81447b5b 307
80d037bc 308 def _set_value(self, value):
81447b5b 309 value = self._value_to_float(value)
27d97a3f 310 native_bt.field_real_set_value(self._ptr, value)
81447b5b 311
80d037bc 312 value = property(fset=_set_value)
81447b5b 313
5c8b3186 314
81447b5b 315class _EnumerationField(_IntegerField):
4470d3a6
SM
316 def _repr(self):
317 return '{} ({})'.format(self._value, ', '.join(self.labels))
81447b5b
PP
318
319 @property
4470d3a6 320 def labels(self):
fb25b9e3 321 status, labels = self._get_mapping_labels(self._ptr)
61d96b89 322 utils._handle_func_status(status, "cannot get label for enumeration field")
81447b5b 323
4470d3a6
SM
324 assert labels is not None
325 return labels
81447b5b 326
a310d6bd 327
4470d3a6
SM
328class _UnsignedEnumerationField(_EnumerationField, _UnsignedIntegerField):
329 _NAME = 'Unsigned Enumeration'
61d96b89 330 _get_mapping_labels = staticmethod(
60bbfc7c 331 native_bt.field_enumeration_unsigned_get_mapping_labels
61d96b89 332 )
80d037bc 333
80d037bc 334
4470d3a6
SM
335class _SignedEnumerationField(_EnumerationField, _SignedIntegerField):
336 _NAME = 'Signed Enumeration'
61d96b89 337 _get_mapping_labels = staticmethod(
60bbfc7c 338 native_bt.field_enumeration_signed_get_mapping_labels
61d96b89 339 )
81447b5b
PP
340
341
342@functools.total_ordering
4470d3a6 343class _StringField(_Field):
81447b5b
PP
344 _NAME = 'String'
345
346 def _value_to_str(self, value):
347 if isinstance(value, self.__class__):
80d037bc 348 value = value._value
81447b5b
PP
349
350 if not isinstance(value, str):
351 raise TypeError("expecting a 'str' object")
352
353 return value
354
355 @property
80d037bc 356 def _value(self):
4470d3a6 357 return native_bt.field_string_get_value(self._ptr)
81447b5b 358
80d037bc 359 def _set_value(self, value):
81447b5b 360 value = self._value_to_str(value)
4470d3a6 361 native_bt.field_string_set_value(self._ptr, value)
81447b5b 362
80d037bc
JG
363 value = property(fset=_set_value)
364
365 def _spec_eq(self, other):
81447b5b 366 try:
0bde7b52
PP
367 return self._value == self._value_to_str(other)
368 except:
81447b5b
PP
369 return False
370
81447b5b 371 def __lt__(self, other):
80d037bc 372 return self._value < self._value_to_str(other)
81447b5b
PP
373
374 def __bool__(self):
80d037bc 375 return bool(self._value)
81447b5b 376
dc78ca2f 377 def _repr(self):
89182b7e
JG
378 return repr(self._value)
379
81447b5b 380 def __str__(self):
4470d3a6 381 return str(self._value)
81447b5b
PP
382
383 def __getitem__(self, index):
80d037bc 384 return self._value[index]
81447b5b
PP
385
386 def __len__(self):
4470d3a6 387 return native_bt.field_string_get_length(self._ptr)
81447b5b
PP
388
389 def __iadd__(self, value):
390 value = self._value_to_str(value)
fb25b9e3 391 status = native_bt.field_string_append(self._ptr, value)
61d96b89
FD
392 utils._handle_func_status(
393 status, "cannot append to string field object's value"
394 )
81447b5b
PP
395 return self
396
397
398class _ContainerField(_Field):
399 def __bool__(self):
400 return len(self) != 0
401
402 def __len__(self):
403 count = self._count()
4470d3a6 404 assert count >= 0
81447b5b
PP
405 return count
406
407 def __delitem__(self, index):
408 raise NotImplementedError
409
410
411class _StructureField(_ContainerField, collections.abc.MutableMapping):
412 _NAME = 'Structure'
413
414 def _count(self):
32656995 415 return len(self.field_class)
81447b5b 416
81447b5b 417 def __setitem__(self, key, value):
f987e50a 418 # raises if key is somehow invalid
81447b5b
PP
419 field = self[key]
420
81447b5b
PP
421 # the field's property does the appropriate conversion or raises
422 # the appropriate exception
423 field.value = value
424
81447b5b
PP
425 def __iter__(self):
426 # same name iterator
32656995 427 return iter(self.field_class)
81447b5b 428
80d037bc 429 def _spec_eq(self, other):
0bde7b52
PP
430 if not isinstance(other, collections.abc.Mapping):
431 return False
81447b5b 432
0bde7b52
PP
433 if len(self) != len(other):
434 # early mismatch
435 return False
81447b5b 436
0bde7b52
PP
437 for self_key in self:
438 if self_key not in other:
439 return False
81447b5b 440
0bde7b52
PP
441 if self[self_key] != other[self_key]:
442 return False
80d037bc 443
0bde7b52 444 return True
81447b5b 445
80d037bc 446 def _set_value(self, values):
80d037bc
JG
447 try:
448 for key, value in values.items():
449 self[key].value = value
4470d3a6 450 except Exception:
80d037bc 451 raise
d5697082 452
80d037bc 453 value = property(fset=_set_value)
81447b5b 454
dc78ca2f 455 def _repr(self):
797f4a78
JG
456 items = ['{}: {}'.format(repr(k), repr(v)) for k, v in self.items()]
457 return '{{{}}}'.format(', '.join(items))
458
4470d3a6
SM
459 def __getitem__(self, key):
460 utils._check_str(key)
61d96b89
FD
461 field_ptr = native_bt.field_structure_borrow_member_field_by_name(
462 self._ptr, key
463 )
5c8b3186 464
4470d3a6
SM
465 if field_ptr is None:
466 raise KeyError(key)
81447b5b 467
61d96b89
FD
468 return _create_field_from_ptr(
469 field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
470 )
f6a5e476 471
4470d3a6
SM
472 def member_at_index(self, index):
473 utils._check_uint64(index)
f6a5e476 474
4470d3a6
SM
475 if index >= len(self):
476 raise IndexError
477
61d96b89
FD
478 field_ptr = native_bt.field_structure_borrow_member_field_by_index(
479 self._ptr, index
480 )
4470d3a6 481 assert field_ptr is not None
61d96b89
FD
482 return _create_field_from_ptr(
483 field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
484 )
4470d3a6
SM
485
486
84eba0d9
PP
487class _OptionField(_Field):
488 _NAME = 'Option'
489
490 @property
491 def field(self):
492 field_ptr = native_bt.field_option_borrow_field_const(self._ptr)
493
494 if field_ptr is None:
495 return
496
497 return _create_field_from_ptr(
498 field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
499 )
500
501 @property
502 def has_field(self):
503 return self.field is not None
504
505 @has_field.setter
506 def has_field(self, value):
507 utils._check_bool(value)
508 native_bt.field_option_set_has_field(self._ptr, value)
509
510 def _spec_eq(self, other):
511 return _get_leaf_field(self) == other
512
513 def __bool__(self):
514 return self.has_field
515
516 def __str__(self):
517 return str(self.field)
518
519 def _repr(self):
520 return repr(self.field)
521
522 def _set_value(self, value):
523 self.has_field = True
524 field = self.field
525 assert field is not None
526 field.value = value
527
528 value = property(fset=_set_value)
529
530
4470d3a6
SM
531class _VariantField(_ContainerField, _Field):
532 _NAME = 'Variant'
81447b5b
PP
533
534 @property
4470d3a6
SM
535 def selected_option_index(self):
536 return native_bt.field_variant_get_selected_option_field_index(self._ptr)
81447b5b 537
4470d3a6
SM
538 @selected_option_index.setter
539 def selected_option_index(self, index):
02b61fe0 540 native_bt.field_variant_select_option_field_by_index(self._ptr, index)
f6a5e476 541
4470d3a6
SM
542 @property
543 def selected_option(self):
100b6d91
SM
544 # TODO: Is there a way to check if the variant field has a selected_option,
545 # so we can raise an exception instead of hitting a pre-condition check?
546 # If there is something, that check should be added to selected_option_index too.
4470d3a6 547 field_ptr = native_bt.field_variant_borrow_selected_option_field(self._ptr)
81447b5b 548
61d96b89
FD
549 return _create_field_from_ptr(
550 field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
551 )
81447b5b 552
80d037bc 553 def _spec_eq(self, other):
0bde7b52 554 return _get_leaf_field(self) == other
f6a5e476
PP
555
556 def __bool__(self):
4470d3a6 557 raise NotImplementedError
81447b5b 558
dc78ca2f 559 def __str__(self):
4470d3a6 560 return str(self.selected_option)
dc78ca2f
JG
561
562 def _repr(self):
4470d3a6 563 return repr(self.selected_option)
80d037bc
JG
564
565 def _set_value(self, value):
4470d3a6 566 self.selected_option.value = value
80d037bc
JG
567
568 value = property(fset=_set_value)
81447b5b 569
5c8b3186 570
63631002 571class _ArrayField(_ContainerField, _Field, collections.abc.MutableSequence):
4470d3a6
SM
572 def _get_length(self):
573 return native_bt.field_array_get_length(self._ptr)
574
575 length = property(fget=_get_length)
576
81447b5b
PP
577 def __getitem__(self, index):
578 if not isinstance(index, numbers.Integral):
61d96b89
FD
579 raise TypeError(
580 "'{}' is not an integral number object: invalid index".format(
581 index.__class__.__name__
582 )
583 )
81447b5b
PP
584
585 index = int(index)
586
587 if index < 0 or index >= len(self):
588 raise IndexError('{} field object index is out of range'.format(self._NAME))
589
61d96b89
FD
590 field_ptr = native_bt.field_array_borrow_element_field_by_index(
591 self._ptr, index
592 )
593 assert field_ptr
594 return _create_field_from_ptr(
595 field_ptr, self._owner_ptr, self._owner_get_ref, self._owner_put_ref
596 )
81447b5b
PP
597
598 def __setitem__(self, index, value):
81447b5b
PP
599 # raises if index is somehow invalid
600 field = self[index]
601
602 if not isinstance(field, (_NumericField, _StringField)):
603 raise TypeError('can only set the value of a number or string field')
604
605 # the field's property does the appropriate conversion or raises
606 # the appropriate exception
607 field.value = value
608
609 def insert(self, index, value):
610 raise NotImplementedError
611
80d037bc 612 def _spec_eq(self, other):
0bde7b52
PP
613 if not isinstance(other, collections.abc.Sequence):
614 return False
d5697082 615
0bde7b52
PP
616 if len(self) != len(other):
617 # early mismatch
80d037bc 618 return False
d5697082 619
0bde7b52
PP
620 for self_elem, other_elem in zip(self, other):
621 if self_elem != other_elem:
622 return False
623
624 return True
625
dc78ca2f 626 def _repr(self):
7e06e400
JG
627 return '[{}]'.format(', '.join([repr(v) for v in self]))
628
81447b5b 629
4470d3a6
SM
630class _StaticArrayField(_ArrayField, _Field):
631 _NAME = 'Static array'
81447b5b
PP
632
633 def _count(self):
4470d3a6 634 return native_bt.field_array_get_length(self._ptr)
81447b5b 635
80d037bc
JG
636 def _set_value(self, values):
637 if len(self) != len(values):
61d96b89 638 raise ValueError('expected length of value and array field to match')
80d037bc 639
4470d3a6
SM
640 for index, value in enumerate(values):
641 if value is not None:
642 self[index].value = value
80d037bc
JG
643
644 value = property(fset=_set_value)
645
81447b5b 646
4470d3a6
SM
647class _DynamicArrayField(_ArrayField, _Field):
648 _NAME = 'Dynamic array'
81447b5b
PP
649
650 def _count(self):
4470d3a6 651 return self.length
81447b5b 652
4470d3a6
SM
653 def _set_length(self, length):
654 utils._check_uint64(length)
60bbfc7c 655 status = native_bt.field_array_dynamic_set_length(self._ptr, length)
fb25b9e3 656 utils._handle_func_status(status, "cannot set dynamic array length")
81447b5b 657
4470d3a6 658 length = property(fget=_ArrayField._get_length, fset=_set_length)
81447b5b 659
80d037bc 660 def _set_value(self, values):
4470d3a6
SM
661 if len(values) != self.length:
662 self.length = len(values)
80d037bc 663
4470d3a6
SM
664 for index, value in enumerate(values):
665 if value is not None:
666 self[index].value = value
80d037bc
JG
667
668 value = property(fset=_set_value)
81447b5b 669
5c8b3186 670
81447b5b 671_TYPE_ID_TO_OBJ = {
a07f15cb 672 native_bt.FIELD_CLASS_TYPE_BOOL: _BoolField,
27d97a3f
SM
673 native_bt.FIELD_CLASS_TYPE_UNSIGNED_INTEGER: _UnsignedIntegerField,
674 native_bt.FIELD_CLASS_TYPE_SIGNED_INTEGER: _SignedIntegerField,
675 native_bt.FIELD_CLASS_TYPE_REAL: _RealField,
4470d3a6
SM
676 native_bt.FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: _UnsignedEnumerationField,
677 native_bt.FIELD_CLASS_TYPE_SIGNED_ENUMERATION: _SignedEnumerationField,
27d97a3f
SM
678 native_bt.FIELD_CLASS_TYPE_STRING: _StringField,
679 native_bt.FIELD_CLASS_TYPE_STRUCTURE: _StructureField,
4470d3a6
SM
680 native_bt.FIELD_CLASS_TYPE_STATIC_ARRAY: _StaticArrayField,
681 native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY: _DynamicArrayField,
84eba0d9 682 native_bt.FIELD_CLASS_TYPE_OPTION: _OptionField,
02b61fe0
PP
683 native_bt.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: _VariantField,
684 native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: _VariantField,
685 native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: _VariantField,
81447b5b 686}
This page took 0.077874 seconds and 4 git commands to generate.